@waku/rln 0.1.5-6198efb.0 → 0.1.5-731214b.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 (64) hide show
  1. package/bundle/index.js +4 -3
  2. package/bundle/packages/rln/dist/contract/constants.js +1 -0
  3. package/bundle/packages/rln/dist/contract/{rln_light_contract.js → rln_base_contract.js} +188 -179
  4. package/bundle/packages/rln/dist/contract/rln_contract.js +9 -419
  5. package/bundle/packages/rln/dist/contract/types.js +9 -0
  6. package/bundle/packages/rln/dist/create.js +1 -1
  7. package/bundle/packages/rln/dist/{rln_light.js → credentials_manager.js} +113 -47
  8. package/bundle/packages/rln/dist/keystore/keystore.js +10 -6
  9. package/bundle/packages/rln/dist/rln.js +56 -166
  10. package/bundle/packages/rln/dist/zerokit.js +5 -5
  11. package/dist/.tsbuildinfo +1 -1
  12. package/dist/contract/index.d.ts +1 -0
  13. package/dist/contract/index.js +1 -0
  14. package/dist/contract/index.js.map +1 -1
  15. package/dist/contract/{rln_light_contract.d.ts → rln_base_contract.d.ts} +24 -58
  16. package/dist/contract/{rln_light_contract.js → rln_base_contract.js} +188 -179
  17. package/dist/contract/rln_base_contract.js.map +1 -0
  18. package/dist/contract/rln_contract.d.ts +5 -122
  19. package/dist/contract/rln_contract.js +8 -417
  20. package/dist/contract/rln_contract.js.map +1 -1
  21. package/dist/contract/test-utils.js +1 -1
  22. package/dist/contract/test-utils.js.map +1 -1
  23. package/dist/contract/types.d.ts +45 -0
  24. package/dist/contract/types.js +8 -0
  25. package/dist/contract/types.js.map +1 -0
  26. package/dist/create.js +1 -1
  27. package/dist/create.js.map +1 -1
  28. package/dist/credentials_manager.d.ts +44 -0
  29. package/dist/credentials_manager.js +197 -0
  30. package/dist/credentials_manager.js.map +1 -0
  31. package/dist/index.d.ts +5 -4
  32. package/dist/index.js +4 -3
  33. package/dist/index.js.map +1 -1
  34. package/dist/keystore/keystore.js +10 -6
  35. package/dist/keystore/keystore.js.map +1 -1
  36. package/dist/keystore/types.d.ts +3 -3
  37. package/dist/rln.d.ts +9 -52
  38. package/dist/rln.js +54 -163
  39. package/dist/rln.js.map +1 -1
  40. package/dist/types.d.ts +27 -0
  41. package/dist/types.js +2 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/zerokit.d.ts +3 -3
  44. package/dist/zerokit.js +5 -5
  45. package/dist/zerokit.js.map +1 -1
  46. package/package.json +1 -1
  47. package/src/contract/index.ts +1 -0
  48. package/src/contract/{rln_light_contract.ts → rln_base_contract.ts} +304 -313
  49. package/src/contract/rln_contract.ts +9 -663
  50. package/src/contract/test-utils.ts +1 -1
  51. package/src/contract/types.ts +53 -0
  52. package/src/create.ts +1 -1
  53. package/src/credentials_manager.ts +282 -0
  54. package/src/index.ts +7 -5
  55. package/src/keystore/keystore.ts +22 -12
  56. package/src/keystore/types.ts +3 -3
  57. package/src/rln.ts +67 -258
  58. package/src/types.ts +31 -0
  59. package/src/zerokit.ts +3 -3
  60. package/dist/contract/rln_light_contract.js.map +0 -1
  61. package/dist/rln_light.d.ts +0 -64
  62. package/dist/rln_light.js +0 -144
  63. package/dist/rln_light.js.map +0 -1
  64. package/src/rln_light.ts +0 -235
@@ -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,19 @@ 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;
68
+ getMembershipInfo(idCommitmentBigInt: bigint): Promise<MembershipInfo | undefined>;
69
+ extendMembership(idCommitment: string): Promise<ethers.ContractTransaction>;
70
+ eraseMembership(idCommitment: string, eraseFromMembershipSet?: boolean): Promise<ethers.ContractTransaction>;
71
+ registerMembership(idCommitment: string, rateLimit?: number): Promise<ethers.ContractTransaction>;
72
+ withdraw(token: string, from: string): Promise<void>;
103
73
  registerWithIdentity(identity: IdentityCredential): Promise<DecryptedCredentials | undefined>;
