@waku/rln 0.1.5-9901863.0 → 0.1.5-a824fff.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 (142) hide show
  1. package/bundle/index.js +2 -1
  2. package/bundle/packages/rln/dist/contract/constants.js +2 -1
  3. package/bundle/packages/rln/dist/contract/rln_base_contract.js +70 -65
  4. package/bundle/packages/rln/dist/contract/rln_contract.js +1 -1
  5. package/bundle/packages/rln/dist/credentials_manager.js +10 -28
  6. package/bundle/packages/rln/dist/identity.js +0 -8
  7. package/bundle/packages/rln/dist/keystore/keystore.js +28 -15
  8. package/bundle/packages/rln/dist/utils/metamask.js +2 -2
  9. package/bundle/packages/rln/dist/zerokit.js +5 -5
  10. package/dist/.tsbuildinfo +1 -1
  11. package/dist/contract/constants.d.ts +1 -1
  12. package/dist/contract/constants.js +1 -1
  13. package/dist/contract/constants.js.map +1 -1
  14. package/dist/contract/index.d.ts +1 -0
  15. package/dist/contract/index.js +1 -0
  16. package/dist/contract/index.js.map +1 -1
  17. package/dist/contract/rln_base_contract.d.ts +5 -11
  18. package/dist/contract/rln_base_contract.js +68 -63
  19. package/dist/contract/rln_base_contract.js.map +1 -1
  20. package/dist/contract/types.d.ts +5 -0
  21. package/dist/contract/types.js.map +1 -1
  22. package/dist/credentials_manager.d.ts +3 -9
  23. package/dist/credentials_manager.js +10 -28
  24. package/dist/credentials_manager.js.map +1 -1
  25. package/dist/identity.d.ts +0 -1
  26. package/dist/identity.js +0 -8
  27. package/dist/identity.js.map +1 -1
  28. package/dist/index.d.ts +2 -1
  29. package/dist/index.js +1 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/keystore/keystore.d.ts +1 -0
  32. package/dist/keystore/keystore.js +28 -15
  33. package/dist/keystore/keystore.js.map +1 -1
  34. package/dist/keystore/types.d.ts +2 -2
  35. package/dist/rln.js.map +1 -1
  36. package/dist/zerokit.d.ts +3 -3
  37. package/dist/zerokit.js +5 -5
  38. package/dist/zerokit.js.map +1 -1
  39. package/package.json +1 -1
  40. package/src/contract/constants.ts +1 -1
  41. package/src/contract/index.ts +1 -0
  42. package/src/contract/rln_base_contract.ts +100 -93
  43. package/src/contract/types.ts +5 -0
  44. package/src/credentials_manager.ts +10 -34
  45. package/src/identity.ts +0 -9
  46. package/src/index.ts +3 -1
  47. package/src/keystore/keystore.ts +54 -29
  48. package/src/keystore/types.ts +2 -2
  49. package/src/rln.ts +1 -0
  50. package/src/zerokit.ts +3 -3
  51. package/bundle/_virtual/__node-resolve_empty.js +0 -6
  52. package/bundle/_virtual/_node-resolve_empty.js +0 -3
  53. package/bundle/_virtual/bn.js +0 -3
  54. package/bundle/_virtual/common.js +0 -3
  55. package/bundle/_virtual/common2.js +0 -3
  56. package/bundle/_virtual/hash.js +0 -3
  57. package/bundle/_virtual/inherits_browser.js +0 -3
  58. package/bundle/_virtual/ripemd.js +0 -3
  59. package/bundle/_virtual/sha.js +0 -3
  60. package/bundle/_virtual/sha3.js +0 -3
  61. package/bundle/_virtual/utils3.js +0 -3
  62. package/bundle/node_modules/@ethersproject/abi/lib.esm/_version.js +0 -3
  63. package/bundle/node_modules/@ethersproject/abi/lib.esm/abi-coder.js +0 -96
  64. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js +0 -148
  65. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/address.js +0 -26
  66. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/anonymous.js +0 -20
  67. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/array.js +0 -210
  68. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/boolean.js +0 -18
  69. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/bytes.js +0 -30
  70. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/fixed-bytes.js +0 -26
  71. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/null.js +0 -22
  72. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/number.js +0 -43
  73. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/string.js +0 -19
  74. package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/tuple.js +0 -58
  75. package/bundle/node_modules/@ethersproject/abi/lib.esm/fragments.js +0 -854
  76. package/bundle/node_modules/@ethersproject/abi/lib.esm/interface.js +0 -609
  77. package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/_version.js +0 -3
  78. package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/index.js +0 -66
  79. package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/_version.js +0 -3
  80. package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/index.js +0 -302
  81. package/bundle/node_modules/@ethersproject/address/lib.esm/_version.js +0 -3
  82. package/bundle/node_modules/@ethersproject/address/lib.esm/index.js +0 -110
  83. package/bundle/node_modules/@ethersproject/base64/lib.esm/base64.js +0 -20
  84. package/bundle/node_modules/@ethersproject/basex/lib.esm/index.js +0 -120
  85. package/bundle/node_modules/@ethersproject/bignumber/lib.esm/_version.js +0 -3
  86. package/bundle/node_modules/@ethersproject/bignumber/lib.esm/bignumber.js +0 -287
  87. package/bundle/node_modules/@ethersproject/bytes/lib.esm/_version.js +0 -3
  88. package/bundle/node_modules/@ethersproject/bytes/lib.esm/index.js +0 -402
  89. package/bundle/node_modules/@ethersproject/constants/lib.esm/addresses.js +0 -3
  90. package/bundle/node_modules/@ethersproject/constants/lib.esm/bignumbers.js +0 -8
  91. package/bundle/node_modules/@ethersproject/constants/lib.esm/hashes.js +0 -3
  92. package/bundle/node_modules/@ethersproject/contracts/lib.esm/_version.js +0 -3
  93. package/bundle/node_modules/@ethersproject/contracts/lib.esm/index.js +0 -893
  94. package/bundle/node_modules/@ethersproject/hash/lib.esm/_version.js +0 -3
  95. package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/decoder.js +0 -256
  96. package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/include.js +0 -36
  97. package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/lib.js +0 -135
  98. package/bundle/node_modules/@ethersproject/hash/lib.esm/id.js +0 -8
  99. package/bundle/node_modules/@ethersproject/hash/lib.esm/namehash.js +0 -64
  100. package/bundle/node_modules/@ethersproject/hash/lib.esm/typed-data.js +0 -443
  101. package/bundle/node_modules/@ethersproject/keccak256/lib.esm/index.js +0 -8
  102. package/bundle/node_modules/@ethersproject/keccak256/node_modules/js-sha3/src/sha3.js +0 -660
  103. package/bundle/node_modules/@ethersproject/logger/lib.esm/_version.js +0 -3
  104. package/bundle/node_modules/@ethersproject/logger/lib.esm/index.js +0 -352
  105. package/bundle/node_modules/@ethersproject/networks/lib.esm/_version.js +0 -3
  106. package/bundle/node_modules/@ethersproject/networks/lib.esm/index.js +0 -248
  107. package/bundle/node_modules/@ethersproject/properties/lib.esm/_version.js +0 -3
  108. package/bundle/node_modules/@ethersproject/properties/lib.esm/index.js +0 -127
  109. package/bundle/node_modules/@ethersproject/providers/lib.esm/_version.js +0 -3
  110. package/bundle/node_modules/@ethersproject/providers/lib.esm/base-provider.js +0 -2007
  111. package/bundle/node_modules/@ethersproject/providers/lib.esm/formatter.js +0 -422
  112. package/bundle/node_modules/@ethersproject/providers/lib.esm/json-rpc-provider.js +0 -674
  113. package/bundle/node_modules/@ethersproject/providers/lib.esm/web3-provider.js +0 -132
  114. package/bundle/node_modules/@ethersproject/rlp/lib.esm/_version.js +0 -3
  115. package/bundle/node_modules/@ethersproject/rlp/lib.esm/index.js +0 -120
  116. package/bundle/node_modules/@ethersproject/sha2/lib.esm/sha2.js +0 -8
  117. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/_version.js +0 -3
  118. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/elliptic.js +0 -2430
  119. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/index.js +0 -76
  120. package/bundle/node_modules/@ethersproject/strings/lib.esm/_version.js +0 -3
  121. package/bundle/node_modules/@ethersproject/strings/lib.esm/utf8.js +0 -219
  122. package/bundle/node_modules/@ethersproject/transactions/lib.esm/_version.js +0 -3
  123. package/bundle/node_modules/@ethersproject/transactions/lib.esm/index.js +0 -279
  124. package/bundle/node_modules/@ethersproject/web/lib.esm/_version.js +0 -3
  125. package/bundle/node_modules/@ethersproject/web/lib.esm/geturl.js +0 -69
  126. package/bundle/node_modules/@ethersproject/web/lib.esm/index.js +0 -404
  127. package/bundle/node_modules/bech32/index.js +0 -187
  128. package/bundle/node_modules/bn.js/lib/bn.js +0 -3361
  129. package/bundle/node_modules/hash.js/lib/hash/common.js +0 -97
  130. package/bundle/node_modules/hash.js/lib/hash/hmac.js +0 -51
  131. package/bundle/node_modules/hash.js/lib/hash/ripemd.js +0 -152
  132. package/bundle/node_modules/hash.js/lib/hash/sha/1.js +0 -81
  133. package/bundle/node_modules/hash.js/lib/hash/sha/224.js +0 -33
  134. package/bundle/node_modules/hash.js/lib/hash/sha/256.js +0 -113
  135. package/bundle/node_modules/hash.js/lib/hash/sha/384.js +0 -39
  136. package/bundle/node_modules/hash.js/lib/hash/sha/512.js +0 -336
  137. package/bundle/node_modules/hash.js/lib/hash/sha/common.js +0 -53
  138. package/bundle/node_modules/hash.js/lib/hash/sha.js +0 -14
  139. package/bundle/node_modules/hash.js/lib/hash/utils.js +0 -282
  140. package/bundle/node_modules/hash.js/lib/hash.js +0 -33
  141. package/bundle/node_modules/inherits/inherits_browser.js +0 -33
  142. package/bundle/node_modules/minimalistic-assert/index.js +0 -13
