@waku/rln 0.1.4 → 0.1.5-6198efb.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/README.md +5 -0
- package/bundle/_virtual/index2.js +1 -1
- package/bundle/index.js +3 -1
- package/bundle/node_modules/@ethersproject/abi/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/address/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/bignumber/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/contracts/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/contracts/lib.esm/index.js +1 -1
- package/bundle/node_modules/@ethersproject/hash/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/keccak256/lib.esm/index.js +1 -1
- package/bundle/node_modules/{js-sha3 → @ethersproject/keccak256/node_modules/js-sha3}/src/sha3.js +2 -2
- package/bundle/node_modules/@ethersproject/networks/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/networks/lib.esm/index.js +1 -19
- package/bundle/node_modules/@ethersproject/properties/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/providers/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/elliptic.js +10 -58
- package/bundle/node_modules/@ethersproject/strings/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/transactions/lib.esm/_version.js +1 -1
- package/bundle/node_modules/@ethersproject/web/lib.esm/_version.js +1 -1
- package/bundle/packages/rln/dist/contract/abi.js +502 -248
- package/bundle/packages/rln/dist/contract/constants.js +4 -4
- package/bundle/packages/rln/dist/contract/rln_contract.js +122 -38
- package/bundle/packages/rln/dist/contract/rln_light_contract.js +477 -0
- package/bundle/packages/rln/dist/keystore/cipher.js +3 -3
- package/bundle/packages/rln/dist/keystore/keystore.js +3 -2
- package/bundle/packages/rln/dist/rln.js +6 -6
- package/bundle/packages/rln/dist/rln_light.js +149 -0
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/checksum.js +3 -3
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/cipher.js +4 -4
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/class.js +7 -7
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/functional.js +7 -7
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/index.js +6 -6
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/kdf.js +5 -5
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/password.js +1 -1
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/schema-validation-generated.js +1 -1
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/schema-validation.js +2 -2
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/types.js +1 -1
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/aes.js +3 -3
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/pbkdf2.js +7 -7
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js +3 -3
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/scrypt.js +3 -3
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/sha256.js +3 -3
- package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js +7 -7
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/_assert.js +1 -1
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/_sha2.js +3 -3
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/_u64.js +1 -1
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/cryptoBrowser.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/esm/_assert.js +43 -0
- package/bundle/packages/rln/node_modules/@noble/hashes/esm/_sha2.js +116 -0
- package/bundle/packages/rln/node_modules/@noble/hashes/esm/hmac.js +79 -0
- package/bundle/packages/rln/node_modules/@noble/hashes/esm/sha256.js +126 -0
- package/bundle/packages/rln/node_modules/@noble/hashes/esm/utils.js +43 -0
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/hmac.js +3 -3
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/pbkdf2.js +4 -4
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/scrypt.js +5 -5
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/sha256.js +3 -3
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/sha512.js +4 -4
- package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/utils.js +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/codec.test-utils.d.ts +36 -0
- package/dist/codec.test-utils.js +56 -0
- package/dist/codec.test-utils.js.map +1 -0
- package/dist/contract/abi.d.ts +21 -17
- package/dist/contract/abi.js +502 -248
- package/dist/contract/abi.js.map +1 -1
- package/dist/contract/constants.d.ts +22 -18
- package/dist/contract/constants.js +3 -3
- package/dist/contract/constants.js.map +1 -1
- package/dist/contract/rln_contract.d.ts +10 -3
- package/dist/contract/rln_contract.js +122 -38
- package/dist/contract/rln_contract.js.map +1 -1
- package/dist/contract/rln_light_contract.d.ts +124 -0
- package/dist/contract/rln_light_contract.js +460 -0
- package/dist/contract/rln_light_contract.js.map +1 -0
- package/dist/contract/test-setup.d.ts +26 -0
- package/dist/contract/test-setup.js +56 -0
- package/dist/contract/test-setup.js.map +1 -0
- package/dist/contract/test-utils.d.ts +39 -0
- package/dist/contract/test-utils.js +118 -0
- package/dist/contract/test-utils.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/keystore/keystore.js +2 -1
- package/dist/keystore/keystore.js.map +1 -1
- package/dist/keystore/types.d.ts +1 -0
- package/dist/rln.d.ts +1 -1
- package/dist/rln.js +6 -6
- package/dist/rln.js.map +1 -1
- package/dist/rln_light.d.ts +64 -0
- package/dist/rln_light.js +144 -0
- package/dist/rln_light.js.map +1 -0
- package/package.json +1 -91
- package/src/codec.test-utils.ts +80 -0
- package/src/contract/abi.ts +502 -248
- package/src/contract/constants.ts +3 -3
- package/src/contract/rln_contract.ts +160 -48
- package/src/contract/rln_light_contract.ts +725 -0
- package/src/contract/test-setup.ts +86 -0
- package/src/contract/test-utils.ts +179 -0
- package/src/index.ts +17 -2
- package/src/keystore/keystore.ts +2 -1
- package/src/keystore/types.ts +1 -0
- package/src/rln.ts +7 -7
- package/src/rln_light.ts +235 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/index.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/md5.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/nil.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/parse.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/regex.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/rng.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/sha1.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/stringify.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v1.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v3.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v35.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v4.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v5.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/validate.js +0 -0
- /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/version.js +0 -0
@@ -1,8 +1,8 @@
|
|
1
1
|
import { RLN_ABI } from "./abi.js";
|
2
2
|
|
3
|
-
export const
|
4
|
-
chainId:
|
5
|
-
address: "
|
3
|
+
export const LINEA_CONTRACT = {
|
4
|
+
chainId: 59141,
|
5
|
+
address: "0xb9cd878c90e49f797b4431fbf4fb333108cb90e6",
|
6
6
|
abi: RLN_ABI
|
7
7
|
};
|
8
8
|
|
@@ -30,7 +30,7 @@ interface RLNContractInitOptions extends RLNContractOptions {
|
|
30
30
|
|
31
31
|
export interface MembershipRegisteredEvent {
|
32
32
|
idCommitment: string;
|
33
|
-
|
33
|
+
membershipRateLimit: ethers.BigNumber;
|
34
34
|
index: ethers.BigNumber;
|
35
35
|
}
|
36
36
|
|
@@ -65,7 +65,8 @@ export class RLNContract {
|
|
65
65
|
|
66
66
|
private _members: Map<number, Member> = new Map();
|
67
67
|
private _membersFilter: ethers.EventFilter;
|
68
|
-
private
|
68
|
+
private _membershipErasedFilter: ethers.EventFilter;
|
69
|
+
private _membersExpiredFilter: ethers.EventFilter;
|
69
70
|
|
70
71
|
/**
|
71
72
|
* Asynchronous initializer for RLNContract.
|
@@ -94,15 +95,7 @@ export class RLNContract {
|
|
94
95
|
contract
|
95
96
|
} = options;
|
96
97
|
|
97
|
-
|
98
|
-
rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
|
99
|
-
rateLimit > RATE_LIMIT_PARAMS.MAX_RATE
|
100
|
-
) {
|
101
|
-
throw new Error(
|
102
|
-
`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE} messages per epoch`
|
103
|
-
);
|
104
|
-
}
|
105
|
-
|
98
|
+
this.validateRateLimit(rateLimit);
|
106
99
|
this.rateLimit = rateLimit;
|
107
100
|
|
108
101
|
const initialRoot = rlnInstance.zerokit.getMerkleRoot();
|
@@ -111,9 +104,25 @@ export class RLNContract {
|
|
111
104
|
this.contract = contract || new ethers.Contract(address, RLN_ABI, signer);
|
112
105
|
this.merkleRootTracker = new MerkleRootTracker(5, initialRoot);
|
113
106
|
|
114
|
-
// Initialize event filters
|
107
|
+
// Initialize event filters
|
115
108
|
this._membersFilter = this.contract.filters.MembershipRegistered();
|
116
|
-
this.
|
109
|
+
this._membershipErasedFilter = this.contract.filters.MembershipErased();
|
110
|
+
this._membersExpiredFilter = this.contract.filters.MembershipExpired();
|
111
|
+
}
|
112
|
+
|
113
|
+
/**
|
114
|
+
* Validates that the rate limit is within the allowed range
|
115
|
+
* @throws Error if the rate limit is outside the allowed range
|
116
|
+
*/
|
117
|
+
private validateRateLimit(rateLimit: number): void {
|
118
|
+
if (
|
119
|
+
rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
|
120
|
+
rateLimit > RATE_LIMIT_PARAMS.MAX_RATE
|
121
|
+
) {
|
122
|
+
throw new Error(
|
123
|
+
`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE} messages per epoch`
|
124
|
+
);
|
125
|
+
}
|
117
126
|
}
|
118
127
|
|
119
128
|
/**
|
@@ -143,7 +152,7 @@ export class RLNContract {
|
|
143
152
|
*/
|
144
153
|
public async getMinRateLimit(): Promise<number> {
|
145
154
|
const minRate = await this.contract.minMembershipRateLimit();
|
146
|
-
return minRate.toNumber();
|
155
|
+
return ethers.BigNumber.from(minRate).toNumber();
|
147
156
|
}
|
148
157
|
|
149
158
|
/**
|
@@ -152,7 +161,7 @@ export class RLNContract {
|
|
152
161
|
*/
|
153
162
|
public async getMaxRateLimit(): Promise<number> {
|
154
163
|
const maxRate = await this.contract.maxMembershipRateLimit();
|
155
|
-
return maxRate.toNumber();
|
164
|
+
return ethers.BigNumber.from(maxRate).toNumber();
|
156
165
|
}
|
157
166
|
|
158
167
|
/**
|
@@ -182,7 +191,7 @@ export class RLNContract {
|
|
182
191
|
this.contract.maxTotalRateLimit(),
|
183
192
|
this.contract.currentTotalRateLimit()
|
184
193
|
]);
|
185
|
-
return maxTotal
|
194
|
+
return Number(maxTotal) - Number(currentTotal);
|
186
195
|
}
|
187
196
|
|
188
197
|
/**
|
@@ -190,6 +199,7 @@ export class RLNContract {
|
|
190
199
|
* @param newRateLimit The new rate limit to use
|
191
200
|
*/
|
192
201
|
public async setRateLimit(newRateLimit: number): Promise<void> {
|
202
|
+
this.validateRateLimit(newRateLimit);
|
193
203
|
this.rateLimit = newRateLimit;
|
194
204
|
}
|
195
205
|
|
@@ -207,11 +217,18 @@ export class RLNContract {
|
|
207
217
|
return this._membersFilter;
|
208
218
|
}
|
209
219
|
|
210
|
-
private get
|
211
|
-
if (!this.
|
212
|
-
throw Error("
|
220
|
+
private get membershipErasedFilter(): ethers.EventFilter {
|
221
|
+
if (!this._membershipErasedFilter) {
|
222
|
+
throw Error("MembershipErased filter was not initialized.");
|
213
223
|
}
|
214
|
-
return this.
|
224
|
+
return this._membershipErasedFilter;
|
225
|
+
}
|
226
|
+
|
227
|
+
private get membersExpiredFilter(): ethers.EventFilter {
|
228
|
+
if (!this._membersExpiredFilter) {
|
229
|
+
throw Error("MembersExpired filter was not initialized.");
|
230
|
+
}
|
231
|
+
return this._membersExpiredFilter;
|
215
232
|
}
|
216
233
|
|
217
234
|
public async fetchMembers(
|
@@ -226,10 +243,19 @@ export class RLNContract {
|
|
226
243
|
const removedMemberEvents = await queryFilter(this.contract, {
|
227
244
|
fromBlock: this.deployBlock,
|
228
245
|
...options,
|
229
|
-
membersFilter: this.
|
246
|
+
membersFilter: this.membershipErasedFilter
|
247
|
+
});
|
248
|
+
const expiredMemberEvents = await queryFilter(this.contract, {
|
249
|
+
fromBlock: this.deployBlock,
|
250
|
+
...options,
|
251
|
+
membersFilter: this.membersExpiredFilter
|
230
252
|
});
|
231
253
|
|
232
|
-
const events = [
|
254
|
+
const events = [
|
255
|
+
...registeredMemberEvents,
|
256
|
+
...removedMemberEvents,
|
257
|
+
...expiredMemberEvents
|
258
|
+
];
|
233
259
|
this.processEvents(rlnInstance, events);
|
234
260
|
}
|
235
261
|
|
@@ -242,8 +268,26 @@ export class RLNContract {
|
|
242
268
|
return;
|
243
269
|
}
|
244
270
|
|
245
|
-
if (
|
246
|
-
|
271
|
+
if (
|
272
|
+
evt.event === "MembershipErased" ||
|
273
|
+
evt.event === "MembershipExpired"
|
274
|
+
) {
|
275
|
+
let index = evt.args.index;
|
276
|
+
|
277
|
+
if (!index) {
|
278
|
+
return;
|
279
|
+
}
|
280
|
+
|
281
|
+
if (typeof index === "number" || typeof index === "string") {
|
282
|
+
index = ethers.BigNumber.from(index);
|
283
|
+
} else {
|
284
|
+
log.error("Index is not a number or string", {
|
285
|
+
index,
|
286
|
+
event: evt
|
287
|
+
});
|
288
|
+
return;
|
289
|
+
}
|
290
|
+
|
247
291
|
const toRemoveVal = toRemoveTable.get(evt.blockNumber);
|
248
292
|
if (toRemoveVal != undefined) {
|
249
293
|
toRemoveVal.push(index.toNumber());
|
@@ -275,15 +319,21 @@ export class RLNContract {
|
|
275
319
|
if (!evt.args) return;
|
276
320
|
|
277
321
|
const _idCommitment = evt.args.idCommitment as string;
|
278
|
-
|
322
|
+
let index = evt.args.index;
|
279
323
|
|
280
324
|
if (!_idCommitment || !index) {
|
281
325
|
return;
|
282
326
|
}
|
283
327
|
|
328
|
+
if (typeof index === "number" || typeof index === "string") {
|
329
|
+
index = ethers.BigNumber.from(index);
|
330
|
+
}
|
331
|
+
|
284
332
|
const idCommitment = zeroPadLE(hexToBytes(_idCommitment), 32);
|
285
333
|
rlnInstance.zerokit.insertMember(idCommitment);
|
286
|
-
|
334
|
+
|
335
|
+
const numericIndex = index.toNumber();
|
336
|
+
this._members.set(numericIndex, {
|
287
337
|
index,
|
288
338
|
idCommitment: _idCommitment
|
289
339
|
});
|
@@ -316,7 +366,7 @@ export class RLNContract {
|
|
316
366
|
this.membersFilter,
|
317
367
|
(
|
318
368
|
_idCommitment: string,
|
319
|
-
|
369
|
+
_membershipRateLimit: ethers.BigNumber,
|
320
370
|
_index: ethers.BigNumber,
|
321
371
|
event: ethers.Event
|
322
372
|
) => {
|
@@ -325,9 +375,22 @@ export class RLNContract {
|
|
325
375
|
);
|
326
376
|
|
327
377
|
this.contract.on(
|
328
|
-
this.
|
378
|
+
this.membershipErasedFilter,
|
329
379
|
(
|
330
380
|
_idCommitment: string,
|
381
|
+
_membershipRateLimit: ethers.BigNumber,
|
382
|
+
_index: ethers.BigNumber,
|
383
|
+
event: ethers.Event
|
384
|
+
) => {
|
385
|
+
this.processEvents(rlnInstance, [event]);
|
386
|
+
}
|
387
|
+
);
|
388
|
+
|
389
|
+
this.contract.on(
|
390
|
+
this.membersExpiredFilter,
|
391
|
+
(
|
392
|
+
_idCommitment: string,
|
393
|
+
_membershipRateLimit: ethers.BigNumber,
|
331
394
|
_index: ethers.BigNumber,
|
332
395
|
event: ethers.Event
|
333
396
|
) => {
|
@@ -344,15 +407,45 @@ export class RLNContract {
|
|
344
407
|
`Registering identity with rate limit: ${this.rateLimit} messages/epoch`
|
345
408
|
);
|
346
409
|
|
410
|
+
// Check if the ID commitment is already registered
|
411
|
+
const existingIndex = await this.getMemberIndex(
|
412
|
+
identity.IDCommitmentBigInt.toString()
|
413
|
+
);
|
414
|
+
if (existingIndex) {
|
415
|
+
throw new Error(
|
416
|
+
`ID commitment is already registered with index ${existingIndex}`
|
417
|
+
);
|
418
|
+
}
|
419
|
+
|
420
|
+
// Check if there's enough remaining rate limit
|
421
|
+
const remainingRateLimit = await this.getRemainingTotalRateLimit();
|
422
|
+
if (remainingRateLimit < this.rateLimit) {
|
423
|
+
throw new Error(
|
424
|
+
`Not enough remaining rate limit. Requested: ${this.rateLimit}, Available: ${remainingRateLimit}`
|
425
|
+
);
|
426
|
+
}
|
427
|
+
|
428
|
+
const estimatedGas = await this.contract.estimateGas.register(
|
429
|
+
identity.IDCommitmentBigInt,
|
430
|
+
this.rateLimit,
|
431
|
+
[]
|
432
|
+
);
|
433
|
+
const gasLimit = estimatedGas.add(10000);
|
434
|
+
|
347
435
|
const txRegisterResponse: ethers.ContractTransaction =
|
348
436
|
await this.contract.register(
|
349
437
|
identity.IDCommitmentBigInt,
|
350
438
|
this.rateLimit,
|
351
439
|
[],
|
352
|
-
{ gasLimit
|
440
|
+
{ gasLimit }
|
353
441
|
);
|
442
|
+
|
354
443
|
const txRegisterReceipt = await txRegisterResponse.wait();
|
355
444
|
|
445
|
+
if (txRegisterReceipt.status === 0) {
|
446
|
+
throw new Error("Transaction failed on-chain");
|
447
|
+
}
|
448
|
+
|
356
449
|
const memberRegistered = txRegisterReceipt.events?.find(
|
357
450
|
(event) => event.event === "MembershipRegistered"
|
358
451
|
);
|
@@ -366,30 +459,55 @@ export class RLNContract {
|
|
366
459
|
|
367
460
|
const decodedData: MembershipRegisteredEvent = {
|
368
461
|
idCommitment: memberRegistered.args.idCommitment,
|
369
|
-
|
462
|
+
membershipRateLimit: memberRegistered.args.membershipRateLimit,
|
370
463
|
index: memberRegistered.args.index
|
371
464
|
};
|
372
465
|
|
373
466
|
log.info(
|
374
467
|
`Successfully registered membership with index ${decodedData.index} ` +
|
375
|
-
`and rate limit ${decodedData.
|
468
|
+
`and rate limit ${decodedData.membershipRateLimit}`
|
376
469
|
);
|
377
470
|
|
378
471
|
const network = await this.contract.provider.getNetwork();
|
379
472
|
const address = this.contract.address;
|
380
|
-
const membershipId = decodedData.index
|
473
|
+
const membershipId = Number(decodedData.index);
|
381
474
|
|
382
475
|
return {
|
383
476
|
identity,
|
384
477
|
membership: {
|
385
478
|
address,
|
386
479
|
treeIndex: membershipId,
|
387
|
-
chainId: network.chainId
|
480
|
+
chainId: network.chainId,
|
481
|
+
rateLimit: decodedData.membershipRateLimit.toNumber()
|
388
482
|
}
|
389
483
|
};
|
390
484
|
} catch (error) {
|
391
|
-
|
392
|
-
|
485
|
+
if (error instanceof Error) {
|
486
|
+
const errorMessage = error.message;
|
487
|
+
log.error("registerWithIdentity - error message:", errorMessage);
|
488
|
+
log.error("registerWithIdentity - error stack:", error.stack);
|
489
|
+
|
490
|
+
// Try to extract more specific error information
|
491
|
+
if (errorMessage.includes("CannotExceedMaxTotalRateLimit")) {
|
492
|
+
throw new Error(
|
493
|
+
"Registration failed: Cannot exceed maximum total rate limit"
|
494
|
+
);
|
495
|
+
} else if (errorMessage.includes("InvalidIdCommitment")) {
|
496
|
+
throw new Error("Registration failed: Invalid ID commitment");
|
497
|
+
} else if (errorMessage.includes("InvalidMembershipRateLimit")) {
|
498
|
+
throw new Error("Registration failed: Invalid membership rate limit");
|
499
|
+
} else if (errorMessage.includes("execution reverted")) {
|
500
|
+
throw new Error(
|
501
|
+
"Contract execution reverted. Check contract requirements."
|
502
|
+
);
|
503
|
+
} else {
|
504
|
+
throw new Error(`Error in registerWithIdentity: ${errorMessage}`);
|
505
|
+
}
|
506
|
+
} else {
|
507
|
+
throw new Error("Unknown error in registerWithIdentity", {
|
508
|
+
cause: error
|
509
|
+
});
|
510
|
+
}
|
393
511
|
}
|
394
512
|
}
|
395
513
|
|
@@ -467,25 +585,26 @@ export class RLNContract {
|
|
467
585
|
|
468
586
|
const decodedData: MembershipRegisteredEvent = {
|
469
587
|
idCommitment: memberRegistered.args.idCommitment,
|
470
|
-
|
588
|
+
membershipRateLimit: memberRegistered.args.membershipRateLimit,
|
471
589
|
index: memberRegistered.args.index
|
472
590
|
};
|
473
591
|
|
474
592
|
log.info(
|
475
593
|
`Successfully registered membership with permit. Index: ${decodedData.index}, ` +
|
476
|
-
`Rate limit: ${decodedData.
|
594
|
+
`Rate limit: ${decodedData.membershipRateLimit}, Erased ${idCommitmentsToErase.length} commitments`
|
477
595
|
);
|
478
596
|
|
479
597
|
const network = await this.contract.provider.getNetwork();
|
480
598
|
const address = this.contract.address;
|
481
|
-
const membershipId = decodedData.index.toNumber();
|
599
|
+
const membershipId = ethers.BigNumber.from(decodedData.index).toNumber();
|
482
600
|
|
483
601
|
return {
|
484
602
|
identity,
|
485
603
|
membership: {
|
486
604
|
address,
|
487
605
|
treeIndex: membershipId,
|
488
|
-
chainId: network.chainId
|
606
|
+
chainId: network.chainId,
|
607
|
+
rateLimit: decodedData.membershipRateLimit.toNumber()
|
489
608
|
}
|
490
609
|
};
|
491
610
|
} catch (error) {
|
@@ -560,16 +679,9 @@ export class RLNContract {
|
|
560
679
|
|
561
680
|
public async registerMembership(
|
562
681
|
idCommitment: string,
|
563
|
-
rateLimit: number =
|
682
|
+
rateLimit: number = this.rateLimit
|
564
683
|
): Promise<ethers.ContractTransaction> {
|
565
|
-
|
566
|
-
rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
|
567
|
-
rateLimit > RATE_LIMIT_PARAMS.MAX_RATE
|
568
|
-
) {
|
569
|
-
throw new Error(
|
570
|
-
`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE}`
|
571
|
-
);
|
572
|
-
}
|
684
|
+
this.validateRateLimit(rateLimit);
|
573
685
|
return this.contract.register(idCommitment, rateLimit, []);
|
574
686
|
}
|
575
687
|
|