104
- /**
105
- * Helper method to get remaining messages in current epoch
106
- * @param membershipId The ID of the membership to check
107
- * @returns number of remaining messages allowed in current epoch
108
- */
109
- getRemainingMessages(membershipId: number): Promise<number>;
110
74
  registerWithPermitAndErase(identity: IdentityCredential, permit: {
111
75
  owner: string;
112
76
  deadline: number;
@@ -114,11 +78,13 @@ export declare class RLNLightContract {
114
78
  r: string;
115
79
  s: string;
116
80
  }, 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>;
81
+ /**
82
+ * Validates that the rate limit is within the allowed range
83
+ * @throws Error if the rate limit is outside the allowed range
84
+ */
85
+ private validateRateLimit;
86
+ private get membersFilter();
87
+ private get membershipErasedFilter();
88
+ private get membersExpiredFilter();
122
89
  private getMemberIndex;
123
90
  }
124
- export {};
@@ -1,16 +1,11 @@
1
+ /* eslint-disable no-console */
1
2
  import { Logger } from "@waku/utils";
2
3
  import { ethers } from "ethers";
3
4
  import { RLN_ABI } from "./abi.js";
4
5
  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 {
6
+ import { MembershipState } from "./types.js";
7
+ const log = new Logger("waku:rln:contract:base");
8
+ export class RLNBaseContract {
14
9
  contract;
15
10
  deployBlock;
16
11
  rateLimit;
@@ -19,28 +14,38 @@ export class RLNLightContract {
19
14
  _membershipErasedFilter;
20
15
  _membersExpiredFilter;
21
16
  /**
22
- * Asynchronous initializer for RLNContract.
17
+ * Constructor for RLNBaseContract.
23
18
  * Allows injecting a mocked contract for testing purposes.
24
19
  */
25
- static async init(options) {
26
- const rlnContract = new RLNLightContract(options);
27
- await rlnContract.fetchMembers();
28
- rlnContract.subscribeToMembers();
29
- return rlnContract;
30
- }
31
20
  constructor(options) {
32
21
  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.
22
+ log.info("Initializing RLNBaseContract", { address, rateLimit });
39
23
  this.contract = contract || new ethers.Contract(address, RLN_ABI, signer);
40
- // Initialize event filters
41
- this._membersFilter = this.contract.filters.MembershipRegistered();
42
- this._membershipErasedFilter = this.contract.filters.MembershipErased();
43
- this._membersExpiredFilter = this.contract.filters.MembershipExpired();
24
+ this.rateLimit = rateLimit;
25
+ try {
26
+ log.info("Setting up event filters");
27
+ // Initialize event filters
28
+ this._membersFilter = this.contract.filters.MembershipRegistered();
29
+ this._membershipErasedFilter = this.contract.filters.MembershipErased();
30
+ this._membersExpiredFilter = this.contract.filters.MembershipExpired();
31
+ log.info("Event filters initialized successfully");
32
+ }
33
+ catch (error) {
34
+ log.error("Failed to initialize event filters", { error });
35
+ throw new Error("Failed to initialize event filters: " + error.message);
36
+ }
37
+ // Initialize members and subscriptions
38
+ this.fetchMembers()
39
+ .then(() => {
40
+ this.subscribeToMembers();
41
+ })
42
+ .catch((error) => {
43
+ log.error("Failed to initialize members", { error });
44
+ });
45
+ // Validate rate limit asynchronously
46
+ this.validateRateLimit(rateLimit).catch((error) => {
47
+ log.error("Failed to validate initial rate limit", { error });
48
+ });
44
49
  }
45
50
  /**
46
51
  * Gets the current rate limit for this contract instance
@@ -82,7 +87,7 @@ export class RLNLightContract {
82
87
  */
83
88
  async getMaxTotalRateLimit() {
84
89
  const maxTotalRate = await this.contract.maxTotalRateLimit();
85
- return ethers.BigNumber.from(maxTotalRate).toNumber();
90
+ return maxTotalRate.toNumber();
86
91
  }
87
92
  /**
88
93
  * Gets the current total rate limit usage across all memberships
@@ -90,7 +95,7 @@ export class RLNLightContract {
90
95
  */
91
96
  async getCurrentTotalRateLimit() {
92
97
  const currentTotal = await this.contract.currentTotalRateLimit();
93
- return ethers.BigNumber.from(currentTotal).toNumber();
98
+ return currentTotal.toNumber();
94
99
  }
95
100
  /**
96
101
  * Gets the remaining available total rate limit that can be allocated
@@ -101,51 +106,32 @@ export class RLNLightContract {
101
106
  this.contract.maxTotalRateLimit(),
102
107
  this.contract.currentTotalRateLimit()
103
108
  ]);
104
- return ethers.BigNumber.from(maxTotal)
105
- .sub(ethers.BigNumber.from(currentTotal))
106
- .toNumber();
109
+ return Number(maxTotal) - Number(currentTotal);
107
110
  }
108
111
  /**
109
112
  * Updates the rate limit for future registrations
110
113
  * @param newRateLimit The new rate limit to use
111
114
  */
112
115
  async setRateLimit(newRateLimit) {
116
+ await this.validateRateLimit(newRateLimit);
113
117
  this.rateLimit = newRateLimit;
114
118
  }
115
119
  get members() {
116
120
  const sortedMembers = Array.from(this._members.values()).sort((left, right) => left.index.toNumber() - right.index.toNumber());
117
121
  return sortedMembers;
118
122
  }
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
123
  async fetchMembers(options = {}) {
138
- const registeredMemberEvents = await queryFilter(this.contract, {
124
+ const registeredMemberEvents = await RLNBaseContract.queryFilter(this.contract, {
139
125
  fromBlock: this.deployBlock,
140
126
  ...options,
141
127
  membersFilter: this.membersFilter
142
128
  });
143
- const removedMemberEvents = await queryFilter(this.contract, {
129
+ const removedMemberEvents = await RLNBaseContract.queryFilter(this.contract, {
144
130
  fromBlock: this.deployBlock,
145
131
  ...options,
146
132
  membersFilter: this.membershipErasedFilter
147
133
  });
148
- const expiredMemberEvents = await queryFilter(this.contract, {
134
+ const expiredMemberEvents = await RLNBaseContract.queryFilter(this.contract, {
149
135
  fromBlock: this.deployBlock,
150
136
  ...options,
151
137
  membersFilter: this.membersExpiredFilter
@@ -157,6 +143,29 @@ export class RLNLightContract {
157
143
  ];
158
144
  this.processEvents(events);
159
145
  }
146
+ static async queryFilter(contract, options) {
147
+ const FETCH_CHUNK = 5;
148
+ const BLOCK_RANGE = 3000;
149
+ const { fromBlock, membersFilter, fetchRange = BLOCK_RANGE, fetchChunks = FETCH_CHUNK } = options;
150
+ if (fromBlock === undefined) {
151
+ return contract.queryFilter(membersFilter);
152
+ }
153
+ if (!contract.provider) {
154
+ throw Error("No provider found on the contract.");
155
+ }
156
+ const toBlock = await contract.provider.getBlockNumber();
157
+ if (toBlock - fromBlock < fetchRange) {
158
+ return contract.queryFilter(membersFilter, fromBlock, toBlock);
159
+ }
160
+ const events = [];
161
+ const chunks = RLNBaseContract.splitToChunks(fromBlock, toBlock, fetchRange);
162
+ for (const portion of RLNBaseContract.takeN(chunks, fetchChunks)) {
163
+ const promises = portion.map(([left, right]) => RLNBaseContract.ignoreErrors(contract.queryFilter(membersFilter, left, right), []));
164
+ const fetchedEvents = await Promise.all(promises);
165
+ events.push(fetchedEvents.flatMap((v) => v));
166
+ }
167
+ return events.flatMap((v) => v);
168
+ }
160
169
  processEvents(events) {
161
170
  const toRemoveTable = new Map();
162
171
  const toInsertTable = new Map();
@@ -192,6 +201,38 @@ export class RLNLightContract {
192
201
  }
193
202
  });
194
203
  }
204
+ static splitToChunks(from, to, step) {
205
+ const chunks = [];
206
+ let left = from;
207
+ while (left < to) {
208
+ const right = left + step < to ? left + step : to;
209
+ chunks.push([left, right]);
210
+ left = right;
211
+ }
212
+ return chunks;
213
+ }
214
+ static *takeN(array, size) {
215
+ let start = 0;
216
+ while (start < array.length) {
217
+ const portion = array.slice(start, start + size);
218
+ yield portion;
219
+ start += size;
220
+ }
221
+ }
222
+ static async ignoreErrors(promise, defaultValue) {
223
+ try {
224
+ return await promise;
225
+ }
226
+ catch (err) {
227
+ if (err instanceof Error) {
228
+ log.info(`Ignoring an error during query: ${err.message}`);
229
+ }
230
+ else {
231
+ log.info(`Ignoring an unknown error during query`);
232
+ }
233
+ return defaultValue;
234
+ }
235
+ }
195
236
  subscribeToMembers() {
196
237
  this.contract.on(this.membersFilter, (_idCommitment, _membershipRateLimit, _index, event) => {
197
238
  this.processEvents([event]);
@@ -203,6 +244,72 @@ export class RLNLightContract {
203
244
  this.processEvents([event]);
204
245
  });
205
246
  }
247
+ async getMembershipInfo(idCommitmentBigInt) {
248
+ try {
249
+ console.log("idCommitmentBigInt", idCommitmentBigInt);
250
+ const membershipData = await this.contract.memberships(idCommitmentBigInt);
251
+ const currentBlock = await this.contract.provider.getBlockNumber();
252
+ console.log("membershipData", membershipData);
253
+ const [depositAmount, activeDuration, gracePeriodStartTimestamp, gracePeriodDuration, rateLimit, index, holder, token] = membershipData;
254
+ const gracePeriodEnd = gracePeriodStartTimestamp.add(gracePeriodDuration);
255
+ console.log("gracePeriodEnd", gracePeriodEnd);
256
+ let state;
257
+ if (currentBlock < gracePeriodStartTimestamp.toNumber()) {
258
+ state = MembershipState.Active;
259
+ }
260
+ else if (currentBlock < gracePeriodEnd.toNumber()) {
261
+ state = MembershipState.GracePeriod;
262
+ }
263
+ else {
264
+ state = MembershipState.Expired;
265
+ }
266
+ console.log("state", state);
267
+ console.log("index", index);
268
+ console.log("idCommitment", idCommitmentBigInt.toString());
269
+ console.log("rateLimit", rateLimit);
270
+ console.log("gracePeriodStartTimestamp", gracePeriodStartTimestamp);
271
+ console.log("gracePeriodEnd", gracePeriodEnd);
272
+ return {
273
+ index,
274
+ idCommitment: idCommitmentBigInt.toString(),
275
+ rateLimit: Number(rateLimit),
276
+ startBlock: gracePeriodStartTimestamp.toNumber(),
277
+ endBlock: gracePeriodEnd.toNumber(),
278
+ state,
279
+ depositAmount,
280
+ activeDuration,
281
+ gracePeriodDuration,
282
+ holder,
283
+ token
284
+ };
285
+ }
286
+ catch (error) {
287
+ console.error("Error in getMembershipInfo:", error);
288
+ return undefined;
289
+ }
290
+ }
291
+ async extendMembership(idCommitment) {
292
+ return this.contract.extendMemberships([idCommitment]);
293
+ }
294
+ async eraseMembership(idCommitment, eraseFromMembershipSet = true) {
295
+ return this.contract.eraseMemberships([idCommitment], eraseFromMembershipSet);
296
+ }
297
+ async registerMembership(idCommitment, rateLimit = DEFAULT_RATE_LIMIT) {
298
+ if (rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
299
+ rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
300
+ throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE}`);
301
+ }
302
+ return this.contract.register(idCommitment, rateLimit, []);
303
+ }
304
+ async withdraw(token, from) {
305
+ try {
306
+ const tx = await this.contract.withdraw(token, from);
307
+ await tx.wait();
308
+ }
309
+ catch (error) {
310
+ log.error(`Error in withdraw: ${error.message}`);
311
+ }
312
+ }
206
313
  async registerWithIdentity(identity) {
207
314
  try {
208
315
  log.info(`Registering identity with rate limit: ${this.rateLimit} messages/epoch`);
@@ -243,7 +350,7 @@ export class RLNLightContract {
243
350
  membership: {
244
351
  address,
245
352
  treeIndex: membershipId,
246
- chainId: network.chainId,
353
+ chainId: network.chainId.toString(),
247
354
  rateLimit: decodedData.membershipRateLimit.toNumber()
248
355
  }
249
356
  };
@@ -277,29 +384,6 @@ export class RLNLightContract {
277
384
  }
278
385
  }
279
386
  }
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
387
  async registerWithPermitAndErase(identity, permit, idCommitmentsToErase) {
304
388
  try {
305
389
  log.info(`Registering identity with permit and rate limit: ${this.rateLimit} messages/epoch`);
@@ -325,7 +409,7 @@ export class RLNLightContract {
325
409
  membership: {
326
410
  address,
327
411
  treeIndex: membershipId,
328
- chainId: network.chainId,
412
+ chainId: network.chainId.toString(),
329
413
  rateLimit: decodedData.membershipRateLimit.toNumber()
330
414
  }
331
415
  };
@@ -335,57 +419,38 @@ export class RLNLightContract {
335
419
  return undefined;
336
420
  }
337
421
  }
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}`);
422
+ /**
423
+ * Validates that the rate limit is within the allowed range
424
+ * @throws Error if the rate limit is outside the allowed range
425
+ */
426
+ async validateRateLimit(rateLimit) {
427
+ const [minRate, maxRate] = await Promise.all([
428
+ this.contract.minMembershipRateLimit(),
429
+ this.contract.maxMembershipRateLimit()
430
+ ]);
431
+ const minRateNum = ethers.BigNumber.from(minRate).toNumber();
432
+ const maxRateNum = ethers.BigNumber.from(maxRate).toNumber();
433
+ if (rateLimit < minRateNum || rateLimit > maxRateNum) {
434
+ throw new Error(`Rate limit must be between ${minRateNum} and ${maxRateNum} messages per epoch`);
345
435
  }
346
436
  }
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;
437
+ get membersFilter() {
438
+ if (!this._membersFilter) {
439
+ throw Error("Members filter was not initialized.");
375
440
  }
441
+ return this._membersFilter;
376
442
  }
377
- async extendMembership(idCommitment) {
378
- return this.contract.extendMemberships([idCommitment]);
379
- }
380
- async eraseMembership(idCommitment, eraseFromMembershipSet = true) {
381
- return this.contract.eraseMemberships([idCommitment], eraseFromMembershipSet);
443
+ get membershipErasedFilter() {
444
+ if (!this._membershipErasedFilter) {
445
+ throw Error("MembershipErased filter was not initialized.");
446
+ }
447
+ return this._membershipErasedFilter;
382
448
  }
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}`);
449
+ get membersExpiredFilter() {
450
+ if (!this._membersExpiredFilter) {
451
+ throw Error("MembersExpired filter was not initialized.");
387
452
  }
388
- return this.contract.register(idCommitment, rateLimit, []);
453
+ return this._membersExpiredFilter;
389
454
  }
390
455
  async getMemberIndex(idCommitment) {
391
456
  try {
@@ -401,60 +466,4 @@ export class RLNLightContract {
401
466
  }
402
467
  }
403
468
  }
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
469
+ //# 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":"AAAA,+BAA+B;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAML,eAAe,EAEhB,MAAM,YAAY,CAAC;AAEpB,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAEjD,MAAM,OAAO,eAAe;IACnB,QAAQ,CAAkB;IACzB,WAAW,CAAqB;IAChC,SAAS,CAAS;IAEhB,QAAQ,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC5C,cAAc,CAAqB;IACnC,uBAAuB,CAAqB;IAC5C,qBAAqB,CAAqB;IAElD;;;OAGG;IACH,YAAmB,OAA+B;QAChD,MAAM,EACJ,OAAO,EACP,MAAM,EACN,SAAS,GAAG,kBAAkB,EAC9B,QAAQ,EACT,GAAG,OAAO,CAAC;QAEZ,GAAG,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAEjE,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACrC,2BAA2B;YAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YACnE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACxE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACvE,GAAG,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3D,MAAM,IAAI,KAAK,CACb,sCAAsC,GAAI,KAAe,CAAC,OAAO,CAClE,CAAC;QACJ,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,YAAY,EAAE;aAChB,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEL,qCAAqC;QACrC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAChD,GAAG,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,eAAe;QAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,eAAe;QAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,oBAAoB;QAC/B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QAC7D,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,wBAAwB;QACnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QACjE,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,0BAA0B;QACrC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE;YACjC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE;SACtC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,YAAY,CAAC,YAAoB;QAC5C,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;IAChC,CAAC;IAED,IAAW,OAAO;QAChB,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC3D,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAChE,CAAC;QACF,OAAO,aAAa,CAAC;IACvB,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,UAA+B,EAAE;QACzD,MAAM,sBAAsB,GAAG,MAAM,eAAe,CAAC,WAAW,CAC9D,IAAI,CAAC,QAAQ,EACb;YACE,SAAS,EAAE,IAAI,CAAC,WAAW;YAC3B,GAAG,OAAO;YACV,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CACF,CAAC;QACF,MAAM,mBAAmB,GAAG,MAAM,eAAe,CAAC,WAAW,CAC3D,IAAI,CAAC,QAAQ,EACb;YACE,SAAS,EAAE,IAAI,CAAC,WAAW;YAC3B,GAAG,OAAO;YACV,aAAa,EAAE,IAAI,CAAC,sBAAsB;SAC3C,CACF,CAAC;QACF,MAAM,mBAAmB,GAAG,MAAM,eAAe,CAAC,WAAW,CAC3D,IAAI,CAAC,QAAQ,EACb;YACE,SAAS,EAAE,IAAI,CAAC,WAAW;YAC3B,GAAG,OAAO;YACV,aAAa,EAAE,IAAI,CAAC,oBAAoB;SACzC,CACF,CAAC;QAEF,MAAM,MAAM,GAAG;YACb,GAAG,sBAAsB;YACzB,GAAG,mBAAmB;YACtB,GAAG,mBAAmB;SACvB,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,WAAW,CAC7B,QAAyB,EACzB,OAA2B;QAE3B,MAAM,WAAW,GAAG,CAAC,CAAC;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC;QAEzB,MAAM,EACJ,SAAS,EACT,aAAa,EACb,UAAU,GAAG,WAAW,EACxB,WAAW,GAAG,WAAW,EAC1B,GAAG,OAAO,CAAC;QAEZ,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvB,MAAM,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAEzD,IAAI,OAAO,GAAG,SAAS,GAAG,UAAU,EAAE,CAAC;YACrC,OAAO,QAAQ,CAAC,WAAW,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAC1C,SAAS,EACT,OAAO,EACP,UAAU,CACX,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,eAAe,CAAC,KAAK,CACzC,MAAM,EACN,WAAW,CACZ,EAAE,CAAC;YACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAC7C,eAAe,CAAC,YAAY,CAC1B,QAAQ,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,EAChD,EAAE,CACH,CACF,CAAC;YACF,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAEM,aAAa,CAAC,MAAsB;QACzC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAoB,CAAC;QAClD,MAAM,aAAa,GAAG,IAAI,GAAG,EAA0B,CAAC;QAExD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACrB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IACE,GAAG,CAAC,KAAK,KAAK,kBAAkB;gBAChC,GAAG,CAAC,KAAK,KAAK,mBAAmB,EACjC,CAAC;gBACD,IAAI,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;gBAE3B,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO;gBACT,CAAC;gBAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC3D,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvC,CAAC;gBAED,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACvD,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;oBAC7B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACnC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBAClD,CAAC;qBAAM,CAAC;oBACN,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,CAAC,KAAK,KAAK,sBAAsB,EAAE,CAAC;gBAChD,IAAI,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACxD,IAAI,cAAc,IAAI,SAAS,EAAE,CAAC;oBAChC,cAAc,GAAG,EAAE,CAAC;gBACtB,CAAC;gBAED,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzB,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YACrD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,MAAM,CAAC,aAAa,CACzB,IAAY,EACZ,EAAU,EACV,IAAY;QAEZ,MAAM,MAAM,GAA4B,EAAE,CAAC;QAE3C,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,OAAO,IAAI,GAAG,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAElD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAqB,CAAC,CAAC;YAE/C,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,CAAC,KAAK,CAAI,KAAU,EAAE,IAAY;QAC9C,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;YAEjD,MAAM,OAAO,CAAC;YAEd,KAAK,IAAI,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,YAAY,CAC9B,OAAmB,EACnB,YAAe;QAEf,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC;QACvB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;gBACzB,GAAG,CAAC,IAAI,CAAC,mCAAmC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAEM,kBAAkB;QACvB,IAAI,CAAC,QAAQ,CAAC,EAAE,CACd,IAAI,CAAC,aAAa,EAClB,CACE,aAAqB,EACrB,oBAAsC,EACtC,MAAwB,EACxB,KAAmB,EACnB,EAAE;YACF,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9B,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,CACd,IAAI,CAAC,sBAAsB,EAC3B,CACE,aAAqB,EACrB,oBAAsC,EACtC,MAAwB,EACxB,KAAmB,EACnB,EAAE;YACF,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9B,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,CACd,IAAI,CAAC,oBAAoB,EACzB,CACE,aAAqB,EACrB,oBAAsC,EACtC,MAAwB,EACxB,KAAmB,EACnB,EAAE;YACF,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9B,CAAC,CACF,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAC5B,kBAA0B;QAE1B,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;YACtD,MAAM,cAAc,GAClB,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;YACtD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;YAE9C,MAAM,CACJ,aAAa,EACb,cAAc,EACd,yBAAyB,EACzB,mBAAmB,EACnB,SAAS,EACT,KAAK,EACL,MAAM,EACN,KAAK,CACN,GAAG,cAAc,CAAC;YAEnB,MAAM,cAAc,GAAG,yBAAyB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;YAE9C,IAAI,KAAsB,CAAC;YAC3B,IAAI,YAAY,GAAG,yBAAyB,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACxD,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC;YACjC,CAAC;iBAAM,IAAI,YAAY,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACpD,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC;YAClC,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,yBAAyB,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;YAE9C,OAAO;gBACL,KAAK;gBACL,YAAY,EAAE,kBAAkB,CAAC,QAAQ,EAAE;gBAC3C,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;gBAC5B,UAAU,EAAE,yBAAyB,CAAC,QAAQ,EAAE;gBAChD,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;gBACnC,KAAK;gBACL,aAAa;gBACb,cAAc;gBACd,mBAAmB;gBACnB,MAAM;gBACN,KAAK;aACN,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAC3B,YAAoB;QAEpB,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK,CAAC,eAAe,CAC1B,YAAoB,EACpB,yBAAkC,IAAI;QAEtC,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CACnC,CAAC,YAAY,CAAC,EACd,sBAAsB,CACvB,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAC7B,YAAoB,EACpB,YAAoB,kBAAkB;QAEtC,IACE,SAAS,GAAG,iBAAiB,CAAC,QAAQ;YACtC,SAAS,GAAG,iBAAiB,CAAC,QAAQ,EACtC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,8BAA8B,iBAAiB,CAAC,QAAQ,QAAQ,iBAAiB,CAAC,QAAQ,EAAE,CAC7F,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,IAAY;QAC/C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACrD,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,sBAAuB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAC/B,QAA4B;QAE5B,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CACN,yCAAyC,IAAI,CAAC,SAAS,iBAAiB,CACzE,CAAC;YAEF,mDAAmD;YACnD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAC7C,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CACvC,CAAC;YACF,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CACb,kDAAkD,aAAa,EAAE,CAClE,CAAC;YACJ,CAAC;YAED,+CAA+C;YAC/C,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAAC;YACnE,IAAI,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CACb,+CAA+C,IAAI,CAAC,SAAS,gBAAgB,kBAAkB,EAAE,CAClG,CAAC;YACJ,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAC3D,QAAQ,CAAC,kBAAkB,EAC3B,IAAI,CAAC,SAAS,EACd,EAAE,CACH,CAAC;YACF,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAEzC,MAAM,kBAAkB,GACtB,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAC1B,QAAQ,CAAC,kBAAkB,EAC3B,IAAI,CAAC,SAAS,EACd,EAAE,EACF,EAAE,QAAQ,EAAE,CACb,CAAC;YAEJ,MAAM,iBAAiB,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,CAAC;YAE1D,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,CACrD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,sBAAsB,CAClD,CAAC;YAEF,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;gBAChD,GAAG,CAAC,KAAK,CACP,oEAAoE,CACrE,CAAC;gBACF,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,WAAW,GAA8B;gBAC7C,YAAY,EAAE,gBAAgB,CAAC,IAAI,CAAC,YAAY;gBAChD,mBAAmB,EAAE,gBAAgB,CAAC,IAAI,CAAC,mBAAmB;gBAC9D,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK;aACnC,CAAC;YAEF,GAAG,CAAC,IAAI,CACN,iDAAiD,WAAW,CAAC,KAAK,GAAG;gBACnE,kBAAkB,WAAW,CAAC,mBAAmB,EAAE,CACtD,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YACtC,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAE/C,OAAO;gBACL,QAAQ;gBACR,UAAU,EAAE;oBACV,OAAO;oBACP,SAAS,EAAE,YAAY;oBACvB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;oBACnC,SAAS,EAAE,WAAW,CAAC,mBAAmB,CAAC,QAAQ,EAAE;iBACtD;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;gBACnC,GAAG,CAAC,KAAK,CAAC,uCAAuC,EAAE,YAAY,CAAC,CAAC;gBACjE,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAE9D,iDAAiD;gBACjD,IAAI,YAAY,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,CAAC;oBAC3D,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;gBACJ,CAAC;qBAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;oBACxD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAChE,CAAC;qBAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,CAAC;oBAC/D,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;gBACxE,CAAC;qBAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;oBACvD,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,kCAAkC,YAAY,EAAE,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,uCAAuC,EAAE;oBACvD,KAAK,EAAE,KAAK;iBACb,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,0BAA0B,CACrC,QAA4B,EAC5B,MAMC,EACD,oBAA8B;QAE9B,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CACN,oDAAoD,IAAI,CAAC,SAAS,iBAAiB,CACpF,CAAC;YAEF,MAAM,kBAAkB,GACtB,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CACpC,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,CAAC,EACR,MAAM,CAAC,CAAC,EACR,MAAM,CAAC,CAAC,EACR,QAAQ,CAAC,kBAAkB,EAC3B,IAAI,CAAC,SAAS,EACd,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAC5D,CAAC;YACJ,MAAM,iBAAiB,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,CAAC;YAE1D,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,CACrD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,sBAAsB,CAClD,CAAC;YAEF,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;gBAChD,GAAG,CAAC,KAAK,CACP,gFAAgF,CACjF,CAAC;gBACF,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,WAAW,GAA8B;gBAC7C,YAAY,EAAE,gBAAgB,CAAC,IAAI,CAAC,YAAY;gBAChD,mBAAmB,EAAE,gBAAgB,CAAC,IAAI,CAAC,mBAAmB;gBAC9D,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK;aACnC,CAAC;YAEF,GAAG,CAAC,IAAI,CACN,0DAA0D,WAAW,CAAC,KAAK,IAAI;gBAC7E,eAAe,WAAW,CAAC,mBAAmB,YAAY,oBAAoB,CAAC,MAAM,cAAc,CACtG,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YACtC,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAE/C,OAAO;gBACL,QAAQ;gBACR,UAAU,EAAE;oBACV,OAAO;oBACP,SAAS,EAAE,YAAY;oBACvB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;oBACnC,SAAS,EAAE,WAAW,CAAC,mBAAmB,CAAC,QAAQ,EAAE;iBACtD;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CACP,wCAAyC,KAAe,CAAC,OAAO,EAAE,CACnE,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QAC/C,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC3C,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE;YACtC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE;SACvC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7D,IAAI,SAAS,GAAG,UAAU,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CACb,8BAA8B,UAAU,QAAQ,UAAU,qBAAqB,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAY,aAAa;QACvB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAY,sBAAsB;QAChC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED,IAAY,oBAAoB;QAC9B,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAChC,MAAM,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,YAAoB;QAEpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC5C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,YAAY,CAAC,CACzD,CAAC;YACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YAE1C,yCAAyC;YACzC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF"}