@waku/rln 0.1.5-5e19700.0 → 0.1.5-6997987.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.
- package/bundle/index.js +2 -2
- package/bundle/packages/rln/dist/contract/{rln_light_contract.js → rln_base_contract.js} +172 -168
- package/bundle/packages/rln/dist/contract/rln_contract.js +9 -419
- package/bundle/packages/rln/dist/contract/types.js +9 -0
- package/bundle/packages/rln/dist/create.js +1 -1
- package/bundle/packages/rln/dist/{rln_light.js → credentials_manager.js} +120 -36
- package/bundle/packages/rln/dist/rln.js +56 -166
- package/dist/.tsbuildinfo +1 -1
- package/dist/contract/{rln_light_contract.d.ts → rln_base_contract.d.ts} +25 -53
- package/dist/contract/{rln_light_contract.js → rln_base_contract.js} +172 -168
- package/dist/contract/rln_base_contract.js.map +1 -0
- package/dist/contract/rln_contract.d.ts +5 -122
- package/dist/contract/rln_contract.js +8 -417
- package/dist/contract/rln_contract.js.map +1 -1
- package/dist/contract/test-utils.js +1 -1
- package/dist/contract/test-utils.js.map +1 -1
- package/dist/contract/types.d.ts +40 -0
- package/dist/contract/types.js +8 -0
- package/dist/contract/types.js.map +1 -0
- package/dist/create.js +1 -1
- package/dist/create.js.map +1 -1
- package/dist/credentials_manager.d.ts +50 -0
- package/dist/{rln_light.js → credentials_manager.js} +118 -47
- package/dist/credentials_manager.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/rln.d.ts +9 -52
- package/dist/rln.js +54 -163
- package/dist/rln.js.map +1 -1
- package/dist/types.d.ts +27 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +1 -1
- package/src/contract/{rln_light_contract.ts → rln_base_contract.ts} +289 -300
- package/src/contract/rln_contract.ts +9 -663
- package/src/contract/test-utils.ts +1 -1
- package/src/contract/types.ts +48 -0
- package/src/create.ts +1 -1
- package/src/credentials_manager.ts +306 -0
- package/src/index.ts +4 -4
- package/src/rln.ts +67 -259
- package/src/types.ts +31 -0
- package/dist/contract/rln_light_contract.js.map +0 -1
- package/dist/rln_light.d.ts +0 -64
- package/dist/rln_light.js.map +0 -1
- package/src/rln_light.ts +0 -235
@@ -1,56 +1,20 @@
|
|
1
1
|
import { ethers } from "ethers";
|
2
|
-
import
|
3
|
-
import
|
4
|
-
|
5
|
-
|
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
|
-
|
9
|
+
protected _members: Map<number, Member>;
|
45
10
|
private _membersFilter;
|
46
11
|
private _membershipErasedFilter;
|
47
12
|
private _membersExpiredFilter;
|
48
13
|
/**
|
49
|
-
*
|
14
|
+
* Constructor for RLNBaseContract.
|
50
15
|
* Allows injecting a mocked contract for testing purposes.
|
51
16
|
*/
|
52
|
-
|
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
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
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
|
-
|
6
|
-
|
7
|
-
|
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
|
-
*
|
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
|
-
|
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();
|
@@ -66,7 +58,7 @@ export class RLNLightContract {
|
|
66
58
|
*/
|
67
59
|
async getMinRateLimit() {
|
68
60
|
const minRate = await this.contract.minMembershipRateLimit();
|
69
|
-
return minRate.toNumber();
|
61
|
+
return ethers.BigNumber.from(minRate).toNumber();
|
70
62
|
}
|
71
63
|
/**
|
72
64
|
* Gets the maximum allowed rate limit from the contract
|
@@ -74,7 +66,7 @@ export class RLNLightContract {
|
|
74
66
|
*/
|
75
67
|
async getMaxRateLimit() {
|
76
68
|
const maxRate = await this.contract.maxMembershipRateLimit();
|
77
|
-
return maxRate.toNumber();
|
69
|
+
return ethers.BigNumber.from(maxRate).toNumber();
|
78
70
|
}
|
79
71
|
/**
|
80
72
|
* Gets the maximum total rate limit across all memberships
|
@@ -108,42 +100,25 @@ export class RLNLightContract {
|
|
108
100
|
* @param newRateLimit The new rate limit to use
|
109
101
|
*/
|
110
102
|
async setRateLimit(newRateLimit) {
|
103
|
+
this.validateRateLimit(newRateLimit);
|
111
104
|
this.rateLimit = newRateLimit;
|
112
105
|
}
|
113
106
|
get members() {
|
114
107
|
const sortedMembers = Array.from(this._members.values()).sort((left, right) => left.index.toNumber() - right.index.toNumber());
|
115
108
|
return sortedMembers;
|
116
109
|
}
|
117
|
-
get membersFilter() {
|
118
|
-
if (!this._membersFilter) {
|
119
|
-
throw Error("Members filter was not initialized.");
|
120
|
-
}
|
121
|
-
return this._membersFilter;
|
122
|
-
}
|
123
|
-
get membershipErasedFilter() {
|
124
|
-
if (!this._membershipErasedFilter) {
|
125
|
-
throw Error("MembershipErased filter was not initialized.");
|
126
|
-
}
|
127
|
-
return this._membershipErasedFilter;
|
128
|
-
}
|
129
|
-
get membersExpiredFilter() {
|
130
|
-
if (!this._membersExpiredFilter) {
|
131
|
-
throw Error("MembersExpired filter was not initialized.");
|
132
|
-
}
|
133
|
-
return this._membersExpiredFilter;
|
134
|
-
}
|
135
110
|
async fetchMembers(options = {}) {
|
136
|
-
const registeredMemberEvents = await queryFilter(this.contract, {
|
111
|
+
const registeredMemberEvents = await RLNBaseContract.queryFilter(this.contract, {
|
137
112
|
fromBlock: this.deployBlock,
|
138
113
|
...options,
|
139
114
|
membersFilter: this.membersFilter
|
140
115
|
});
|
141
|
-
const removedMemberEvents = await queryFilter(this.contract, {
|
116
|
+
const removedMemberEvents = await RLNBaseContract.queryFilter(this.contract, {
|
142
117
|
fromBlock: this.deployBlock,
|
143
118
|
...options,
|
144
119
|
membersFilter: this.membershipErasedFilter
|
145
120
|
});
|
146
|
-
const expiredMemberEvents = await queryFilter(this.contract, {
|
121
|
+
const expiredMemberEvents = await RLNBaseContract.queryFilter(this.contract, {
|
147
122
|
fromBlock: this.deployBlock,
|
148
123
|
...options,
|
149
124
|
membersFilter: this.membersExpiredFilter
|
@@ -155,6 +130,29 @@ export class RLNLightContract {
|
|
155
130
|
];
|
156
131
|
this.processEvents(events);
|
157
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
|
+
}
|
158
156
|
processEvents(events) {
|
159
157
|
const toRemoveTable = new Map();
|
160
158
|
const toInsertTable = new Map();
|
@@ -190,6 +188,38 @@ export class RLNLightContract {
|
|
190
188
|
}
|
191
189
|
});
|
192
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
|
+
}
|
193
223
|
subscribeToMembers() {
|
194
224
|
this.contract.on(this.membersFilter, (_idCommitment, _membershipRateLimit, _index, event) => {
|
195
225
|
this.processEvents([event]);
|
@@ -201,6 +231,81 @@ export class RLNLightContract {
|
|
201
231
|
this.processEvents([event]);
|
202
232
|
});
|
203
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
|
+
}
|
204
309
|
async registerWithIdentity(identity) {
|
205
310
|
try {
|
206
311
|
log.info(`Registering identity with rate limit: ${this.rateLimit} messages/epoch`);
|
@@ -275,27 +380,6 @@ export class RLNLightContract {
|
|
275
380
|
}
|
276
381
|
}
|
277
382
|
}
|
278
|
-
/**
|
279
|
-
* Helper method to get remaining messages in current epoch
|
280
|
-
* @param membershipId The ID of the membership to check
|
281
|
-
* @returns number of remaining messages allowed in current epoch
|
282
|
-
*/
|
283
|
-
async getRemainingMessages(membershipId) {
|
284
|
-
try {
|
285
|
-
const [startTime, , rateLimit] = await this.contract.getMembershipInfo(membershipId);
|
286
|
-
// Calculate current epoch
|
287
|
-
const currentTime = Math.floor(Date.now() / 1000);
|
288
|
-
const epochsPassed = Math.floor((currentTime - startTime) / RATE_LIMIT_PARAMS.EPOCH_LENGTH);
|
289
|
-
const currentEpochStart = startTime + epochsPassed * RATE_LIMIT_PARAMS.EPOCH_LENGTH;
|
290
|
-
// Get message count in current epoch using contract's function
|
291
|
-
const messageCount = await this.contract.getMessageCount(membershipId, currentEpochStart);
|
292
|
-
return Math.max(0, rateLimit.sub(messageCount).toNumber());
|
293
|
-
}
|
294
|
-
catch (error) {
|
295
|
-
log.error(`Error getting remaining messages: ${error.message}`);
|
296
|
-
return 0; // Fail safe: assume no messages remaining on error
|
297
|
-
}
|
298
|
-
}
|
299
383
|
async registerWithPermitAndErase(identity, permit, idCommitmentsToErase) {
|
300
384
|
try {
|
301
385
|
log.info(`Registering identity with permit and rate limit: ${this.rateLimit} messages/epoch`);
|
@@ -331,57 +415,33 @@ export class RLNLightContract {
|
|
331
415
|
return undefined;
|
332
416
|
}
|
333
417
|
}
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
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`);
|
341
426
|
}
|
342
427
|
}
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
const currentBlock = await this.contract.provider.getBlockNumber();
|
347
|
-
let state;
|
348
|
-
if (currentBlock < startBlock) {
|
349
|
-
state = MembershipState.Active;
|
350
|
-
}
|
351
|
-
else if (currentBlock < endBlock) {
|
352
|
-
state = MembershipState.GracePeriod;
|
353
|
-
}
|
354
|
-
else {
|
355
|
-
state = MembershipState.Expired;
|
356
|
-
}
|
357
|
-
const index = await this.getMemberIndex(idCommitment);
|
358
|
-
if (!index)
|
359
|
-
return undefined;
|
360
|
-
return {
|
361
|
-
index,
|
362
|
-
idCommitment,
|
363
|
-
rateLimit: rateLimit.toNumber(),
|
364
|
-
startBlock: startBlock.toNumber(),
|
365
|
-
endBlock: endBlock.toNumber(),
|
366
|
-
state
|
367
|
-
};
|
368
|
-
}
|
369
|
-
catch (error) {
|
370
|
-
return undefined;
|
428
|
+
get membersFilter() {
|
429
|
+
if (!this._membersFilter) {
|
430
|
+
throw Error("Members filter was not initialized.");
|
371
431
|
}
|
432
|
+
return this._membersFilter;
|
372
433
|
}
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
return this.
|
434
|
+
get membershipErasedFilter() {
|
435
|
+
if (!this._membershipErasedFilter) {
|
436
|
+
throw Error("MembershipErased filter was not initialized.");
|
437
|
+
}
|
438
|
+
return this._membershipErasedFilter;
|
378
439
|
}
|
379
|
-
|
380
|
-
if (
|
381
|
-
|
382
|
-
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.");
|
383
443
|
}
|
384
|
-
return this.
|
444
|
+
return this._membersExpiredFilter;
|
385
445
|
}
|
386
446
|
async getMemberIndex(idCommitment) {
|
387
447
|
try {
|
@@ -397,60 +457,4 @@ export class RLNLightContract {
|
|
397
457
|
}
|
398
458
|
}
|
399
459
|
}
|
400
|
-
|
401
|
-
const FETCH_CHUNK = 5;
|
402
|
-
const BLOCK_RANGE = 3000;
|
403
|
-
async function queryFilter(contract, options) {
|
404
|
-
const { fromBlock, membersFilter, fetchRange = BLOCK_RANGE, fetchChunks = FETCH_CHUNK } = options;
|
405
|
-
if (fromBlock === undefined) {
|
406
|
-
return contract.queryFilter(membersFilter);
|
407
|
-
}
|
408
|
-
if (!contract.provider) {
|
409
|
-
throw Error("No provider found on the contract.");
|
410
|
-
}
|
411
|
-
const toBlock = await contract.provider.getBlockNumber();
|
412
|
-
if (toBlock - fromBlock < fetchRange) {
|
413
|
-
return contract.queryFilter(membersFilter, fromBlock, toBlock);
|
414
|
-
}
|
415
|
-
const events = [];
|
416
|
-
const chunks = splitToChunks(fromBlock, toBlock, fetchRange);
|
417
|
-
for (const portion of takeN(chunks, fetchChunks)) {
|
418
|
-
const promises = portion.map(([left, right]) => ignoreErrors(contract.queryFilter(membersFilter, left, right), []));
|
419
|
-
const fetchedEvents = await Promise.all(promises);
|
420
|
-
events.push(fetchedEvents.flatMap((v) => v));
|
421
|
-
}
|
422
|
-
return events.flatMap((v) => v);
|
423
|
-
}
|
424
|
-
function splitToChunks(from, to, step) {
|
425
|
-
const chunks = [];
|
426
|
-
let left = from;
|
427
|
-
while (left < to) {
|
428
|
-
const right = left + step < to ? left + step : to;
|
429
|
-
chunks.push([left, right]);
|
430
|
-
left = right;
|
431
|
-
}
|
432
|
-
return chunks;
|
433
|
-
}
|
434
|
-
function* takeN(array, size) {
|
435
|
-
let start = 0;
|
436
|
-
while (start < array.length) {
|
437
|
-
const portion = array.slice(start, start + size);
|
438
|
-
yield portion;
|
439
|
-
start += size;
|
440
|
-
}
|
441
|
-
}
|
442
|
-
async function ignoreErrors(promise, defaultValue) {
|
443
|
-
try {
|
444
|
-
return await promise;
|
445
|
-
}
|
446
|
-
catch (err) {
|
447
|
-
if (err instanceof Error) {
|
448
|
-
log.info(`Ignoring an error during query: ${err.message}`);
|
449
|
-
}
|
450
|
-
else {
|
451
|
-
log.info(`Ignoring an unknown error during query`);
|
452
|
-
}
|
453
|
-
return defaultValue;
|
454
|
-
}
|
455
|
-
}
|
456
|
-
//# 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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"}
|