@waku/rln 0.1.5-1d384f2.0 → 0.1.5-1e590d7.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/_virtual/utils.js +2 -2
- package/bundle/_virtual/utils2.js +2 -2
- package/bundle/index.js +2 -1
- package/bundle/packages/rln/dist/contract/constants.js +1 -0
- package/bundle/packages/rln/dist/contract/rln_base_contract.js +66 -61
- package/bundle/packages/rln/dist/contract/rln_contract.js +1 -1
- package/bundle/packages/rln/dist/utils/bytes.js +8 -2
- package/bundle/packages/rln/dist/utils/metamask.js +2 -2
- package/bundle/packages/rln/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js +1 -1
- package/bundle/packages/rln/node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js +2 -2
- package/bundle/packages/rln/node_modules/@noble/hashes/_sha2.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/hmac.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/pbkdf2.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/scrypt.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/sha256.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/sha512.js +1 -1
- package/bundle/packages/rln/node_modules/@noble/hashes/utils.js +1 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/contract/index.d.ts +1 -0
- package/dist/contract/index.js +1 -0
- package/dist/contract/index.js.map +1 -1
- package/dist/contract/rln_base_contract.d.ts +5 -11
- package/dist/contract/rln_base_contract.js +64 -59
- package/dist/contract/rln_base_contract.js.map +1 -1
- package/dist/contract/types.d.ts +5 -0
- package/dist/contract/types.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/keystore/keystore.js.map +1 -1
- package/dist/keystore/types.d.ts +2 -2
- package/dist/utils/bytes.js +8 -2
- package/dist/utils/bytes.js.map +1 -1
- package/package.json +1 -1
- package/src/contract/index.ts +1 -0
- package/src/contract/rln_base_contract.ts +96 -89
- package/src/contract/types.ts +5 -0
- package/src/index.ts +3 -1
- package/src/keystore/keystore.ts +4 -2
- package/src/keystore/types.ts +2 -2
- package/src/utils/bytes.ts +10 -2
- package/bundle/_virtual/__node-resolve_empty.js +0 -6
- package/bundle/_virtual/_node-resolve_empty.js +0 -3
- package/bundle/_virtual/bn.js +0 -3
- package/bundle/_virtual/common.js +0 -3
- package/bundle/_virtual/common2.js +0 -3
- package/bundle/_virtual/hash.js +0 -3
- package/bundle/_virtual/inherits_browser.js +0 -3
- package/bundle/_virtual/ripemd.js +0 -3
- package/bundle/_virtual/sha.js +0 -3
- package/bundle/_virtual/sha3.js +0 -3
- package/bundle/_virtual/utils3.js +0 -3
- package/bundle/node_modules/@ethersproject/abi/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/abi/lib.esm/abi-coder.js +0 -96
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js +0 -148
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/address.js +0 -26
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/anonymous.js +0 -20
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/array.js +0 -210
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/boolean.js +0 -18
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/bytes.js +0 -30
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/fixed-bytes.js +0 -26
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/null.js +0 -22
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/number.js +0 -43
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/string.js +0 -19
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/tuple.js +0 -58
- package/bundle/node_modules/@ethersproject/abi/lib.esm/fragments.js +0 -854
- package/bundle/node_modules/@ethersproject/abi/lib.esm/interface.js +0 -609
- package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/index.js +0 -66
- package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/index.js +0 -302
- package/bundle/node_modules/@ethersproject/address/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/address/lib.esm/index.js +0 -110
- package/bundle/node_modules/@ethersproject/base64/lib.esm/base64.js +0 -20
- package/bundle/node_modules/@ethersproject/basex/lib.esm/index.js +0 -120
- package/bundle/node_modules/@ethersproject/bignumber/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/bignumber/lib.esm/bignumber.js +0 -287
- package/bundle/node_modules/@ethersproject/bytes/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/bytes/lib.esm/index.js +0 -402
- package/bundle/node_modules/@ethersproject/constants/lib.esm/addresses.js +0 -3
- package/bundle/node_modules/@ethersproject/constants/lib.esm/bignumbers.js +0 -8
- package/bundle/node_modules/@ethersproject/constants/lib.esm/hashes.js +0 -3
- package/bundle/node_modules/@ethersproject/contracts/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/contracts/lib.esm/index.js +0 -893
- package/bundle/node_modules/@ethersproject/hash/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/decoder.js +0 -256
- package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/include.js +0 -36
- package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/lib.js +0 -135
- package/bundle/node_modules/@ethersproject/hash/lib.esm/id.js +0 -8
- package/bundle/node_modules/@ethersproject/hash/lib.esm/namehash.js +0 -64
- package/bundle/node_modules/@ethersproject/hash/lib.esm/typed-data.js +0 -443
- package/bundle/node_modules/@ethersproject/keccak256/lib.esm/index.js +0 -8
- package/bundle/node_modules/@ethersproject/keccak256/node_modules/js-sha3/src/sha3.js +0 -660
- package/bundle/node_modules/@ethersproject/logger/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/logger/lib.esm/index.js +0 -352
- package/bundle/node_modules/@ethersproject/networks/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/networks/lib.esm/index.js +0 -248
- package/bundle/node_modules/@ethersproject/properties/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/properties/lib.esm/index.js +0 -127
- package/bundle/node_modules/@ethersproject/providers/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/providers/lib.esm/base-provider.js +0 -2007
- package/bundle/node_modules/@ethersproject/providers/lib.esm/formatter.js +0 -422
- package/bundle/node_modules/@ethersproject/providers/lib.esm/json-rpc-provider.js +0 -674
- package/bundle/node_modules/@ethersproject/providers/lib.esm/web3-provider.js +0 -132
- package/bundle/node_modules/@ethersproject/rlp/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/rlp/lib.esm/index.js +0 -120
- package/bundle/node_modules/@ethersproject/sha2/lib.esm/sha2.js +0 -8
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/elliptic.js +0 -2430
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/index.js +0 -76
- package/bundle/node_modules/@ethersproject/strings/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/strings/lib.esm/utf8.js +0 -219
- package/bundle/node_modules/@ethersproject/transactions/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/transactions/lib.esm/index.js +0 -279
- package/bundle/node_modules/@ethersproject/web/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/web/lib.esm/geturl.js +0 -69
- package/bundle/node_modules/@ethersproject/web/lib.esm/index.js +0 -404
- package/bundle/node_modules/bech32/index.js +0 -187
- package/bundle/node_modules/bn.js/lib/bn.js +0 -3361
- package/bundle/node_modules/hash.js/lib/hash/common.js +0 -97
- package/bundle/node_modules/hash.js/lib/hash/hmac.js +0 -51
- package/bundle/node_modules/hash.js/lib/hash/ripemd.js +0 -152
- package/bundle/node_modules/hash.js/lib/hash/sha/1.js +0 -81
- package/bundle/node_modules/hash.js/lib/hash/sha/224.js +0 -33
- package/bundle/node_modules/hash.js/lib/hash/sha/256.js +0 -113
- package/bundle/node_modules/hash.js/lib/hash/sha/384.js +0 -39
- package/bundle/node_modules/hash.js/lib/hash/sha/512.js +0 -336
- package/bundle/node_modules/hash.js/lib/hash/sha/common.js +0 -53
- package/bundle/node_modules/hash.js/lib/hash/sha.js +0 -14
- package/bundle/node_modules/hash.js/lib/hash/utils.js +0 -282
- package/bundle/node_modules/hash.js/lib/hash.js +0 -33
- package/bundle/node_modules/inherits/inherits_browser.js +0 -33
- package/bundle/node_modules/minimalistic-assert/index.js +0 -13
@@ -33,15 +33,6 @@ export class RLNBaseContract {
|
|
33
33
|
* Allows injecting a mocked contract for testing purposes.
|
34
34
|
*/
|
35
35
|
public constructor(options: RLNContractInitOptions) {
|
36
|
-
// Initialize members and subscriptions
|
37
|
-
this.fetchMembers()
|
38
|
-
.then(() => {
|
39
|
-
this.subscribeToMembers();
|
40
|
-
})
|
41
|
-
.catch((error) => {
|
42
|
-
log.error("Failed to initialize members", { error });
|
43
|
-
});
|
44
|
-
|
45
36
|
const {
|
46
37
|
address,
|
47
38
|
signer,
|
@@ -49,15 +40,38 @@ export class RLNBaseContract {
|
|
49
40
|
contract
|
50
41
|
} = options;
|
51
42
|
|
52
|
-
|
43
|
+
log.info("Initializing RLNBaseContract", { address, rateLimit });
|
53
44
|
|
54
45
|
this.contract = contract || new ethers.Contract(address, RLN_ABI, signer);
|
55
46
|
this.rateLimit = rateLimit;
|
56
47
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
48
|
+
try {
|
49
|
+
log.info("Setting up event filters");
|
50
|
+
// Initialize event filters
|
51
|
+
this._membersFilter = this.contract.filters.MembershipRegistered();
|
52
|
+
this._membershipErasedFilter = this.contract.filters.MembershipErased();
|
53
|
+
this._membersExpiredFilter = this.contract.filters.MembershipExpired();
|
54
|
+
log.info("Event filters initialized successfully");
|
55
|
+
} catch (error) {
|
56
|
+
log.error("Failed to initialize event filters", { error });
|
57
|
+
throw new Error(
|
58
|
+
"Failed to initialize event filters: " + (error as Error).message
|
59
|
+
);
|
60
|
+
}
|
61
|
+
|
62
|
+
// Initialize members and subscriptions
|
63
|
+
this.fetchMembers()
|
64
|
+
.then(() => {
|
65
|
+
this.subscribeToMembers();
|
66
|
+
})
|
67
|
+
.catch((error) => {
|
68
|
+
log.error("Failed to initialize members", { error });
|
69
|
+
});
|
70
|
+
|
71
|
+
// Validate rate limit asynchronously
|
72
|
+
this.validateRateLimit(rateLimit).catch((error) => {
|
73
|
+
log.error("Failed to validate initial rate limit", { error });
|
74
|
+
});
|
61
75
|
}
|
62
76
|
|
63
77
|
/**
|
@@ -134,7 +148,7 @@ export class RLNBaseContract {
|
|
134
148
|
* @param newRateLimit The new rate limit to use
|
135
149
|
*/
|
136
150
|
public async setRateLimit(newRateLimit: number): Promise<void> {
|
137
|
-
this.validateRateLimit(newRateLimit);
|
151
|
+
await this.validateRateLimit(newRateLimit);
|
138
152
|
this.rateLimit = newRateLimit;
|
139
153
|
}
|
140
154
|
|
@@ -324,7 +338,7 @@ export class RLNBaseContract {
|
|
324
338
|
this.contract.on(
|
325
339
|
this.membersFilter,
|
326
340
|
(
|
327
|
-
_idCommitment:
|
341
|
+
_idCommitment: bigint,
|
328
342
|
_membershipRateLimit: ethers.BigNumber,
|
329
343
|
_index: ethers.BigNumber,
|
330
344
|
event: ethers.Event
|
@@ -336,7 +350,7 @@ export class RLNBaseContract {
|
|
336
350
|
this.contract.on(
|
337
351
|
this.membershipErasedFilter,
|
338
352
|
(
|
339
|
-
_idCommitment:
|
353
|
+
_idCommitment: bigint,
|
340
354
|
_membershipRateLimit: ethers.BigNumber,
|
341
355
|
_index: ethers.BigNumber,
|
342
356
|
event: ethers.Event
|
@@ -348,7 +362,7 @@ export class RLNBaseContract {
|
|
348
362
|
this.contract.on(
|
349
363
|
this.membersExpiredFilter,
|
350
364
|
(
|
351
|
-
_idCommitment:
|
365
|
+
_idCommitment: bigint,
|
352
366
|
_membershipRateLimit: ethers.BigNumber,
|
353
367
|
_index: ethers.BigNumber,
|
354
368
|
event: ethers.Event
|
@@ -358,94 +372,82 @@ export class RLNBaseContract {
|
|
358
372
|
);
|
359
373
|
}
|
360
374
|
|
361
|
-
/**
|
362
|
-
* Helper method to get remaining messages in current epoch
|
363
|
-
* @param membershipId The ID of the membership to check
|
364
|
-
* @returns number of remaining messages allowed in current epoch
|
365
|
-
*/
|
366
|
-
public async getRemainingMessages(membershipId: number): Promise<number> {
|
367
|
-
try {
|
368
|
-
const [startTime, , rateLimit] =
|
369
|
-
await this.contract.getMembershipInfo(membershipId);
|
370
|
-
|
371
|
-
// Calculate current epoch
|
372
|
-
const currentTime = Math.floor(Date.now() / 1000);
|
373
|
-
const epochsPassed = Math.floor(
|
374
|
-
(currentTime - startTime) / RATE_LIMIT_PARAMS.EPOCH_LENGTH
|
375
|
-
);
|
376
|
-
const currentEpochStart =
|
377
|
-
startTime + epochsPassed * RATE_LIMIT_PARAMS.EPOCH_LENGTH;
|
378
|
-
|
379
|
-
// Get message count in current epoch using contract's function
|
380
|
-
const messageCount = await this.contract.getMessageCount(
|
381
|
-
membershipId,
|
382
|
-
currentEpochStart
|
383
|
-
);
|
384
|
-
return Math.max(
|
385
|
-
0,
|
386
|
-
ethers.BigNumber.from(rateLimit)
|
387
|
-
.sub(ethers.BigNumber.from(messageCount))
|
388
|
-
.toNumber()
|
389
|
-
);
|
390
|
-
} catch (error) {
|
391
|
-
log.error(
|
392
|
-
`Error getting remaining messages: ${(error as Error).message}`
|
393
|
-
);
|
394
|
-
return 0; // Fail safe: assume no messages remaining on error
|
395
|
-
}
|
396
|
-
}
|
397
|
-
|
398
375
|
public async getMembershipInfo(
|
399
|
-
|
376
|
+
idCommitmentBigInt: bigint
|
400
377
|
): Promise<MembershipInfo | undefined> {
|
401
378
|
try {
|
402
|
-
const
|
403
|
-
await this.contract.
|
379
|
+
const membershipData =
|
380
|
+
await this.contract.memberships(idCommitmentBigInt);
|
404
381
|
const currentBlock = await this.contract.provider.getBlockNumber();
|
382
|
+
const [
|
383
|
+
depositAmount,
|
384
|
+
activeDuration,
|
385
|
+
gracePeriodStartTimestamp,
|
386
|
+
gracePeriodDuration,
|
387
|
+
rateLimit,
|
388
|
+
index,
|
389
|
+
holder,
|
390
|
+
token
|
391
|
+
] = membershipData;
|
392
|
+
|
393
|
+
const gracePeriodEnd = gracePeriodStartTimestamp.add(gracePeriodDuration);
|
405
394
|
|
406
395
|
let state: MembershipState;
|
407
|
-
if (currentBlock <
|
396
|
+
if (currentBlock < gracePeriodStartTimestamp.toNumber()) {
|
408
397
|
state = MembershipState.Active;
|
409
|
-
} else if (currentBlock <
|
398
|
+
} else if (currentBlock < gracePeriodEnd.toNumber()) {
|
410
399
|
state = MembershipState.GracePeriod;
|
411
400
|
} else {
|
412
401
|
state = MembershipState.Expired;
|
413
402
|
}
|
414
403
|
|
415
|
-
const index = await this.getMemberIndex(idCommitment);
|
416
|
-
if (!index) return undefined;
|
417
|
-
|
418
404
|
return {
|
419
405
|
index,
|
420
|
-
idCommitment,
|
421
|
-
rateLimit: rateLimit
|
422
|
-
startBlock:
|
423
|
-
endBlock:
|
424
|
-
state
|
406
|
+
idCommitment: idCommitmentBigInt.toString(),
|
407
|
+
rateLimit: Number(rateLimit),
|
408
|
+
startBlock: gracePeriodStartTimestamp.toNumber(),
|
409
|
+
endBlock: gracePeriodEnd.toNumber(),
|
410
|
+
state,
|
411
|
+
depositAmount,
|
412
|
+
activeDuration,
|
413
|
+
gracePeriodDuration,
|
414
|
+
holder,
|
415
|
+
token
|
425
416
|
};
|
426
417
|
} catch (error) {
|
418
|
+
log.error("Error in getMembershipInfo:", error);
|
427
419
|
return undefined;
|
428
420
|
}
|
429
421
|
}
|
430
422
|
|
431
423
|
public async extendMembership(
|
432
|
-
|
424
|
+
idCommitmentBigInt: bigint
|
433
425
|
): Promise<ethers.ContractTransaction> {
|
434
|
-
|
426
|
+
const tx = await this.contract.extendMemberships([idCommitmentBigInt]);
|
427
|
+
await tx.wait();
|
428
|
+
return tx;
|
435
429
|
}
|
436
430
|
|
437
431
|
public async eraseMembership(
|
438
|
-
|
432
|
+
idCommitmentBigInt: bigint,
|
439
433
|
eraseFromMembershipSet: boolean = true
|
440
434
|
): Promise<ethers.ContractTransaction> {
|
441
|
-
|
442
|
-
[
|
443
|
-
|
435
|
+
const estimatedGas = await this.contract.estimateGas[
|
436
|
+
"eraseMemberships(uint256[],bool)"
|
437
|
+
]([idCommitmentBigInt], eraseFromMembershipSet);
|
438
|
+
const gasLimit = estimatedGas.add(10000);
|
439
|
+
|
440
|
+
const tx = await this.contract["eraseMemberships(uint256[],bool)"](
|
441
|
+
[idCommitmentBigInt],
|
442
|
+
eraseFromMembershipSet,
|
443
|
+
{ gasLimit }
|
444
444
|
);
|
445
|
+
await tx.wait();
|
446
|
+
return tx;
|
445
447
|
}
|
446
448
|
|
447
449
|
public async registerMembership(
|
448
|
-
|
450
|
+
idCommitmentBigInt: bigint,
|
449
451
|
rateLimit: number = DEFAULT_RATE_LIMIT
|
450
452
|
): Promise<ethers.ContractTransaction> {
|
451
453
|
if (
|
@@ -456,12 +458,12 @@ export class RLNBaseContract {
|
|
456
458
|
`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE}`
|
457
459
|
);
|
458
460
|
}
|
459
|
-
return this.contract.register(
|
461
|
+
return this.contract.register(idCommitmentBigInt, rateLimit, []);
|
460
462
|
}
|
461
463
|
|
462
|
-
public async withdraw(token: string,
|
464
|
+
public async withdraw(token: string, from: string): Promise<void> {
|
463
465
|
try {
|
464
|
-
const tx = await this.contract.withdraw(token,
|
466
|
+
const tx = await this.contract.withdraw(token, from);
|
465
467
|
await tx.wait();
|
466
468
|
} catch (error) {
|
467
469
|
log.error(`Error in withdraw: ${(error as Error).message}`);
|
@@ -478,7 +480,7 @@ export class RLNBaseContract {
|
|
478
480
|
|
479
481
|
// Check if the ID commitment is already registered
|
480
482
|
const existingIndex = await this.getMemberIndex(
|
481
|
-
identity.IDCommitmentBigInt
|
483
|
+
identity.IDCommitmentBigInt
|
482
484
|
);
|
483
485
|
if (existingIndex) {
|
484
486
|
throw new Error(
|
@@ -516,7 +518,7 @@ export class RLNBaseContract {
|
|
516
518
|
}
|
517
519
|
|
518
520
|
const memberRegistered = txRegisterReceipt.events?.find(
|
519
|
-
(event) => event.event === "MembershipRegistered"
|
521
|
+
(event: ethers.Event) => event.event === "MembershipRegistered"
|
520
522
|
);
|
521
523
|
|
522
524
|
if (!memberRegistered || !memberRegistered.args) {
|
@@ -610,7 +612,7 @@ export class RLNBaseContract {
|
|
610
612
|
const txRegisterReceipt = await txRegisterResponse.wait();
|
611
613
|
|
612
614
|
const memberRegistered = txRegisterReceipt.events?.find(
|
613
|
-
(event) => event.event === "MembershipRegistered"
|
615
|
+
(event: ethers.Event) => event.event === "MembershipRegistered"
|
614
616
|
);
|
615
617
|
|
616
618
|
if (!memberRegistered || !memberRegistered.args) {
|
@@ -656,13 +658,18 @@ export class RLNBaseContract {
|
|
656
658
|
* Validates that the rate limit is within the allowed range
|
657
659
|
* @throws Error if the rate limit is outside the allowed range
|
658
660
|
*/
|
659
|
-
private validateRateLimit(rateLimit: number): void {
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
)
|
661
|
+
private async validateRateLimit(rateLimit: number): Promise<void> {
|
662
|
+
const [minRate, maxRate] = await Promise.all([
|
663
|
+
this.contract.minMembershipRateLimit(),
|
664
|
+
this.contract.maxMembershipRateLimit()
|
665
|
+
]);
|
666
|
+
|
667
|
+
const minRateNum = ethers.BigNumber.from(minRate).toNumber();
|
668
|
+
const maxRateNum = ethers.BigNumber.from(maxRate).toNumber();
|
669
|
+
|
670
|
+
if (rateLimit < minRateNum || rateLimit > maxRateNum) {
|
664
671
|
throw new Error(
|
665
|
-
`Rate limit must be between ${
|
672
|
+
`Rate limit must be between ${minRateNum} and ${maxRateNum} messages per epoch`
|
666
673
|
);
|
667
674
|
}
|
668
675
|
}
|
@@ -689,11 +696,11 @@ export class RLNBaseContract {
|
|
689
696
|
}
|
690
697
|
|
691
698
|
private async getMemberIndex(
|
692
|
-
|
699
|
+
idCommitmentBigInt: bigint
|
693
700
|
): Promise<ethers.BigNumber | undefined> {
|
694
701
|
try {
|
695
702
|
const events = await this.contract.queryFilter(
|
696
|
-
this.contract.filters.MembershipRegistered(
|
703
|
+
this.contract.filters.MembershipRegistered(idCommitmentBigInt)
|
697
704
|
);
|
698
705
|
if (events.length === 0) return undefined;
|
699
706
|
|
package/src/contract/types.ts
CHANGED
@@ -38,6 +38,11 @@ export interface MembershipInfo {
|
|
38
38
|
startBlock: number;
|
39
39
|
endBlock: number;
|
40
40
|
state: MembershipState;
|
41
|
+
depositAmount: ethers.BigNumber;
|
42
|
+
activeDuration: number;
|
43
|
+
gracePeriodDuration: number;
|
44
|
+
holder: string;
|
45
|
+
token: string;
|
41
46
|
}
|
42
47
|
|
43
48
|
export enum MembershipState {
|
package/src/index.ts
CHANGED
package/src/keystore/keystore.ts
CHANGED
@@ -21,8 +21,8 @@ import { isCredentialValid, isKeystoreValid } from "./schema_validator.js";
|
|
21
21
|
import type {
|
22
22
|
Keccak256Hash,
|
23
23
|
KeystoreEntity,
|
24
|
+
KeystoreMembershipInfo,
|
24
25
|
MembershipHash,
|
25
|
-
MembershipInfo,
|
26
26
|
Password,
|
27
27
|
Sha256Hash
|
28
28
|
} from "./types.js";
|
@@ -310,7 +310,9 @@ export class Keystore {
|
|
310
310
|
|
311
311
|
// follows nwaku implementation
|
312
312
|
// https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L111
|
313
|
-
private static computeMembershipHash(
|
313
|
+
private static computeMembershipHash(
|
314
|
+
info: KeystoreMembershipInfo
|
315
|
+
): MembershipHash {
|
314
316
|
return bytesToHex(
|
315
317
|
sha256(utf8ToBytes(`${info.chainId}${info.address}${info.treeIndex}`))
|
316
318
|
).toUpperCase();
|
package/src/keystore/types.ts
CHANGED
@@ -7,7 +7,7 @@ export type Password = string | Uint8Array;
|
|
7
7
|
|
8
8
|
// see reference
|
9
9
|
// https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L111
|
10
|
-
export type
|
10
|
+
export type KeystoreMembershipInfo = {
|
11
11
|
chainId: string;
|
12
12
|
address: string;
|
13
13
|
treeIndex: number;
|
@@ -16,7 +16,7 @@ export type MembershipInfo = {
|
|
16
16
|
|
17
17
|
export type KeystoreEntity = {
|
18
18
|
identity: IdentityCredential;
|
19
|
-
membership:
|
19
|
+
membership: KeystoreMembershipInfo;
|
20
20
|
};
|
21
21
|
|
22
22
|
export type DecryptedCredentials = KeystoreEntity;
|
package/src/utils/bytes.ts
CHANGED
@@ -65,8 +65,16 @@ export function buildBigIntFromUint8Array(
|
|
65
65
|
array: Uint8Array,
|
66
66
|
byteOffset: number = 0
|
67
67
|
): bigint {
|
68
|
-
|
69
|
-
|
68
|
+
// Convert byte array to BigInt in big-endian format (to match nwaku)
|
69
|
+
let result = 0n;
|
70
|
+
// Process all 32 bytes (or the available bytes if less)
|
71
|
+
const length = Math.min(array.length - byteOffset, 32);
|
72
|
+
|
73
|
+
for (let i = 0; i < length; i++) {
|
74
|
+
result = (result << 8n) | BigInt(array[byteOffset + i]);
|
75
|
+
}
|
76
|
+
|
77
|
+
return result;
|
70
78
|
}
|
71
79
|
|
72
80
|
/**
|
package/bundle/_virtual/bn.js
DELETED
package/bundle/_virtual/hash.js
DELETED
package/bundle/_virtual/sha.js
DELETED
package/bundle/_virtual/sha3.js
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
import { arrayify } from '../../bytes/lib.esm/index.js';
|
2
|
-
import { defineReadOnly } from '../../properties/lib.esm/index.js';
|
3
|
-
import { Logger } from '../../logger/lib.esm/index.js';
|
4
|
-
import { version } from './_version.js';
|
5
|
-
import { Reader, Writer } from './coders/abstract-coder.js';
|
6
|
-
import { AddressCoder } from './coders/address.js';
|
7
|
-
import { ArrayCoder } from './coders/array.js';
|
8
|
-
import { BooleanCoder } from './coders/boolean.js';
|
9
|
-
import { BytesCoder } from './coders/bytes.js';
|
10
|
-
import { FixedBytesCoder } from './coders/fixed-bytes.js';
|
11
|
-
import { NullCoder } from './coders/null.js';
|
12
|
-
import { NumberCoder } from './coders/number.js';
|
13
|
-
import { StringCoder } from './coders/string.js';
|
14
|
-
import { TupleCoder } from './coders/tuple.js';
|
15
|
-
import { ParamType } from './fragments.js';
|
16
|
-
|
17
|
-
const logger = new Logger(version);
|
18
|
-
const paramTypeBytes = new RegExp(/^bytes([0-9]*)$/);
|
19
|
-
const paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/);
|
20
|
-
class AbiCoder {
|
21
|
-
constructor(coerceFunc) {
|
22
|
-
defineReadOnly(this, "coerceFunc", coerceFunc || null);
|
23
|
-
}
|
24
|
-
_getCoder(param) {
|
25
|
-
switch (param.baseType) {
|
26
|
-
case "address":
|
27
|
-
return new AddressCoder(param.name);
|
28
|
-
case "bool":
|
29
|
-
return new BooleanCoder(param.name);
|
30
|
-
case "string":
|
31
|
-
return new StringCoder(param.name);
|
32
|
-
case "bytes":
|
33
|
-
return new BytesCoder(param.name);
|
34
|
-
case "array":
|
35
|
-
return new ArrayCoder(this._getCoder(param.arrayChildren), param.arrayLength, param.name);
|
36
|
-
case "tuple":
|
37
|
-
return new TupleCoder((param.components || []).map((component) => {
|
38
|
-
return this._getCoder(component);
|
39
|
-
}), param.name);
|
40
|
-
case "":
|
41
|
-
return new NullCoder(param.name);
|
42
|
-
}
|
43
|
-
// u?int[0-9]*
|
44
|
-
let match = param.type.match(paramTypeNumber);
|
45
|
-
if (match) {
|
46
|
-
let size = parseInt(match[2] || "256");
|
47
|
-
if (size === 0 || size > 256 || (size % 8) !== 0) {
|
48
|
-
logger.throwArgumentError("invalid " + match[1] + " bit length", "param", param);
|
49
|
-
}
|
50
|
-
return new NumberCoder(size / 8, (match[1] === "int"), param.name);
|
51
|
-
}
|
52
|
-
// bytes[0-9]+
|
53
|
-
match = param.type.match(paramTypeBytes);
|
54
|
-
if (match) {
|
55
|
-
let size = parseInt(match[1]);
|
56
|
-
if (size === 0 || size > 32) {
|
57
|
-
logger.throwArgumentError("invalid bytes length", "param", param);
|
58
|
-
}
|
59
|
-
return new FixedBytesCoder(size, param.name);
|
60
|
-
}
|
61
|
-
return logger.throwArgumentError("invalid type", "type", param.type);
|
62
|
-
}
|
63
|
-
_getWordSize() { return 32; }
|
64
|
-
_getReader(data, allowLoose) {
|
65
|
-
return new Reader(data, this._getWordSize(), this.coerceFunc, allowLoose);
|
66
|
-
}
|
67
|
-
_getWriter() {
|
68
|
-
return new Writer(this._getWordSize());
|
69
|
-
}
|
70
|
-
getDefaultValue(types) {
|
71
|
-
const coders = types.map((type) => this._getCoder(ParamType.from(type)));
|
72
|
-
const coder = new TupleCoder(coders, "_");
|
73
|
-
return coder.defaultValue();
|
74
|
-
}
|
75
|
-
encode(types, values) {
|
76
|
-
if (types.length !== values.length) {
|
77
|
-
logger.throwError("types/values length mismatch", Logger.errors.INVALID_ARGUMENT, {
|
78
|
-
count: { types: types.length, values: values.length },
|
79
|
-
value: { types: types, values: values }
|
80
|
-
});
|
81
|
-
}
|
82
|
-
const coders = types.map((type) => this._getCoder(ParamType.from(type)));
|
83
|
-
const coder = (new TupleCoder(coders, "_"));
|
84
|
-
const writer = this._getWriter();
|
85
|
-
coder.encode(writer, values);
|
86
|
-
return writer.data;
|
87
|
-
}
|
88
|
-
decode(types, data, loose) {
|
89
|
-
const coders = types.map((type) => this._getCoder(ParamType.from(type)));
|
90
|
-
const coder = new TupleCoder(coders, "_");
|
91
|
-
return coder.decode(this._getReader(arrayify(data), loose));
|
92
|
-
}
|
93
|
-
}
|
94
|
-
const defaultAbiCoder = new AbiCoder();
|
95
|
-
|
96
|
-
export { AbiCoder, defaultAbiCoder };
|