package/bundle/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  export { RLNDecoder, RLNEncoder } from './packages/rln/dist/codec.js';
2
2
  export { RLN_ABI } from './packages/rln/dist/contract/abi.js';
3
3
  export { RLNContract } from './packages/rln/dist/contract/rln_contract.js';
4
- export { LINEA_CONTRACT } from './packages/rln/dist/contract/constants.js';
4
+ export { DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS } from './packages/rln/dist/contract/constants.js';
5
+ export { MembershipState } from './packages/rln/dist/contract/types.js';
5
6
  export { RLNBaseContract } from './packages/rln/dist/contract/rln_base_contract.js';
6
7
  export { createRLN } from './packages/rln/dist/create.js';
7
8
  export { RLNCredentialsManager } from './packages/rln/dist/credentials_manager.js';
@@ -1,7 +1,7 @@
1
1
  import { RLN_ABI } from './abi.js';
2
2
 
3
3
  const LINEA_CONTRACT = {
4
- chainId: "59141",
4
+ chainId: 59141,
5
5
  address: "0xb9cd878c90e49f797b4431fbf4fb333108cb90e6",
6
6
  abi: RLN_ABI
7
7
  };
@@ -12,6 +12,7 @@ const LINEA_CONTRACT = {
12
12
  */
13
13
  const RATE_LIMIT_TIERS = {
14
14
  LOW: 20, // Suggested minimum rate - 20 messages per epoch
15
+ MEDIUM: 200,
15
16
  HIGH: 600 // Suggested maximum rate - 600 messages per epoch
16
17
  };
17
18
  // Global rate limit parameters
@@ -16,8 +16,8 @@ import { Logger } from '../../../utils/dist/logger/index.js';
16
16
  import { RLN_ABI } from './abi.js';
17
17
  import { DEFAULT_RATE_LIMIT, RATE_LIMIT_PARAMS } from './constants.js';
18
18
  import { MembershipState } from './types.js';
19
- import { Contract } from '../../../../node_modules/@ethersproject/contracts/lib.esm/index.js';
20
- import { BigNumber } from '../../../../node_modules/@ethersproject/bignumber/lib.esm/bignumber.js';
19
+ import { Contract } from '@ethersproject/contracts';
20
+ import { BigNumber } from '@ethersproject/bignumber';
21
21
 
22
22
  const log = new Logger("waku:rln:contract:base");
23
23
  class RLNBaseContract {
@@ -33,6 +33,22 @@ class RLNBaseContract {
33
33
  * Allows injecting a mocked contract for testing purposes.
34
34
  */
35
35
  constructor(options) {
36
+ const { address, signer, rateLimit = DEFAULT_RATE_LIMIT, contract } = options;
37
+ log.info("Initializing RLNBaseContract", { address, rateLimit });
38
+ this.contract = contract || new Contract(address, RLN_ABI, signer);
39
+ this.rateLimit = rateLimit;
40
+ try {
41
+ log.info("Setting up event filters");
42
+ // Initialize event filters
43
+ this._membersFilter = this.contract.filters.MembershipRegistered();
44
+ this._membershipErasedFilter = this.contract.filters.MembershipErased();
45
+ this._membersExpiredFilter = this.contract.filters.MembershipExpired();
46
+ log.info("Event filters initialized successfully");
47
+ }
48
+ catch (error) {
49
+ log.error("Failed to initialize event filters", { error });
50
+ throw new Error("Failed to initialize event filters: " + error.message);
51
+ }
36
52
  // Initialize members and subscriptions
37
53
  this.fetchMembers()
38
54
  .then(() => {
@@ -41,14 +57,10 @@ class RLNBaseContract {
41
57
  .catch((error) => {
42
58
  log.error("Failed to initialize members", { error });
43
59
  });
44
- const { address, signer, rateLimit = DEFAULT_RATE_LIMIT, contract } = options;
45
- this.validateRateLimit(rateLimit);
46
- this.contract = contract || new Contract(address, RLN_ABI, signer);
47
- this.rateLimit = rateLimit;
48
- // Initialize event filters
49
- this._membersFilter = this.contract.filters.MembershipRegistered();
50
- this._membershipErasedFilter = this.contract.filters.MembershipErased();
51
- this._membersExpiredFilter = this.contract.filters.MembershipExpired();
60
+ // Validate rate limit asynchronously
61
+ this.validateRateLimit(rateLimit).catch((error) => {
62
+ log.error("Failed to validate initial rate limit", { error });
63
+ });
52
64
  }
53
65
  /**
54
66
  * Gets the current rate limit for this contract instance
@@ -116,7 +128,7 @@ class RLNBaseContract {
116
128
  * @param newRateLimit The new rate limit to use
117
129
  */
118
130
  async setRateLimit(newRateLimit) {
119
- this.validateRateLimit(newRateLimit);
131
+ await this.validateRateLimit(newRateLimit);
120
132
  this.rateLimit = newRateLimit;
121
133
  }
122
134
  get members() {
@@ -247,75 +259,63 @@ class RLNBaseContract {
247
259
  this.processEvents([event]);
248
260
  });
249
261
  }
250
- /**
251
- * Helper method to get remaining messages in current epoch
252
- * @param membershipId The ID of the membership to check
253
- * @returns number of remaining messages allowed in current epoch
254
- */
255
- async getRemainingMessages(membershipId) {
262
+ async getMembershipInfo(idCommitmentBigInt) {
256
263
  try {
257
- const [startTime, , rateLimit] = await this.contract.getMembershipInfo(membershipId);
258
- // Calculate current epoch
259
- const currentTime = Math.floor(Date.now() / 1000);
260
- const epochsPassed = Math.floor((currentTime - startTime) / RATE_LIMIT_PARAMS.EPOCH_LENGTH);
261
- const currentEpochStart = startTime + epochsPassed * RATE_LIMIT_PARAMS.EPOCH_LENGTH;
262
- // Get message count in current epoch using contract's function
263
- const messageCount = await this.contract.getMessageCount(membershipId, currentEpochStart);
264
- return Math.max(0, BigNumber.from(rateLimit)
265
- .sub(BigNumber.from(messageCount))
266
- .toNumber());
267
- }
268
- catch (error) {
269
- log.error(`Error getting remaining messages: ${error.message}`);
270
- return 0; // Fail safe: assume no messages remaining on error
271
- }
272
- }
273
- async getMembershipInfo(idCommitment) {
274
- try {
275
- const [startBlock, endBlock, rateLimit] = await this.contract.getMembershipInfo(idCommitment);
264
+ const membershipData = await this.contract.memberships(idCommitmentBigInt);
276
265
  const currentBlock = await this.contract.provider.getBlockNumber();
266
+ const [depositAmount, activeDuration, gracePeriodStartTimestamp, gracePeriodDuration, rateLimit, index, holder, token] = membershipData;
267
+ const gracePeriodEnd = gracePeriodStartTimestamp.add(gracePeriodDuration);
277
268
  let state;
278
- if (currentBlock < startBlock) {
269
+ if (currentBlock < gracePeriodStartTimestamp.toNumber()) {
279
270
  state = MembershipState.Active;
280
271
  }
281
- else if (currentBlock < endBlock) {
272
+ else if (currentBlock < gracePeriodEnd.toNumber()) {
282
273
  state = MembershipState.GracePeriod;
283
274
  }
284
275
  else {
285
276
  state = MembershipState.Expired;
286
277
  }
287
- const index = await this.getMemberIndex(idCommitment);
288
- if (!index)
289
- return undefined;
290
278
  return {
291
279
  index,
292
- idCommitment,
293
- rateLimit: rateLimit.toNumber(),
294
- startBlock: startBlock.toNumber(),
295
- endBlock: endBlock.toNumber(),
296
- state
280
+ idCommitment: idCommitmentBigInt.toString(),
281
+ rateLimit: Number(rateLimit),
282
+ startBlock: gracePeriodStartTimestamp.toNumber(),
283
+ endBlock: gracePeriodEnd.toNumber(),
284
+ state,
285
+ depositAmount,
286
+ activeDuration,
287
+ gracePeriodDuration,
288
+ holder,
289
+ token
297
290
  };
298
291
  }
299
292
  catch (error) {
293
+ log.error("Error in getMembershipInfo:", error);
300
294
  return undefined;
301
295
  }
302
296
  }
303
- async extendMembership(idCommitment) {
304
- return this.contract.extendMemberships([idCommitment]);
297
+ async extendMembership(idCommitmentBigInt) {
298
+ const tx = await this.contract.extendMemberships([idCommitmentBigInt]);
299
+ await tx.wait();
300
+ return tx;
305
301
  }
306
- async eraseMembership(idCommitment, eraseFromMembershipSet = true) {
307
- return this.contract.eraseMemberships([idCommitment], eraseFromMembershipSet);
302
+ async eraseMembership(idCommitmentBigInt, eraseFromMembershipSet = true) {
303
+ const estimatedGas = await this.contract.estimateGas["eraseMemberships(uint256[],bool)"]([idCommitmentBigInt], eraseFromMembershipSet);
304
+ const gasLimit = estimatedGas.add(10000);
305
+ const tx = await this.contract["eraseMemberships(uint256[],bool)"]([idCommitmentBigInt], eraseFromMembershipSet, { gasLimit });
306
+ await tx.wait();
307
+ return tx;
308
308
  }
309
- async registerMembership(idCommitment, rateLimit = DEFAULT_RATE_LIMIT) {
309
+ async registerMembership(idCommitmentBigInt, rateLimit = DEFAULT_RATE_LIMIT) {
310
310
  if (rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
311
311
  rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
312
312
  throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE}`);
313
313
  }
314
- return this.contract.register(idCommitment, rateLimit, []);
314
+ return this.contract.register(idCommitmentBigInt, rateLimit, []);
315
315
  }
316
- async withdraw(token, holder) {
316
+ async withdraw(token, from) {
317
317
  try {
318
- const tx = await this.contract.withdraw(token, { from: holder });
318
+ const tx = await this.contract.withdraw(token, from);
319
319
  await tx.wait();
320
320
  }
321
321
  catch (error) {
@@ -326,7 +326,7 @@ class RLNBaseContract {
326
326
  try {
327
327
  log.info(`Registering identity with rate limit: ${this.rateLimit} messages/epoch`);
328
328
  // Check if the ID commitment is already registered
329
- const existingIndex = await this.getMemberIndex(identity.IDCommitmentBigInt.toString());
329
+ const existingIndex = await this.getMemberIndex(identity.IDCommitmentBigInt);
330
330
  if (existingIndex) {
331
331
  throw new Error(`ID commitment is already registered with index ${existingIndex}`);
332
332
  }
@@ -356,12 +356,12 @@ class RLNBaseContract {
356
356
  `and rate limit ${decodedData.membershipRateLimit}`);
357
357
  const network = await this.contract.provider.getNetwork();
358
358
  const address = this.contract.address;
359
- const membershipId = decodedData.index.toString();
359
+ const membershipId = Number(decodedData.index);
360
360
  return {
361
361
  identity,
362
362
  membership: {
363
363
  address,
364
- treeIndex: parseInt(membershipId),
364
+ treeIndex: membershipId,
365
365
  chainId: network.chainId.toString(),
366
366
  rateLimit: decodedData.membershipRateLimit.toNumber()
367
367
  }
@@ -415,12 +415,12 @@ class RLNBaseContract {
415
415
  `Rate limit: ${decodedData.membershipRateLimit}, Erased ${idCommitmentsToErase.length} commitments`);
416
416
  const network = await this.contract.provider.getNetwork();
417
417
  const address = this.contract.address;
418
- const membershipId = decodedData.index.toString();
418
+ const membershipId = Number(decodedData.index);
419
419
  return {
420
420
  identity,
421
421
  membership: {
422
422
  address,
423
- treeIndex: parseInt(membershipId),
423
+ treeIndex: membershipId,
424
424
  chainId: network.chainId.toString(),
425
425
  rateLimit: decodedData.membershipRateLimit.toNumber()
426
426
  }
@@ -435,10 +435,15 @@ class RLNBaseContract {
435
435
  * Validates that the rate limit is within the allowed range
436
436
  * @throws Error if the rate limit is outside the allowed range
437
437
  */
438
- validateRateLimit(rateLimit) {
439
- if (rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
440
- rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
441
- throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE} messages per epoch`);
438
+ async validateRateLimit(rateLimit) {
439
+ const [minRate, maxRate] = await Promise.all([
440
+ this.contract.minMembershipRateLimit(),
441
+ this.contract.maxMembershipRateLimit()
442
+ ]);
443
+ const minRateNum = BigNumber.from(minRate).toNumber();
444
+ const maxRateNum = BigNumber.from(maxRate).toNumber();
445
+ if (rateLimit < minRateNum || rateLimit > maxRateNum) {
446
+ throw new Error(`Rate limit must be between ${minRateNum} and ${maxRateNum} messages per epoch`);
442
447
  }
443
448
  }
444
449
  get membersFilter() {
@@ -459,9 +464,9 @@ class RLNBaseContract {
459
464
  }
460
465
  return this._membersExpiredFilter;
461
466
  }
462
- async getMemberIndex(idCommitment) {
467
+ async getMemberIndex(idCommitmentBigInt) {
463
468
  try {
464
- const events = await this.contract.queryFilter(this.contract.filters.MembershipRegistered(idCommitment));
469
+ const events = await this.contract.queryFilter(this.contract.filters.MembershipRegistered(idCommitmentBigInt));
465
470
  if (events.length === 0)
466
471
  return undefined;
467
472
  // Get the most recent registration event
@@ -6,7 +6,7 @@ import { Logger } from '../../../utils/dist/logger/index.js';
6
6
  import { MerkleRootTracker } from '../root_tracker.js';
7
7
  import { zeroPadLE } from '../utils/bytes.js';
8
8
  import { RLNBaseContract } from './rln_base_contract.js';
9
- import { BigNumber } from '../../../../node_modules/@ethersproject/bignumber/lib.esm/bignumber.js';
9
+ import { BigNumber } from '@ethersproject/bignumber';
10
10
 
11
11
  const log = new Logger("waku:rln:contract");
12
12
  class RLNContract extends RLNBaseContract {
@@ -32,33 +32,15 @@ const log = new Logger("waku:credentials");
32
32
  class RLNCredentialsManager {
33
33
  started = false;
34
34
  starting = false;
35
- _contract;
36
- _signer;
35
+ contract;
36
+ signer;
37
37
  keystore = Keystore.create();
38
- _credentials;
38
+ credentials;
39
39
  zerokit;
40
40
  constructor(zerokit) {
41
41
  log.info("RLNCredentialsManager initialized");
42
42
  this.zerokit = zerokit;
43
43
  }
44
- get contract() {
45
- return this._contract;
46
- }
47
- set contract(contract) {
48
- this._contract = contract;
49
- }
50
- get signer() {
51
- return this._signer;
52
- }
53
- set signer(signer) {
54
- this._signer = signer;
55
- }
56
- get credentials() {
57
- return this._credentials;
58
- }
59
- set credentials(credentials) {
60
- this._credentials = credentials;
61
- }
62
44
  get provider() {
63
45
  return this.contract?.provider;
64
46
  }
@@ -80,12 +62,12 @@ class RLNCredentialsManager {
80
62
  this.keystore = keystore;
81
63
  log.info("Using provided keystore");
82
64
  }
83
- this._credentials = credentials;
84
- this._signer = signer;
85
- this._contract = new RLNBaseContract({
65
+ this.credentials = credentials;
66
+ this.signer = signer;
67
+ this.contract = new RLNBaseContract({
86
68
  address: address,
87
69
  signer: signer,
88
- rateLimit: rateLimit ?? this.zerokit?.getRateLimit
70
+ rateLimit: rateLimit ?? this.zerokit?.rateLimit
89
71
  });
90
72
  log.info("RLNCredentialsManager successfully started");
91
73
  this.started = true;
@@ -130,8 +112,8 @@ class RLNCredentialsManager {
130
112
  */
131
113
  async useCredentials(id, password) {
132
114
  log.info(`Attempting to use credentials with ID: ${id}`);
133
- this._credentials = await this.keystore?.readCredential(id, password);
134
- if (this._credentials) {
115
+ this.credentials = await this.keystore?.readCredential(id, password);
116
+ if (this.credentials) {
135
117
  log.info("Successfully loaded credentials");
136
118
  }
137
119
  else {
@@ -144,7 +126,7 @@ class RLNCredentialsManager {
144
126
  options.address ||
145
127
  LINEA_CONTRACT.address;
146
128
  if (address === LINEA_CONTRACT.address) {
147
- chainId = LINEA_CONTRACT.chainId;
129
+ chainId = LINEA_CONTRACT.chainId.toString();
148
130
  log.info(`Using Linea contract with chainId: ${chainId}`);
149
131
  }
150
132
  const signer = options.signer || (await extractMetaMaskSigner());
@@ -25,14 +25,6 @@ class IdentityCredential {
25
25
  const idCommitmentBigInt = buildBigIntFromUint8Array(idCommitment, 32);
26
26
  return new IdentityCredential(idTrapdoor, idNullifier, idSecretHash, idCommitment, idCommitmentBigInt);
27
27
  }
28
- toJSON() {
29
- return {
30
- idTrapdoor: Array.from(this.IDTrapdoor),
31
- idNullifier: Array.from(this.IDNullifier),
32
- idSecretHash: Array.from(this.IDSecretHash),
33
- idCommitment: Array.from(this.IDCommitment)
34
- };
35
- }
36
28
  }
37
29
 
38
30
  export { IdentityCredential };
@@ -17,7 +17,6 @@ import { Logger } from '../../../utils/dist/logger/index.js';
17
17
  import { sha256 } from '../../../../node_modules/ethereum-cryptography/esm/sha256.js';
18
18
  import { bytesToUtf8 } from '../../../../node_modules/ethereum-cryptography/esm/utils.js';
19
19
  import _ from '../../../../node_modules/lodash/lodash.js';
20
- import { IdentityCredential } from '../identity.js';
21
20
  import { buildBigIntFromUint8Array } from '../utils/bytes.js';
22
21
  import { keccak256Checksum, decryptEipKeystore } from './cipher.js';
23
22
  import { isKeystoreValid, isCredentialValid } from './schema_validator.js';
@@ -165,15 +164,15 @@ class Keystore {
165
164
  try {
166
165
  const str = bytesToUtf8(bytes);
167
166
  const obj = JSON.parse(str);
168
- // Get identity fields from named object
169
- const { idTrapdoor, idNullifier, idSecretHash, idCommitment } = _.get(obj, "identityCredential", {});
170
- const idTrapdoorArray = new Uint8Array(idTrapdoor || []);
171
- const idNullifierArray = new Uint8Array(idNullifier || []);
172
- const idSecretHashArray = new Uint8Array(idSecretHash || []);
173
- const idCommitmentArray = new Uint8Array(idCommitment || []);
174
- const idCommitmentBigInt = buildBigIntFromUint8Array(idCommitmentArray);
167
+ // TODO: add runtime validation of nwaku credentials
175
168
  return {
176
- identity: new IdentityCredential(idTrapdoorArray, idNullifierArray, idSecretHashArray, idCommitmentArray, idCommitmentBigInt),
169
+ identity: {
170
+ IDCommitment: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idCommitment", [])),
171
+ IDTrapdoor: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idTrapdoor", [])),
172
+ IDNullifier: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idNullifier", [])),
173
+ IDCommitmentBigInt: buildBigIntFromUint8Array(Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idCommitment", []))),
174
+ IDSecretHash: Keystore.fromArraylikeToBytes(_.get(obj, "identityCredential.idSecretHash", []))
175
+ },
177
176
  membership: {
178
177
  treeIndex: _.get(obj, "treeIndex"),
179
178
  chainId: _.get(obj, "membershipContract.chainId"),
@@ -187,6 +186,20 @@ class Keystore {
187
186
  return;
188
187
  }
189
188
  }
189
+ static fromArraylikeToBytes(obj) {
190
+ if (Array.isArray(obj)) {
191
+ return new Uint8Array(obj);
192
+ }
193
+ const bytes = [];
194
+ let index = 0;
195
+ let lastElement = obj[index];
196
+ while (lastElement !== undefined) {
197
+ bytes.push(lastElement);
198
+ index += 1;
199
+ lastElement = obj[index];
200
+ }
201
+ return new Uint8Array(bytes);
202
+ }
190
203
  // follows nwaku implementation
191
204
  // https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L111
192
205
  static computeMembershipHash(info) {
@@ -196,16 +209,16 @@ class Keystore {
196
209
  // https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L98
197
210
  static fromIdentityToBytes(options) {
198
211
  return utf8ToBytes(JSON.stringify({
199
- membershipContract: {
200
- chainId: options.membership.chainId,
201
- address: options.membership.address
202
- },
203
212
  treeIndex: options.membership.treeIndex,
204
213
  identityCredential: {
205
- idTrapdoor: Array.from(options.identity.IDTrapdoor),
214
+ idCommitment: Array.from(options.identity.IDCommitment),
206
215
  idNullifier: Array.from(options.identity.IDNullifier),
207
216
  idSecretHash: Array.from(options.identity.IDSecretHash),
208
- idCommitment: Array.from(options.identity.IDCommitment)
217
+ idTrapdoor: Array.from(options.identity.IDTrapdoor)
218
+ },
219
+ membershipContract: {
220
+ chainId: options.membership.chainId,
221
+ address: options.membership.address
209
222
  },
210
223
  userMessageLimit: options.membership.rateLimit
211
224
  }));
@@ -1,4 +1,4 @@
1
- import { Web3Provider } from '../../../../node_modules/@ethersproject/providers/lib.esm/web3-provider.js';
1
+ import * as providers from '@ethersproject/providers';
2
2
 
3
3
  const extractMetaMaskSigner = async () => {
4
4
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -7,7 +7,7 @@ const extractMetaMaskSigner = async () => {
7
7
  throw Error("Missing or invalid Ethereum provider. Please install a Web3 wallet such as MetaMask.");
8
8
  }
9
9
  await ethereum.request({ method: "eth_requestAccounts" });
10
- const provider = new Web3Provider(ethereum, "any");
10
+ const provider = new providers.Web3Provider(ethereum, "any");
11
11
  return provider.getSigner();
12
12
  };
13
13
 
@@ -8,11 +8,11 @@ import { epochIntToBytes, dateToEpoch } from './utils/epoch.js';
8
8
  class Zerokit {
9
9
  zkRLN;
10
10
  witnessCalculator;
11
- rateLimit;
12
- constructor(zkRLN, witnessCalculator, rateLimit = DEFAULT_RATE_LIMIT) {
11
+ _rateLimit;
12
+ constructor(zkRLN, witnessCalculator, _rateLimit = DEFAULT_RATE_LIMIT) {
13
13
  this.zkRLN = zkRLN;
14
14
  this.witnessCalculator = witnessCalculator;
15
- this.rateLimit = rateLimit;
15
+ this._rateLimit = _rateLimit;
16
16
  }
17
17
  get getZkRLN() {
18
18
  return this.zkRLN;
@@ -20,8 +20,8 @@ class Zerokit {
20
20
  get getWitnessCalculator() {
21
21
  return this.witnessCalculator;
22
22
  }
23
- get getRateLimit() {
24
- return this.rateLimit;
23
+ get rateLimit() {
24
+ return this._rateLimit;
25
25
  }
26
26
  generateIdentityCredentials() {
27
27
  const memKeys = generateExtendedMembershipKey(this.zkRLN); // TODO: rename this function in zerokit rln-wasm