@waku/rln 0.1.5-ff0222a.0 → 0.1.6-b7e9b08.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 (158) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/bundle/_virtual/index2.js +1 -1
  3. package/bundle/index.js +2 -2
  4. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/checksum.js +3 -3
  5. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/cipher.js +4 -4
  6. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/class.js +7 -7
  7. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/functional.js +7 -7
  8. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/index.js +6 -6
  9. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/kdf.js +5 -5
  10. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/password.js +1 -1
  11. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/schema-validation-generated.js +1 -1
  12. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/schema-validation.js +2 -2
  13. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/types.js +1 -1
  14. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/_assert.js +1 -1
  15. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/_sha2.js +3 -3
  16. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/_u64.js +1 -1
  17. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/cryptoBrowser.js +1 -1
  18. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/hmac.js +3 -3
  19. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/pbkdf2.js +4 -4
  20. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/scrypt.js +5 -5
  21. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/sha256.js +3 -3
  22. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/sha512.js +4 -4
  23. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/utils.js +2 -2
  24. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/aes.js +3 -3
  25. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/pbkdf2.js +7 -7
  26. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js +3 -3
  27. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/scrypt.js +3 -3
  28. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/sha256.js +3 -3
  29. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js +7 -7
  30. package/bundle/node_modules/@ethersproject/abi/lib.esm/_version.js +1 -1
  31. package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/_version.js +1 -1
  32. package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/_version.js +1 -1
  33. package/bundle/node_modules/@ethersproject/address/lib.esm/_version.js +1 -1
  34. package/bundle/node_modules/@ethersproject/bignumber/lib.esm/_version.js +1 -1
  35. package/bundle/node_modules/@ethersproject/contracts/lib.esm/_version.js +1 -1
  36. package/bundle/node_modules/@ethersproject/contracts/lib.esm/index.js +1 -1
  37. package/bundle/node_modules/@ethersproject/hash/lib.esm/_version.js +1 -1
  38. package/bundle/node_modules/@ethersproject/networks/lib.esm/_version.js +1 -1
  39. package/bundle/node_modules/@ethersproject/networks/lib.esm/index.js +19 -1
  40. package/bundle/node_modules/@ethersproject/properties/lib.esm/_version.js +1 -1
  41. package/bundle/node_modules/@ethersproject/providers/lib.esm/_version.js +1 -1
  42. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/_version.js +1 -1
  43. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/elliptic.js +58 -10
  44. package/bundle/node_modules/@ethersproject/strings/lib.esm/_version.js +1 -1
  45. package/bundle/node_modules/@ethersproject/transactions/lib.esm/_version.js +1 -1
  46. package/bundle/node_modules/@ethersproject/web/lib.esm/_version.js +1 -1
  47. package/bundle/node_modules/@noble/hashes/esm/_assert.js +6 -32
  48. package/bundle/node_modules/@noble/hashes/esm/_md.js +22 -11
  49. package/bundle/node_modules/@noble/hashes/esm/_u64.js +4 -3
  50. package/bundle/{packages/rln/node_modules → node_modules}/@noble/hashes/esm/hmac.js +19 -10
  51. package/bundle/{packages/rln/node_modules/@noble/hashes/esm/sha256.js → node_modules/@noble/hashes/esm/sha2.js} +36 -50
  52. package/bundle/node_modules/@noble/hashes/esm/sha256.js +5 -102
  53. package/bundle/node_modules/@noble/hashes/esm/sha3.js +30 -24
  54. package/bundle/node_modules/@noble/hashes/esm/utils.js +69 -18
  55. package/bundle/node_modules/bn.js/lib/bn.js +1 -0
  56. package/bundle/node_modules/ethereum-cryptography/esm/sha256.js +1 -1
  57. package/bundle/packages/core/dist/lib/connection_manager/connection_manager.js +3 -0
  58. package/bundle/packages/core/dist/lib/connection_manager/keep_alive_manager.js +3 -3
  59. package/bundle/packages/core/dist/lib/filter/filter.js +3 -0
  60. package/bundle/packages/core/dist/lib/light_push/light_push.js +3 -0
  61. package/bundle/packages/core/dist/lib/metadata/metadata.js +3 -0
  62. package/bundle/packages/core/dist/lib/store/store.js +3 -3
  63. package/bundle/packages/proto/dist/generated/sds_message.js +59 -3
  64. package/bundle/packages/rln/dist/codec.js +3 -3
  65. package/bundle/packages/rln/dist/contract/constants.js +1 -1
  66. package/bundle/packages/rln/dist/contract/{rln_light_contract.js → rln_base_contract.js} +180 -180
  67. package/bundle/packages/rln/dist/contract/rln_contract.js +12 -422
  68. package/bundle/packages/rln/dist/contract/types.js +9 -0
  69. package/bundle/packages/rln/dist/create.js +1 -1
  70. package/bundle/packages/rln/dist/credentials_manager.js +215 -0
  71. package/bundle/packages/rln/dist/identity.js +0 -9
  72. package/bundle/packages/rln/dist/keystore/cipher.js +3 -3
  73. package/bundle/packages/rln/dist/keystore/keystore.js +32 -18
  74. package/bundle/packages/rln/dist/rln.js +59 -169
  75. package/bundle/packages/rln/dist/utils/epoch.js +3 -3
  76. package/bundle/packages/rln/dist/zerokit.js +5 -5
  77. package/bundle/packages/utils/dist/common/sharding/index.js +4 -4
  78. package/bundle/packages/utils/node_modules/@waku/interfaces/dist/connection_manager.js +19 -0
  79. package/bundle/packages/utils/node_modules/@waku/interfaces/dist/health_indicator.js +12 -0
  80. package/bundle/packages/utils/node_modules/@waku/interfaces/dist/protocols.js +92 -0
  81. package/dist/.tsbuildinfo +1 -1
  82. package/dist/contract/constants.d.ts +1 -1
  83. package/dist/contract/constants.js +1 -1
  84. package/dist/contract/constants.js.map +1 -1
  85. package/dist/contract/{rln_light_contract.d.ts → rln_base_contract.d.ts} +25 -53
  86. package/dist/contract/{rln_light_contract.js → rln_base_contract.js} +177 -177
  87. package/dist/contract/rln_base_contract.js.map +1 -0
  88. package/dist/contract/rln_contract.d.ts +5 -122
  89. package/dist/contract/rln_contract.js +8 -417
  90. package/dist/contract/rln_contract.js.map +1 -1
  91. package/dist/contract/types.d.ts +40 -0
  92. package/dist/contract/types.js +8 -0
  93. package/dist/contract/types.js.map +1 -0
  94. package/dist/create.js +1 -1
  95. package/dist/create.js.map +1 -1
  96. package/dist/credentials_manager.d.ts +44 -0
  97. package/dist/credentials_manager.js +197 -0
  98. package/dist/credentials_manager.js.map +1 -0
  99. package/dist/identity.d.ts +0 -1
  100. package/dist/identity.js +0 -9
  101. package/dist/identity.js.map +1 -1
  102. package/dist/index.d.ts +3 -3
  103. package/dist/index.js +3 -3
  104. package/dist/index.js.map +1 -1
  105. package/dist/keystore/keystore.d.ts +1 -0
  106. package/dist/keystore/keystore.js +27 -13
  107. package/dist/keystore/keystore.js.map +1 -1
  108. package/dist/rln.d.ts +9 -52
  109. package/dist/rln.js +54 -163
  110. package/dist/rln.js.map +1 -1
  111. package/dist/types.d.ts +27 -0
  112. package/dist/types.js +2 -0
  113. package/dist/types.js.map +1 -0
  114. package/dist/zerokit.d.ts +3 -3
  115. package/dist/zerokit.js +5 -5
  116. package/dist/zerokit.js.map +1 -1
  117. package/package.json +1 -1
  118. package/src/contract/constants.ts +1 -1
  119. package/src/contract/{rln_light_contract.ts → rln_base_contract.ts} +294 -312
  120. package/src/contract/rln_contract.ts +9 -663
  121. package/src/contract/types.ts +48 -0
  122. package/src/create.ts +1 -1
  123. package/src/credentials_manager.ts +282 -0
  124. package/src/identity.ts +0 -10
  125. package/src/index.ts +4 -4
  126. package/src/keystore/keystore.ts +49 -25
  127. package/src/rln.ts +67 -258
  128. package/src/types.ts +31 -0
  129. package/src/zerokit.ts +3 -3
  130. package/bundle/packages/rln/dist/rln_light.js +0 -149
  131. package/bundle/packages/rln/node_modules/@noble/hashes/esm/_assert.js +0 -43
  132. package/bundle/packages/rln/node_modules/@noble/hashes/esm/_sha2.js +0 -116
  133. package/bundle/packages/rln/node_modules/@noble/hashes/esm/utils.js +0 -43
  134. package/dist/contract/rln_light_contract.js.map +0 -1
  135. package/dist/rln_light.d.ts +0 -64
  136. package/dist/rln_light.js +0 -144
  137. package/dist/rln_light.js.map +0 -1
  138. package/src/rln_light.ts +0 -235
  139. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/index.js +0 -0
  140. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/md5.js +0 -0
  141. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/nil.js +0 -0
  142. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/parse.js +0 -0
  143. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/regex.js +0 -0
  144. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/rng.js +0 -0
  145. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/sha1.js +0 -0
  146. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/stringify.js +0 -0
  147. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v1.js +0 -0
  148. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v3.js +0 -0
  149. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v35.js +0 -0
  150. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v4.js +0 -0
  151. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v5.js +0 -0
  152. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/validate.js +0 -0
  153. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/version.js +0 -0
  154. /package/bundle/{packages/rln/node_modules → node_modules}/uuid/dist/esm-browser/native.js +0 -0
  155. /package/bundle/{packages/rln/node_modules → node_modules}/uuid/dist/esm-browser/rng.js +0 -0
  156. /package/bundle/{packages/rln/node_modules → node_modules}/uuid/dist/esm-browser/stringify.js +0 -0
  157. /package/bundle/{packages/rln/node_modules → node_modules}/uuid/dist/esm-browser/v4.js +0 -0
  158. /package/bundle/packages/{interfaces → utils/node_modules/@waku/interfaces}/dist/constants.js +0 -0
