@waku/rln 0.1.5-ad0e277.0 → 0.1.5-bc093d3.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/constants.js +2 -5
- package/bundle/packages/rln/dist/contract/{rln_light_contract.js → rln_base_contract.js} +188 -181
- 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} +114 -48
- package/bundle/packages/rln/dist/identity.js +0 -8
- package/bundle/packages/rln/dist/keystore/keystore.js +28 -15
- package/bundle/packages/rln/dist/rln.js +56 -166
- package/bundle/packages/rln/dist/zerokit.js +5 -5
- package/dist/.tsbuildinfo +1 -1
- package/dist/contract/constants.d.ts +1 -1
- package/dist/contract/constants.js +1 -1
- package/dist/contract/constants.js.map +1 -1
- package/dist/contract/{rln_light_contract.d.ts → rln_base_contract.d.ts} +24 -58
- package/dist/contract/{rln_light_contract.js → rln_base_contract.js} +188 -181
- 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/types.d.ts +45 -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 +44 -0
- package/dist/credentials_manager.js +197 -0
- package/dist/credentials_manager.js.map +1 -0
- package/dist/identity.d.ts +0 -1
- package/dist/identity.js +0 -8
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/keystore/keystore.d.ts +1 -0
- package/dist/keystore/keystore.js +28 -15
- package/dist/keystore/keystore.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/dist/zerokit.d.ts +3 -3
- package/dist/zerokit.js +5 -5
- package/dist/zerokit.js.map +1 -1
- package/package.json +1 -1
- package/src/contract/constants.ts +1 -1
- package/src/contract/{rln_light_contract.ts → rln_base_contract.ts} +300 -315
- package/src/contract/rln_contract.ts +9 -663
- package/src/contract/types.ts +53 -0
- package/src/create.ts +1 -1
- package/src/credentials_manager.ts +282 -0
- package/src/identity.ts +0 -9
- package/src/index.ts +4 -4
- package/src/keystore/keystore.ts +50 -27
- package/src/rln.ts +67 -258
- package/src/types.ts +31 -0
- package/src/zerokit.ts +3 -3
- package/dist/contract/rln_light_contract.js.map +0 -1
- package/dist/rln_light.d.ts +0 -64
- package/dist/rln_light.js +0 -144
- 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,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): 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
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
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
|
-
|
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 {
|
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
|
-
*
|
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
|
-
|
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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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
|
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
|
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
|
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,70 @@ 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
|
+
let state;
|
254
|
+
const gracePeriodEnd = membershipData.gracePeriodStartTimestamp.add(membershipData.gracePeriodDuration);
|
255
|
+
console.log("gracePeriodEnd", gracePeriodEnd);
|
256
|
+
if (currentBlock < membershipData.gracePeriodStartTimestamp) {
|
257
|
+
state = MembershipState.Active;
|
258
|
+
}
|
259
|
+
else if (currentBlock < gracePeriodEnd) {
|
260
|
+
state = MembershipState.GracePeriod;
|
261
|
+
}
|
262
|
+
else {
|
263
|
+
state = MembershipState.Expired;
|
264
|
+
}
|
265
|
+
console.log("state", state);
|
266
|
+
console.log("membershipData.index", membershipData.index);
|
267
|
+
console.log("membershipData.idCommitment", membershipData.idCommitment);
|
268
|
+
console.log("membershipData.rateLimit", membershipData.rateLimit);
|
269
|
+
console.log("membershipData.gracePeriodStartTimestamp", membershipData.gracePeriodStartTimestamp);
|
270
|
+
console.log("gracePeriodEnd", gracePeriodEnd);
|
271
|
+
return {
|
272
|
+
index: membershipData.index,
|
273
|
+
idCommitment: membershipData.idCommitment,
|
274
|
+
rateLimit: membershipData.rateLimit.toNumber(),
|
275
|
+
startBlock: membershipData.gracePeriodStartTimestamp.toNumber(),
|
276
|
+
endBlock: gracePeriodEnd.toNumber(),
|
277
|
+
state,
|
278
|
+
depositAmount: membershipData.depositAmount,
|
279
|
+
activeDuration: membershipData.activeDuration,
|
280
|
+
gracePeriodDuration: membershipData.gracePeriodDuration,
|
281
|
+
holder: membershipData.holder,
|
282
|
+
token: membershipData.token
|
283
|
+
};
|
284
|
+
}
|
285
|
+
catch (error) {
|
286
|
+
return undefined;
|
287
|
+
}
|
288
|
+
}
|
289
|
+
async extendMembership(idCommitment) {
|
290
|
+
return this.contract.extendMemberships([idCommitment]);
|
291
|
+
}
|
292
|
+
async eraseMembership(idCommitment, eraseFromMembershipSet = true) {
|
293
|
+
return this.contract.eraseMemberships([idCommitment], eraseFromMembershipSet);
|
294
|
+
}
|
295
|
+
async registerMembership(idCommitment, rateLimit = DEFAULT_RATE_LIMIT) {
|
296
|
+
if (rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
|
297
|
+
rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
|
298
|
+
throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE}`);
|
299
|
+
}
|
300
|
+
return this.contract.register(idCommitment, rateLimit, []);
|
301
|
+
}
|
302
|
+
async withdraw(token) {
|
303
|
+
try {
|
304
|
+
const tx = await this.contract.withdraw(token);
|
305
|
+
await tx.wait();
|
306
|
+
}
|
307
|
+
catch (error) {
|
308
|
+
log.error(`Error in withdraw: ${error.message}`);
|
309
|
+
}
|
310
|
+
}
|
206
311
|
async registerWithIdentity(identity) {
|
207
312
|
try {
|
208
313
|
log.info(`Registering identity with rate limit: ${this.rateLimit} messages/epoch`);
|
@@ -237,12 +342,12 @@ export class RLNLightContract {
|
|
237
342
|
`and rate limit ${decodedData.membershipRateLimit}`);
|
238
343
|
const network = await this.contract.provider.getNetwork();
|
239
344
|
const address = this.contract.address;
|
240
|
-
const membershipId = decodedData.index
|
345
|
+
const membershipId = Number(decodedData.index);
|
241
346
|
return {
|
242
347
|
identity,
|
243
348
|
membership: {
|
244
349
|
address,
|
245
|
-
treeIndex:
|
350
|
+
treeIndex: membershipId,
|
246
351
|
chainId: network.chainId.toString(),
|
247
352
|
rateLimit: decodedData.membershipRateLimit.toNumber()
|
248
353
|
}
|
@@ -277,29 +382,6 @@ export class RLNLightContract {
|
|
277
382
|
}
|
278
383
|
}
|
279
384
|
}
|
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
385
|
async registerWithPermitAndErase(identity, permit, idCommitmentsToErase) {
|
304
386
|
try {
|
305
387
|
log.info(`Registering identity with permit and rate limit: ${this.rateLimit} messages/epoch`);
|
@@ -319,12 +401,12 @@ export class RLNLightContract {
|
|
319
401
|
`Rate limit: ${decodedData.membershipRateLimit}, Erased ${idCommitmentsToErase.length} commitments`);
|
320
402
|
const network = await this.contract.provider.getNetwork();
|
321
403
|
const address = this.contract.address;
|
322
|
-
const membershipId = decodedData.index
|
404
|
+
const membershipId = Number(decodedData.index);
|
323
405
|
return {
|
324
406
|
identity,
|
325
407
|
membership: {
|
326
408
|
address,
|
327
|
-
treeIndex:
|
409
|
+
treeIndex: membershipId,
|
328
410
|
chainId: network.chainId.toString(),
|
329
411
|
rateLimit: decodedData.membershipRateLimit.toNumber()
|
330
412
|
}
|
@@ -335,57 +417,38 @@ export class RLNLightContract {
|
|
335
417
|
return undefined;
|
336
418
|
}
|
337
419
|
}
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
420
|
+
/**
|
421
|
+
* Validates that the rate limit is within the allowed range
|
422
|
+
* @throws Error if the rate limit is outside the allowed range
|
423
|
+
*/
|
424
|
+
async validateRateLimit(rateLimit) {
|
425
|
+
const [minRate, maxRate] = await Promise.all([
|
426
|
+
this.contract.minMembershipRateLimit(),
|
427
|
+
this.contract.maxMembershipRateLimit()
|
428
|
+
]);
|
429
|
+
const minRateNum = ethers.BigNumber.from(minRate).toNumber();
|
430
|
+
const maxRateNum = ethers.BigNumber.from(maxRate).toNumber();
|
431
|
+
if (rateLimit < minRateNum || rateLimit > maxRateNum) {
|
432
|
+
throw new Error(`Rate limit must be between ${minRateNum} and ${maxRateNum} messages per epoch`);
|
345
433
|
}
|
346
434
|
}
|
347
|
-
|
348
|
-
|
349
|
-
|
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;
|
435
|
+
get membersFilter() {
|
436
|
+
if (!this._membersFilter) {
|
437
|
+
throw Error("Members filter was not initialized.");
|
375
438
|
}
|
439
|
+
return this._membersFilter;
|
376
440
|
}
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
return this.
|
441
|
+
get membershipErasedFilter() {
|
442
|
+
if (!this._membershipErasedFilter) {
|
443
|
+
throw Error("MembershipErased filter was not initialized.");
|
444
|
+
}
|
445
|
+
return this._membershipErasedFilter;
|
382
446
|
}
|
383
|
-
|
384
|
-
if (
|
385
|
-
|
386
|
-
throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE}`);
|
447
|
+
get membersExpiredFilter() {
|
448
|
+
if (!this._membersExpiredFilter) {
|
449
|
+
throw Error("MembersExpired filter was not initialized.");
|
387
450
|
}
|
388
|
-
return this.
|
451
|
+
return this._membersExpiredFilter;
|
389
452
|
}
|
390
453
|
async getMemberIndex(idCommitment) {
|
391
454
|
try {
|
@@ -401,60 +464,4 @@ export class RLNLightContract {
|
|
401
464
|
}
|
402
465
|
}
|
403
466
|
}
|
404
|
-
|
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
|
467
|
+
//# 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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"}
|