@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
|
-
const
|
4
|
-
chainId:
|
5
|
-
address: "
|
3
|
+
const LINEA_CONTRACT = {
|
4
|
+
chainId: 59141,
|
5
|
+
address: "0xb9cd878c90e49f797b4431fbf4fb333108cb90e6",
|
6
6
|
abi: RLN_ABI
|
7
7
|
};
|
8
8
|
/**
|
@@ -23,4 +23,4 @@ const RATE_LIMIT_PARAMS = {
|
|
23
23
|
};
|
24
24
|
const DEFAULT_RATE_LIMIT = RATE_LIMIT_PARAMS.MAX_RATE;
|
25
25
|
|
26
|
-
export { DEFAULT_RATE_LIMIT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS
|
26
|
+
export { DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS };
|
@@ -25,7 +25,8 @@ class RLNContract {
|
|
25
25
|
rateLimit;
|
26
26
|
_members = new Map();
|
27
27
|
_membersFilter;
|
28
|
-
|
28
|
+
_membershipErasedFilter;
|
29
|
+
_membersExpiredFilter;
|
29
30
|
/**
|
30
31
|
* Asynchronous initializer for RLNContract.
|
31
32
|
* Allows injecting a mocked contract for testing purposes.
|
@@ -38,18 +39,26 @@ class RLNContract {
|
|
38
39
|
}
|
39
40
|
constructor(rlnInstance, options) {
|
40
41
|
const { address, signer, rateLimit = DEFAULT_RATE_LIMIT, contract } = options;
|
41
|
-
|
42
|
-
rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
|
43
|
-
throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE} messages per epoch`);
|
44
|
-
}
|
42
|
+
this.validateRateLimit(rateLimit);
|
45
43
|
this.rateLimit = rateLimit;
|
46
44
|
const initialRoot = rlnInstance.zerokit.getMerkleRoot();
|
47
45
|
// Use the injected contract if provided; otherwise, instantiate a new one.
|
48
46
|
this.contract = contract || new Contract(address, RLN_ABI, signer);
|
49
47
|
this.merkleRootTracker = new MerkleRootTracker(5, initialRoot);
|
50
|
-
// Initialize event filters
|
48
|
+
// Initialize event filters
|
51
49
|
this._membersFilter = this.contract.filters.MembershipRegistered();
|
52
|
-
this.
|
50
|
+
this._membershipErasedFilter = this.contract.filters.MembershipErased();
|
51
|
+
this._membersExpiredFilter = this.contract.filters.MembershipExpired();
|
52
|
+
}
|
53
|
+
/**
|
54
|
+
* Validates that the rate limit is within the allowed range
|
55
|
+
* @throws Error if the rate limit is outside the allowed range
|
56
|
+
*/
|
57
|
+
validateRateLimit(rateLimit) {
|
58
|
+
if (rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
|
59
|
+
rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
|
60
|
+
throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE} messages per epoch`);
|
61
|
+
}
|
53
62
|
}
|
54
63
|
/**
|
55
64
|
* Gets the current rate limit for this contract instance
|
@@ -75,7 +84,7 @@ class RLNContract {
|
|
75
84
|
*/
|
76
85
|
async getMinRateLimit() {
|
77
86
|
const minRate = await this.contract.minMembershipRateLimit();
|
78
|
-
return minRate.toNumber();
|
87
|
+
return BigNumber.from(minRate).toNumber();
|
79
88
|
}
|
80
89
|
/**
|
81
90
|
* Gets the maximum allowed rate limit from the contract
|
@@ -83,7 +92,7 @@ class RLNContract {
|
|
83
92
|
*/
|
84
93
|
async getMaxRateLimit() {
|
85
94
|
const maxRate = await this.contract.maxMembershipRateLimit();
|
86
|
-
return maxRate.toNumber();
|
95
|
+
return BigNumber.from(maxRate).toNumber();
|
87
96
|
}
|
88
97
|
/**
|
89
98
|
* Gets the maximum total rate limit across all memberships
|
@@ -110,13 +119,14 @@ class RLNContract {
|
|
110
119
|
this.contract.maxTotalRateLimit(),
|
111
120
|
this.contract.currentTotalRateLimit()
|
112
121
|
]);
|
113
|
-
return maxTotal
|
122
|
+
return Number(maxTotal) - Number(currentTotal);
|
114
123
|
}
|
115
124
|
/**
|
116
125
|
* Updates the rate limit for future registrations
|
117
126
|
* @param newRateLimit The new rate limit to use
|
118
127
|
*/
|
119
128
|
async setRateLimit(newRateLimit) {
|
129
|
+
this.validateRateLimit(newRateLimit);
|
120
130
|
this.rateLimit = newRateLimit;
|
121
131
|
}
|
122
132
|
get members() {
|
@@ -129,11 +139,17 @@ class RLNContract {
|
|
129
139
|
}
|
130
140
|
return this._membersFilter;
|
131
141
|
}
|
132
|
-
get
|
133
|
-
if (!this.
|
134
|
-
throw Error("
|
142
|
+
get membershipErasedFilter() {
|
143
|
+
if (!this._membershipErasedFilter) {
|
144
|
+
throw Error("MembershipErased filter was not initialized.");
|
135
145
|
}
|
136
|
-
return this.
|
146
|
+
return this._membershipErasedFilter;
|
147
|
+
}
|
148
|
+
get membersExpiredFilter() {
|
149
|
+
if (!this._membersExpiredFilter) {
|
150
|
+
throw Error("MembersExpired filter was not initialized.");
|
151
|
+
}
|
152
|
+
return this._membersExpiredFilter;
|
137
153
|
}
|
138
154
|
async fetchMembers(rlnInstance, options = {}) {
|
139
155
|
const registeredMemberEvents = await queryFilter(this.contract, {
|
@@ -144,9 +160,18 @@ class RLNContract {
|
|
144
160
|
const removedMemberEvents = await queryFilter(this.contract, {
|
145
161
|
fromBlock: this.deployBlock,
|
146
162
|
...options,
|
147
|
-
membersFilter: this.
|
163
|
+
membersFilter: this.membershipErasedFilter
|
164
|
+
});
|
165
|
+
const expiredMemberEvents = await queryFilter(this.contract, {
|
166
|
+
fromBlock: this.deployBlock,
|
167
|
+
...options,
|
168
|
+
membersFilter: this.membersExpiredFilter
|
148
169
|
});
|
149
|
-
const events = [
|
170
|
+
const events = [
|
171
|
+
...registeredMemberEvents,
|
172
|
+
...removedMemberEvents,
|
173
|
+
...expiredMemberEvents
|
174
|
+
];
|
150
175
|
this.processEvents(rlnInstance, events);
|
151
176
|
}
|
152
177
|
processEvents(rlnInstance, events) {
|
@@ -156,8 +181,22 @@ class RLNContract {
|
|
156
181
|
if (!evt.args) {
|
157
182
|
return;
|
158
183
|
}
|
159
|
-
if (evt.event === "
|
160
|
-
|
184
|
+
if (evt.event === "MembershipErased" ||
|
185
|
+
evt.event === "MembershipExpired") {
|
186
|
+
let index = evt.args.index;
|
187
|
+
if (!index) {
|
188
|
+
return;
|
189
|
+
}
|
190
|
+
if (typeof index === "number" || typeof index === "string") {
|
191
|
+
index = BigNumber.from(index);
|
192
|
+
}
|
193
|
+
else {
|
194
|
+
log.error("Index is not a number or string", {
|
195
|
+
index,
|
196
|
+
event: evt
|
197
|
+
});
|
198
|
+
return;
|
199
|
+
}
|
161
200
|
const toRemoveVal = toRemoveTable.get(evt.blockNumber);
|
162
201
|
if (toRemoveVal != undefined) {
|
163
202
|
toRemoveVal.push(index.toNumber());
|
@@ -185,13 +224,17 @@ class RLNContract {
|
|
185
224
|
if (!evt.args)
|
186
225
|
return;
|
187
226
|
const _idCommitment = evt.args.idCommitment;
|
188
|
-
|
227
|
+
let index = evt.args.index;
|
189
228
|
if (!_idCommitment || !index) {
|
190
229
|
return;
|
191
230
|
}
|
231
|
+
if (typeof index === "number" || typeof index === "string") {
|
232
|
+
index = BigNumber.from(index);
|
233
|
+
}
|
192
234
|
const idCommitment = zeroPadLE(hexToBytes(_idCommitment), 32);
|
193
235
|
rlnInstance.zerokit.insertMember(idCommitment);
|
194
|
-
|
236
|
+
const numericIndex = index.toNumber();
|
237
|
+
this._members.set(numericIndex, {
|
195
238
|
index,
|
196
239
|
idCommitment: _idCommitment
|
197
240
|
});
|
@@ -213,18 +256,36 @@ class RLNContract {
|
|
213
256
|
});
|
214
257
|
}
|
215
258
|
subscribeToMembers(rlnInstance) {
|
216
|
-
this.contract.on(this.membersFilter, (_idCommitment,
|
259
|
+
this.contract.on(this.membersFilter, (_idCommitment, _membershipRateLimit, _index, event) => {
|
260
|
+
this.processEvents(rlnInstance, [event]);
|
261
|
+
});
|
262
|
+
this.contract.on(this.membershipErasedFilter, (_idCommitment, _membershipRateLimit, _index, event) => {
|
217
263
|
this.processEvents(rlnInstance, [event]);
|
218
264
|
});
|
219
|
-
this.contract.on(this.
|
265
|
+
this.contract.on(this.membersExpiredFilter, (_idCommitment, _membershipRateLimit, _index, event) => {
|
220
266
|
this.processEvents(rlnInstance, [event]);
|
221
267
|
});
|
222
268
|
}
|
223
269
|
async registerWithIdentity(identity) {
|
224
270
|
try {
|
225
271
|
log.info(`Registering identity with rate limit: ${this.rateLimit} messages/epoch`);
|
226
|
-
|
272
|
+
// Check if the ID commitment is already registered
|
273
|
+
const existingIndex = await this.getMemberIndex(identity.IDCommitmentBigInt.toString());
|
274
|
+
if (existingIndex) {
|
275
|
+
throw new Error(`ID commitment is already registered with index ${existingIndex}`);
|
276
|
+
}
|
277
|
+
// Check if there's enough remaining rate limit
|
278
|
+
const remainingRateLimit = await this.getRemainingTotalRateLimit();
|
279
|
+
if (remainingRateLimit < this.rateLimit) {
|
280
|
+
throw new Error(`Not enough remaining rate limit. Requested: ${this.rateLimit}, Available: ${remainingRateLimit}`);
|
281
|
+
}
|
282
|
+
const estimatedGas = await this.contract.estimateGas.register(identity.IDCommitmentBigInt, this.rateLimit, []);
|
283
|
+
const gasLimit = estimatedGas.add(10000);
|
284
|
+
const txRegisterResponse = await this.contract.register(identity.IDCommitmentBigInt, this.rateLimit, [], { gasLimit });
|
227
285
|
const txRegisterReceipt = await txRegisterResponse.wait();
|
286
|
+
if (txRegisterReceipt.status === 0) {
|
287
|
+
throw new Error("Transaction failed on-chain");
|
288
|
+
}
|
228
289
|
const memberRegistered = txRegisterReceipt.events?.find((event) => event.event === "MembershipRegistered");
|
229
290
|
if (!memberRegistered || !memberRegistered.args) {
|
230
291
|
log.error("Failed to register membership: No MembershipRegistered event found");
|
@@ -232,26 +293,51 @@ class RLNContract {
|
|
232
293
|
}
|
233
294
|
const decodedData = {
|
234
295
|
idCommitment: memberRegistered.args.idCommitment,
|
235
|
-
|
296
|
+
membershipRateLimit: memberRegistered.args.membershipRateLimit,
|
236
297
|
index: memberRegistered.args.index
|
237
298
|
};
|
238
299
|
log.info(`Successfully registered membership with index ${decodedData.index} ` +
|
239
|
-
`and rate limit ${decodedData.
|
300
|
+
`and rate limit ${decodedData.membershipRateLimit}`);
|
240
301
|
const network = await this.contract.provider.getNetwork();
|
241
302
|
const address = this.contract.address;
|
242
|
-
const membershipId = decodedData.index
|
303
|
+
const membershipId = Number(decodedData.index);
|
243
304
|
return {
|
244
305
|
identity,
|
245
306
|
membership: {
|
246
307
|
address,
|
247
308
|
treeIndex: membershipId,
|
248
|
-
chainId: network.chainId
|
309
|
+
chainId: network.chainId,
|
310
|
+
rateLimit: decodedData.membershipRateLimit.toNumber()
|
249
311
|
}
|
250
312
|
};
|
251
313
|
}
|
252
314
|
catch (error) {
|
253
|
-
|
254
|
-
|
315
|
+
if (error instanceof Error) {
|
316
|
+
const errorMessage = error.message;
|
317
|
+
log.error("registerWithIdentity - error message:", errorMessage);
|
318
|
+
log.error("registerWithIdentity - error stack:", error.stack);
|
319
|
+
// Try to extract more specific error information
|
320
|
+
if (errorMessage.includes("CannotExceedMaxTotalRateLimit")) {
|
321
|
+
throw new Error("Registration failed: Cannot exceed maximum total rate limit");
|
322
|
+
}
|
323
|
+
else if (errorMessage.includes("InvalidIdCommitment")) {
|
324
|
+
throw new Error("Registration failed: Invalid ID commitment");
|
325
|
+
}
|
326
|
+
else if (errorMessage.includes("InvalidMembershipRateLimit")) {
|
327
|
+
throw new Error("Registration failed: Invalid membership rate limit");
|
328
|
+
}
|
329
|
+
else if (errorMessage.includes("execution reverted")) {
|
330
|
+
throw new Error("Contract execution reverted. Check contract requirements.");
|
331
|
+
}
|
332
|
+
else {
|
333
|
+
throw new Error(`Error in registerWithIdentity: ${errorMessage}`);
|
334
|
+
}
|
335
|
+
}
|
336
|
+
else {
|
337
|
+
throw new Error("Unknown error in registerWithIdentity", {
|
338
|
+
cause: error
|
339
|
+
});
|
340
|
+
}
|
255
341
|
}
|
256
342
|
}
|
257
343
|
/**
|
@@ -287,20 +373,21 @@ class RLNContract {
|
|
287
373
|
}
|
288
374
|
const decodedData = {
|
289
375
|
idCommitment: memberRegistered.args.idCommitment,
|
290
|
-
|
376
|
+
membershipRateLimit: memberRegistered.args.membershipRateLimit,
|
291
377
|
index: memberRegistered.args.index
|
292
378
|
};
|
293
379
|
log.info(`Successfully registered membership with permit. Index: ${decodedData.index}, ` +
|
294
|
-
`Rate limit: ${decodedData.
|
380
|
+
`Rate limit: ${decodedData.membershipRateLimit}, Erased ${idCommitmentsToErase.length} commitments`);
|
295
381
|
const network = await this.contract.provider.getNetwork();
|
296
382
|
const address = this.contract.address;
|
297
|
-
const membershipId = decodedData.index.toNumber();
|
383
|
+
const membershipId = BigNumber.from(decodedData.index).toNumber();
|
298
384
|
return {
|
299
385
|
identity,
|
300
386
|
membership: {
|
301
387
|
address,
|
302
388
|
treeIndex: membershipId,
|
303
|
-
chainId: network.chainId
|
389
|
+
chainId: network.chainId,
|
390
|
+
rateLimit: decodedData.membershipRateLimit.toNumber()
|
304
391
|
}
|
305
392
|
};
|
306
393
|
}
|
@@ -357,11 +444,8 @@ class RLNContract {
|
|
357
444
|
async eraseMembership(idCommitment, eraseFromMembershipSet = true) {
|
358
445
|
return this.contract.eraseMemberships([idCommitment], eraseFromMembershipSet);
|
359
446
|
}
|
360
|
-
async registerMembership(idCommitment, rateLimit =
|
361
|
-
|
362
|
-
rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
|
363
|
-
throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE}`);
|
364
|
-
}
|
447
|
+
async registerMembership(idCommitment, rateLimit = this.rateLimit) {
|
448
|
+
this.validateRateLimit(rateLimit);
|
365
449
|
return this.contract.register(idCommitment, rateLimit, []);
|
366
450
|
}
|
367
451
|
async getMemberIndex(idCommitment) {
|