@@ -1,56 +1,20 @@
1
1
  import { ethers } from "ethers";
2
- import type { IdentityCredential } from "../identity.js";
3
- import type { DecryptedCredentials } from "../keystore/index.js";
4
- type Member = {
5
- idCommitment: string;
6
- index: ethers.BigNumber;
7
- };
8
- interface RLNContractOptions {
9
- signer: ethers.Signer;
10
- address: string;
11
- rateLimit?: number;
12
- }
13
- interface RLNContractInitOptions extends RLNContractOptions {
14
- contract?: ethers.Contract;
15
- }
16
- export interface MembershipRegisteredEvent {
17
- idCommitment: string;
18
- membershipRateLimit: ethers.BigNumber;
19
- index: ethers.BigNumber;
20
- }
21
- type FetchMembersOptions = {
22
- fromBlock?: number;
23
- fetchRange?: number;
24
- fetchChunks?: number;
25
- };
26
- export interface MembershipInfo {
27
- index: ethers.BigNumber;
28
- idCommitment: string;
29
- rateLimit: number;
30
- startBlock: number;
31
- endBlock: number;
32
- state: MembershipState;
33
- }
34
- export declare enum MembershipState {
35
- Active = "Active",
36
- GracePeriod = "GracePeriod",
37
- Expired = "Expired",
38
- ErasedAwaitsWithdrawal = "ErasedAwaitsWithdrawal"
39
- }
40
- export declare class RLNLightContract {
2
+ import { IdentityCredential } from "../identity.js";
3
+ import { DecryptedCredentials } from "../keystore/types.js";
4
+ import { CustomQueryOptions, FetchMembersOptions, Member, MembershipInfo, RLNContractInitOptions } from "./types.js";
5
+ export declare class RLNBaseContract {
41
6
  contract: ethers.Contract;
42
7
  private deployBlock;
43
8
  private rateLimit;
44
- private _members;
9
+ protected _members: Map<number, Member>;
45
10
  private _membersFilter;
46
11
  private _membershipErasedFilter;
47
12
  private _membersExpiredFilter;
48
13
  /**
49
- * Asynchronous initializer for RLNContract.
14
+ * Constructor for RLNBaseContract.
50
15
  * Allows injecting a mocked contract for testing purposes.
51
16
  */
52
- static init(options: RLNContractInitOptions): Promise<RLNLightContract>;
53
- private constructor();
17
+ constructor(options: RLNContractInitOptions);
54
18
  /**
55
19
  * Gets the current rate limit for this contract instance
56
20
  */
@@ -94,19 +58,25 @@ export declare class RLNLightContract {
94
58
  */
95
59
  setRateLimit(newRateLimit: number): Promise<void>;
96
60
  get members(): Member[];
97
- private get membersFilter();
98
- private get membershipErasedFilter();
99
- private get membersExpiredFilter();
100
61
  fetchMembers(options?: FetchMembersOptions): Promise<void>;
62
+ static queryFilter(contract: ethers.Contract, options: CustomQueryOptions): Promise<ethers.Event[]>;
101
63
  processEvents(events: ethers.Event[]): void;
64
+ static splitToChunks(from: number, to: number, step: number): Array<[number, number]>;
65
+ static takeN<T>(array: T[], size: number): Iterable<T[]>;
66
+ static ignoreErrors<T>(promise: Promise<T>, defaultValue: T): Promise<T>;
102
67
  subscribeToMembers(): void;
103
- registerWithIdentity(identity: IdentityCredential): Promise<DecryptedCredentials | undefined>;
104
68
  /**
105
69
  * Helper method to get remaining messages in current epoch
106
70
  * @param membershipId The ID of the membership to check
107
71
  * @returns number of remaining messages allowed in current epoch
108
72
  */
109
73
  getRemainingMessages(membershipId: number): Promise<number>;
74
+ getMembershipInfo(idCommitment: string): Promise<MembershipInfo | undefined>;
75
+ extendMembership(idCommitment: string): Promise<ethers.ContractTransaction>;
76
+ eraseMembership(idCommitment: string, eraseFromMembershipSet?: boolean): Promise<ethers.ContractTransaction>;
77
+ registerMembership(idCommitment: string, rateLimit?: number): Promise<ethers.ContractTransaction>;
78
+ withdraw(token: string, holder: string): Promise<void>;
79
+ registerWithIdentity(identity: IdentityCredential): Promise<DecryptedCredentials | undefined>;
110
80
  registerWithPermitAndErase(identity: IdentityCredential, permit: {
111
81
  owner: string;
112
82
  deadline: number;
@@ -114,11 +84,13 @@ export declare class RLNLightContract {
114
84
  r: string;
115
85
  s: string;
116
86
  }, idCommitmentsToErase: string[]): Promise<DecryptedCredentials | undefined>;
117
- withdraw(token: string, holder: string): Promise<void>;
118
- getMembershipInfo(idCommitment: string): Promise<MembershipInfo | undefined>;
119
- extendMembership(idCommitment: string): Promise<ethers.ContractTransaction>;
120
- eraseMembership(idCommitment: string, eraseFromMembershipSet?: boolean): Promise<ethers.ContractTransaction>;
121
- registerMembership(idCommitment: string, rateLimit?: number): Promise<ethers.ContractTransaction>;
87
+ /**
88
+ * Validates that the rate limit is within the allowed range
89
+ * @throws Error if the rate limit is outside the allowed range
90
+ */
91
+ private validateRateLimit;
92
+ private get membersFilter();
93
+ private get membershipErasedFilter();
94
+ private get membersExpiredFilter();
122
95
  private getMemberIndex;
123
96
  }
124
- export {};
@@ -2,15 +2,9 @@ import { Logger } from "@waku/utils";
2
2
  import { ethers } from "ethers";
3
3
  import { RLN_ABI } from "./abi.js";
4
4
  import { DEFAULT_RATE_LIMIT, RATE_LIMIT_PARAMS } from "./constants.js";
5
- const log = new Logger("waku:rln:contract");
6
- export var MembershipState;
7
- (function (MembershipState) {
8
- MembershipState["Active"] = "Active";
9
- MembershipState["GracePeriod"] = "GracePeriod";
10
- MembershipState["Expired"] = "Expired";
11
- MembershipState["ErasedAwaitsWithdrawal"] = "ErasedAwaitsWithdrawal";
12
- })(MembershipState || (MembershipState = {}));
13
- export class RLNLightContract {
5
+ import { MembershipState } from "./types.js";
6
+ const log = new Logger("waku:rln:contract:base");
7
+ export class RLNBaseContract {
14
8
  contract;
15
9
  deployBlock;
16
10
  rateLimit;
@@ -19,24 +13,22 @@ export class RLNLightContract {
19
13
  _membershipErasedFilter;
20
14
  _membersExpiredFilter;
21
15
  /**
22
- * Asynchronous initializer for RLNContract.
16
+ * Constructor for RLNBaseContract.
23
17
  * Allows injecting a mocked contract for testing purposes.
24
18
  */
25
- static async init(options) {
26
- const rlnContract = new RLNLightContract(options);
27
- await rlnContract.fetchMembers();
28
- rlnContract.subscribeToMembers();
29
- return rlnContract;
30
- }
31
19
  constructor(options) {
20
+ // Initialize members and subscriptions
21
+ this.fetchMembers()
22
+ .then(() => {
23
+ this.subscribeToMembers();
24
+ })
25
+ .catch((error) => {
26
+ log.error("Failed to initialize members", { error });
27
+ });
32
28
  const { address, signer, rateLimit = DEFAULT_RATE_LIMIT, contract } = options;
33
- if (rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
34
- rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
35
- throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE} messages per epoch`);
36
- }
37
- this.rateLimit = rateLimit;
38
- // Use the injected contract if provided; otherwise, instantiate a new one.
29
+ this.validateRateLimit(rateLimit);
39
30
  this.contract = contract || new ethers.Contract(address, RLN_ABI, signer);
31
+ this.rateLimit = rateLimit;
40
32
  // Initialize event filters
41
33
  this._membersFilter = this.contract.filters.MembershipRegistered();
42
34
  this._membershipErasedFilter = this.contract.filters.MembershipErased();
@@ -82,7 +74,7 @@ export class RLNLightContract {
82
74
  */
83
75
  async getMaxTotalRateLimit() {
84
76
  const maxTotalRate = await this.contract.maxTotalRateLimit();
85
- return ethers.BigNumber.from(maxTotalRate).toNumber();
77
+ return maxTotalRate.toNumber();
86
78
  }
87
79
  /**
88
80
  * Gets the current total rate limit usage across all memberships
@@ -90,7 +82,7 @@ export class RLNLightContract {
90
82
  */
91
83
  async getCurrentTotalRateLimit() {
92
84
  const currentTotal = await this.contract.currentTotalRateLimit();
93
- return ethers.BigNumber.from(currentTotal).toNumber();
85
+ return currentTotal.toNumber();
94
86
  }
95
87
  /**
96
88
  * Gets the remaining available total rate limit that can be allocated
@@ -101,51 +93,32 @@ export class RLNLightContract {
101
93
  this.contract.maxTotalRateLimit(),
102
94
  this.contract.currentTotalRateLimit()
103
95
  ]);
104
- return ethers.BigNumber.from(maxTotal)
105
- .sub(ethers.BigNumber.from(currentTotal))
106
- .toNumber();
96
+ return Number(maxTotal) - Number(currentTotal);
107
97
  }
108
98
  /**
109
99
  * Updates the rate limit for future registrations
110
100
  * @param newRateLimit The new rate limit to use
111
101
  */
112
102
  async setRateLimit(newRateLimit) {
103
+ this.validateRateLimit(newRateLimit);
113
104
  this.rateLimit = newRateLimit;
114
105
  }
115
106
  get members() {
116
107
  const sortedMembers = Array.from(this._members.values()).sort((left, right) => left.index.toNumber() - right.index.toNumber());
117
108
  return sortedMembers;
118
109
  }
119
- get membersFilter() {
120
- if (!this._membersFilter) {
121
- throw Error("Members filter was not initialized.");
122
- }
123
- return this._membersFilter;
124
- }
125
- get membershipErasedFilter() {
126
- if (!this._membershipErasedFilter) {
127
- throw Error("MembershipErased filter was not initialized.");
128
- }
129
- return this._membershipErasedFilter;
130
- }
131
- get membersExpiredFilter() {
132
- if (!this._membersExpiredFilter) {
133
- throw Error("MembersExpired filter was not initialized.");
134
- }
135
- return this._membersExpiredFilter;
136
- }
137
110
  async fetchMembers(options = {}) {
138
- const registeredMemberEvents = await queryFilter(this.contract, {
111
+ const registeredMemberEvents = await RLNBaseContract.queryFilter(this.contract, {
139
112
  fromBlock: this.deployBlock,
140
113
  ...options,
141
114
  membersFilter: this.membersFilter
142
115
  });
143
- const removedMemberEvents = await queryFilter(this.contract, {
116
+ const removedMemberEvents = await RLNBaseContract.queryFilter(this.contract, {
144
117
  fromBlock: this.deployBlock,
145
118
  ...options,
146
119
  membersFilter: this.membershipErasedFilter
147
120
  });
148
- const expiredMemberEvents = await queryFilter(this.contract, {
121
+ const expiredMemberEvents = await RLNBaseContract.queryFilter(this.contract, {
149
122
  fromBlock: this.deployBlock,
150
123
  ...options,
151
124
  membersFilter: this.membersExpiredFilter
@@ -157,6 +130,29 @@ export class RLNLightContract {
157
130
  ];
158
131
  this.processEvents(events);
159
132
  }
133
+ static async queryFilter(contract, options) {
134
+ const FETCH_CHUNK = 5;
135
+ const BLOCK_RANGE = 3000;
136
+ const { fromBlock, membersFilter, fetchRange = BLOCK_RANGE, fetchChunks = FETCH_CHUNK } = options;
137
+ if (fromBlock === undefined) {
138
+ return contract.queryFilter(membersFilter);
139
+ }
140
+ if (!contract.provider) {
141
+ throw Error("No provider found on the contract.");
142
+ }
143
+ const toBlock = await contract.provider.getBlockNumber();
144
+ if (toBlock - fromBlock < fetchRange) {
145
+ return contract.queryFilter(membersFilter, fromBlock, toBlock);
146
+ }
147
+ const events = [];
148
+ const chunks = RLNBaseContract.splitToChunks(fromBlock, toBlock, fetchRange);
149
+ for (const portion of RLNBaseContract.takeN(chunks, fetchChunks)) {
150
+ const promises = portion.map(([left, right]) => RLNBaseContract.ignoreErrors(contract.queryFilter(membersFilter, left, right), []));
151
+ const fetchedEvents = await Promise.all(promises);
152
+ events.push(fetchedEvents.flatMap((v) => v));
153
+ }
154
+ return events.flatMap((v) => v);
155
+ }
160
156
  processEvents(events) {
161
157
  const toRemoveTable = new Map();
162
158
  const toInsertTable = new Map();
@@ -192,6 +188,38 @@ export class RLNLightContract {
192
188
  }
193
189
  });
194
190
  }
191
+ static splitToChunks(from, to, step) {
192
+ const chunks = [];
193
+ let left = from;
194
+ while (left < to) {
195
+ const right = left + step < to ? left + step : to;
196
+ chunks.push([left, right]);
197
+ left = right;
198
+ }
199
+ return chunks;
200
+ }
201
+ static *takeN(array, size) {
202
+ let start = 0;
203
+ while (start < array.length) {
204
+ const portion = array.slice(start, start + size);
205
+ yield portion;
206
+ start += size;
207
+ }
208
+ }
209
+ static async ignoreErrors(promise, defaultValue) {
210
+ try {
211
+ return await promise;
212
+ }
213
+ catch (err) {
214
+ if (err instanceof Error) {
215
+ log.info(`Ignoring an error during query: ${err.message}`);
216
+ }
217
+ else {
218
+ log.info(`Ignoring an unknown error during query`);
219
+ }
220
+ return defaultValue;
221
+ }
222
+ }
195
223
  subscribeToMembers() {
196
224
  this.contract.on(this.membersFilter, (_idCommitment, _membershipRateLimit, _index, event) => {
197
225
  this.processEvents([event]);
@@ -203,6 +231,81 @@ export class RLNLightContract {
203
231
  this.processEvents([event]);
204
232
  });
205
233
  }
234
+ /**
235
+ * Helper method to get remaining messages in current epoch
236
+ * @param membershipId The ID of the membership to check
237
+ * @returns number of remaining messages allowed in current epoch
238
+ */
239
+ async getRemainingMessages(membershipId) {
240
+ try {
241
+ const [startTime, , rateLimit] = await this.contract.getMembershipInfo(membershipId);
242
+ // Calculate current epoch
243
+ const currentTime = Math.floor(Date.now() / 1000);
244
+ const epochsPassed = Math.floor((currentTime - startTime) / RATE_LIMIT_PARAMS.EPOCH_LENGTH);
245
+ const currentEpochStart = startTime + epochsPassed * RATE_LIMIT_PARAMS.EPOCH_LENGTH;
246
+ // Get message count in current epoch using contract's function
247
+ const messageCount = await this.contract.getMessageCount(membershipId, currentEpochStart);
248
+ return Math.max(0, ethers.BigNumber.from(rateLimit)
249
+ .sub(ethers.BigNumber.from(messageCount))
250
+ .toNumber());
251
+ }
252
+ catch (error) {
253
+ log.error(`Error getting remaining messages: ${error.message}`);
254
+ return 0; // Fail safe: assume no messages remaining on error
255
+ }
256
+ }
257
+ async getMembershipInfo(idCommitment) {
258
+ try {
259
+ const [startBlock, endBlock, rateLimit] = await this.contract.getMembershipInfo(idCommitment);
260
+ const currentBlock = await this.contract.provider.getBlockNumber();
261
+ let state;
262
+ if (currentBlock < startBlock) {
263
+ state = MembershipState.Active;
264
+ }
265
+ else if (currentBlock < endBlock) {
266
+ state = MembershipState.GracePeriod;
267
+ }
268
+ else {
269
+ state = MembershipState.Expired;
270
+ }
271
+ const index = await this.getMemberIndex(idCommitment);
272
+ if (!index)
273
+ return undefined;
274
+ return {
275
+ index,
276
+ idCommitment,
277
+ rateLimit: rateLimit.toNumber(),
278
+ startBlock: startBlock.toNumber(),
279
+ endBlock: endBlock.toNumber(),
280
+ state
281
+ };
282
+ }
283
+ catch (error) {
284
+ return undefined;
285
+ }
286
+ }
287
+ async extendMembership(idCommitment) {
288
+ return this.contract.extendMemberships([idCommitment]);
289
+ }
290
+ async eraseMembership(idCommitment, eraseFromMembershipSet = true) {
291
+ return this.contract.eraseMemberships([idCommitment], eraseFromMembershipSet);
292
+ }
293
+ async registerMembership(idCommitment, rateLimit = DEFAULT_RATE_LIMIT) {
294
+ if (rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
295
+ rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
296
+ throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE}`);
297
+ }
298
+ return this.contract.register(idCommitment, rateLimit, []);
299
+ }
300
+ async withdraw(token, holder) {
301
+ try {
302
+ const tx = await this.contract.withdraw(token, { from: holder });
303
+ await tx.wait();
304
+ }
305
+ catch (error) {
306
+ log.error(`Error in withdraw: ${error.message}`);
307
+ }
308
+ }
206
309
  async registerWithIdentity(identity) {
207
310
  try {
208
311
  log.info(`Registering identity with rate limit: ${this.rateLimit} messages/epoch`);
@@ -237,12 +340,12 @@ export class RLNLightContract {
237
340
  `and rate limit ${decodedData.membershipRateLimit}`);
238
341
  const network = await this.contract.provider.getNetwork();
239
342
  const address = this.contract.address;
240
- const membershipId = decodedData.index.toString();
343
+ const membershipId = Number(decodedData.index);
241
344
  return {
242
345
  identity,
243
346
  membership: {
244
347
  address,
245
- treeIndex: parseInt(membershipId),
348
+ treeIndex: membershipId,
246
349
  chainId: network.chainId.toString(),
247
350
  rateLimit: decodedData.membershipRateLimit.toNumber()
248
351
  }
@@ -277,29 +380,6 @@ export class RLNLightContract {
277
380
  }
278
381
  }
279
382
  }
280
- /**
281
- * Helper method to get remaining messages in current epoch
282
- * @param membershipId The ID of the membership to check
283
- * @returns number of remaining messages allowed in current epoch
284
- */
285
- async getRemainingMessages(membershipId) {
286
- try {
287
- const [startTime, , rateLimit] = await this.contract.getMembershipInfo(membershipId);
288
- // Calculate current epoch
289
- const currentTime = Math.floor(Date.now() / 1000);
290
- const epochsPassed = Math.floor((currentTime - startTime) / RATE_LIMIT_PARAMS.EPOCH_LENGTH);
291
- const currentEpochStart = startTime + epochsPassed * RATE_LIMIT_PARAMS.EPOCH_LENGTH;
292
- // Get message count in current epoch using contract's function
293
- const messageCount = await this.contract.getMessageCount(membershipId, currentEpochStart);
294
- return Math.max(0, ethers.BigNumber.from(rateLimit)
295
- .sub(ethers.BigNumber.from(messageCount))
296
- .toNumber());
297
- }
298
- catch (error) {
299
- log.error(`Error getting remaining messages: ${error.message}`);
300
- return 0; // Fail safe: assume no messages remaining on error
301
- }
302
- }
303
383
  async registerWithPermitAndErase(identity, permit, idCommitmentsToErase) {
304
384
  try {
305
385
  log.info(`Registering identity with permit and rate limit: ${this.rateLimit} messages/epoch`);
@@ -319,12 +399,12 @@ export class RLNLightContract {
319
399
  `Rate limit: ${decodedData.membershipRateLimit}, Erased ${idCommitmentsToErase.length} commitments`);
320
400
  const network = await this.contract.provider.getNetwork();
321
401
  const address = this.contract.address;
322
- const membershipId = decodedData.index.toString();
402
+ const membershipId = Number(decodedData.index);
323
403
  return {
324
404
  identity,
325
405
  membership: {
326
406
  address,
327
- treeIndex: parseInt(membershipId),
407
+ treeIndex: membershipId,
328
408
  chainId: network.chainId.toString(),
329
409
  rateLimit: decodedData.membershipRateLimit.toNumber()
330
410
  }
@@ -335,57 +415,33 @@ export class RLNLightContract {
335
415
  return undefined;
336
416
  }
337
417
  }
338
- async withdraw(token, holder) {
339
- try {
340
- const tx = await this.contract.withdraw(token, { from: holder });
341
- await tx.wait();
342
- }
343
- catch (error) {
344
- log.error(`Error in withdraw: ${error.message}`);
418
+ /**
419
+ * Validates that the rate limit is within the allowed range
420
+ * @throws Error if the rate limit is outside the allowed range
421
+ */
422
+ validateRateLimit(rateLimit) {
423
+ if (rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
424
+ rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
425
+ throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE} messages per epoch`);
345
426
  }
346
427
  }
347
- async getMembershipInfo(idCommitment) {
348
- try {
349
- const [startBlock, endBlock, rateLimit] = await this.contract.getMembershipInfo(idCommitment);
350
- const currentBlock = await this.contract.provider.getBlockNumber();
351
- let state;
352
- if (currentBlock < startBlock) {
353
- state = MembershipState.Active;
354
- }
355
- else if (currentBlock < endBlock) {
356
- state = MembershipState.GracePeriod;
357
- }
358
- else {
359
- state = MembershipState.Expired;
360
- }
361
- const index = await this.getMemberIndex(idCommitment);
362
- if (!index)
363
- return undefined;
364
- return {
365
- index,
366
- idCommitment,
367
- rateLimit: rateLimit.toNumber(),
368
- startBlock: startBlock.toNumber(),
369
- endBlock: endBlock.toNumber(),
370
- state
371
- };
372
- }
373
- catch (error) {
374
- return undefined;
428
+ get membersFilter() {
429
+ if (!this._membersFilter) {
430
+ throw Error("Members filter was not initialized.");
375
431
  }
432
+ return this._membersFilter;
376
433
  }
377
- async extendMembership(idCommitment) {
378
- return this.contract.extendMemberships([idCommitment]);
379
- }
380
- async eraseMembership(idCommitment, eraseFromMembershipSet = true) {
381
- return this.contract.eraseMemberships([idCommitment], eraseFromMembershipSet);
434
+ get membershipErasedFilter() {
435
+ if (!this._membershipErasedFilter) {
436
+ throw Error("MembershipErased filter was not initialized.");
437
+ }
438
+ return this._membershipErasedFilter;
382
439
  }
383
- async registerMembership(idCommitment, rateLimit = DEFAULT_RATE_LIMIT) {
384
- if (rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
385
- rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
386
- throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE}`);
440
+ get membersExpiredFilter() {
441
+ if (!this._membersExpiredFilter) {
442
+ throw Error("MembersExpired filter was not initialized.");
387
443
  }
388
- return this.contract.register(idCommitment, rateLimit, []);
444
+ return this._membersExpiredFilter;
389
445
  }
390
446
  async getMemberIndex(idCommitment) {
391
447
  try {
@@ -401,60 +457,4 @@ export class RLNLightContract {
401
457
  }
402
458
  }
403
459
  }
404
- // These values should be tested on other networks
405
- const FETCH_CHUNK = 5;
406
- const BLOCK_RANGE = 3000;
407
- async function queryFilter(contract, options) {
408
- const { fromBlock, membersFilter, fetchRange = BLOCK_RANGE, fetchChunks = FETCH_CHUNK } = options;
409
- if (fromBlock === undefined) {
410
- return contract.queryFilter(membersFilter);
411
- }
412
- if (!contract.provider) {
413
- throw Error("No provider found on the contract.");
414
- }
415
- const toBlock = await contract.provider.getBlockNumber();
416
- if (toBlock - fromBlock < fetchRange) {
417
- return contract.queryFilter(membersFilter, fromBlock, toBlock);
418
- }
419
- const events = [];
420
- const chunks = splitToChunks(fromBlock, toBlock, fetchRange);
421
- for (const portion of takeN(chunks, fetchChunks)) {
422
- const promises = portion.map(([left, right]) => ignoreErrors(contract.queryFilter(membersFilter, left, right), []));
423
- const fetchedEvents = await Promise.all(promises);
424
- events.push(fetchedEvents.flatMap((v) => v));
425
- }
426
- return events.flatMap((v) => v);
427
- }
428
- function splitToChunks(from, to, step) {
429
- const chunks = [];
430
- let left = from;
431
- while (left < to) {
432
- const right = left + step < to ? left + step : to;
433
- chunks.push([left, right]);
434
- left = right;
435
- }
436
- return chunks;
437
- }
438
- function* takeN(array, size) {
439
- let start = 0;
440
- while (start < array.length) {
441
- const portion = array.slice(start, start + size);
442
- yield portion;
443
- start += size;
444
- }
445
- }
446
- async function ignoreErrors(promise, defaultValue) {
447
- try {
448
- return await promise;
449
- }
450
- catch (err) {
451
- if (err instanceof Error) {
452
- log.info(`Ignoring an error during query: ${err.message}`);
453
- }
454
- else {
455
- log.info(`Ignoring an unknown error during query`);
456
- }
457
- return defaultValue;
458
- }
459
- }
460
- //# sourceMappingURL=rln_light_contract.js.map
460
+ //# sourceMappingURL=rln_base_contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rln_base_contract.js","sourceRoot":"","sources":["../../src/contract/rln_base_contract.ts"],"names":[],"mappings":"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"}