@waku/rln 0.1.5-6997987.0 → 0.1.5-731214b.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 -1
- package/bundle/packages/rln/dist/contract/constants.js +1 -0
- package/bundle/packages/rln/dist/contract/rln_base_contract.js +61 -52
- package/bundle/packages/rln/dist/credentials_manager.js +12 -30
- package/bundle/packages/rln/dist/keystore/keystore.js +10 -6
- package/bundle/packages/rln/dist/zerokit.js +5 -5
- 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 +2 -8
- package/dist/contract/rln_base_contract.js +61 -52
- 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/credentials_manager.d.ts +3 -9
- package/dist/credentials_manager.js +12 -30
- package/dist/credentials_manager.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 +10 -6
- package/dist/keystore/keystore.js.map +1 -1
- package/dist/keystore/types.d.ts +3 -3
- package/dist/rln.js.map +1 -1
- 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/index.ts +1 -0
- package/src/contract/rln_base_contract.ts +83 -74
- package/src/contract/types.ts +5 -0
- package/src/credentials_manager.ts +12 -36
- package/src/index.ts +3 -1
- package/src/keystore/keystore.ts +22 -12
- package/src/keystore/types.ts +3 -3
- package/src/rln.ts +1 -0
- package/src/zerokit.ts +3 -3
package/dist/zerokit.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"zerokit.js","sourceRoot":"","sources":["../src/zerokit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EACL,WAAW,EACX,WAAW,EACX,eAAe,EACf,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAE1B,MAAM,OAAO,OAAO;IAEC;IACA;IACA;IAHnB,YACmB,KAAa,EACb,iBAAoC,EACpC,
|
1
|
+
{"version":3,"file":"zerokit.js","sourceRoot":"","sources":["../src/zerokit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EACL,WAAW,EACX,WAAW,EACX,eAAe,EACf,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAE1B,MAAM,OAAO,OAAO;IAEC;IACA;IACA;IAHnB,YACmB,KAAa,EACb,iBAAoC,EACpC,aAAqB,kBAAkB;QAFvC,UAAK,GAAL,KAAK,CAAQ;QACb,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,eAAU,GAAV,UAAU,CAA6B;IACvD,CAAC;IAEJ,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAW,oBAAoB;QAC7B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEM,2BAA2B;QAChC,MAAM,OAAO,GAAG,UAAU,CAAC,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iDAAiD;QACvH,OAAO,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAEM,gCAAgC,CAAC,IAAY;QAClD,MAAM,aAAa,GAAG,IAAI,WAAW,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,iDAAiD;QACjD,MAAM,OAAO,GAAG,UAAU,CAAC,mCAAmC,CAC5D,IAAI,CAAC,KAAK,EACV,SAAS,CACV,CAAC;QACF,OAAO,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAEM,YAAY,CAAC,YAAwB;QAC1C,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACpD,CAAC;IAEM,aAAa,CAClB,KAAa,EACb,GAAG,aAAgC;QAEnC,kDAAkD;QAClD,0EAA0E;QAC1E,MAAM,eAAe,GAAG,WAAW,CACjC,IAAI,UAAU,CAAC,CAAC,CAAC,EACjB,aAAa,CAAC,MAAM,EACpB,CAAC,EACD,CAAC,CACF,CAAC;QACF,MAAM,iBAAiB,GAAG,WAAW,CAAC,eAAe,EAAE,GAAG,aAAa,CAAC,CAAC;QACzE,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACjE,CAAC;IAEM,YAAY,CAAC,KAAa;QAC/B,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEM,aAAa;QAClB,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAEM,gBAAgB,CACrB,QAAoB,EACpB,QAAgB,EAChB,KAAiB,EACjB,KAAiB,EACjB,SAAkB;QAElB,2BAA2B;QAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,cAAc,GAAG,WAAW,CAChC,IAAI,UAAU,CAAC,CAAC,CAAC,EACjB,SAAS,IAAI,IAAI,CAAC,SAAS,EAC3B,CAAC,EACD,CAAC,CACF,CAAC;QAEF,yFAAyF;QACzF,OAAO,WAAW,CAChB,KAAK,EACL,aAAa,EACb,KAAK,EACL,MAAM,EACN,QAAQ,EACR,cAAc,CACf,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAC3B,GAAe,EACf,KAAa,EACb,KAAoC,EACpC,YAAwB,EACxB,SAAkB;QAElB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YACjC,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,kBAAkB,GAAG,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;QAEvD,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAC1D,IAAI,YAAY,CAAC,MAAM,KAAK,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC1E,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACrD,IACE,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ;YAC/C,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,EAC/C,CAAC;YACD,MAAM,IAAI,KAAK,CACb,8BAA8B,iBAAiB,CAAC,QAAQ,QAAQ,iBAAiB,CAAC,QAAQ,EAAE,CAC7F,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAC1C,GAAG,EACH,KAAK,EACL,KAAK,EACL,YAAY,EACZ,kBAAkB,CACnB,CAAC;QACF,MAAM,UAAU,GAAG,UAAU,CAAC,uBAAuB,CACnD,IAAI,CAAC,KAAK,EACV,cAAc,CACf,CAAC;QACF,MAAM,MAAM,GAAG,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACnE,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CACrE,MAAM,EACN,KAAK,CACN,CAAC;QAEF,MAAM,UAAU,GAAG,UAAU,CAAC,+BAA+B,CAC3D,IAAI,CAAC,KAAK,EACV,iBAAiB,EACjB,UAAU,CACX,CAAC;QAEF,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAEM,cAAc,CACnB,KAAmC,EACnC,GAAe,EACf,SAAkB;QAElB,IAAI,MAAkB,CAAC;QACvB,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,2BAA2B;QAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,cAAc,GAAG,WAAW,CAChC,IAAI,UAAU,CAAC,CAAC,CAAC,EACjB,SAAS,IAAI,IAAI,CAAC,SAAS,EAC3B,CAAC,EACD,CAAC,CACF,CAAC;QAEF,OAAO,UAAU,CAAC,cAAc,CAC9B,IAAI,CAAC,KAAK,EACV,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,CAAC,CACjD,CAAC;IACJ,CAAC;IAEM,eAAe,CACpB,KAAmC,EACnC,GAAe,EACf,KAAwB,EACxB,SAAkB;QAElB,IAAI,MAAkB,CAAC;QACvB,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,2BAA2B;QAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,cAAc,GAAG,WAAW,CAChC,IAAI,UAAU,CAAC,CAAC,CAAC,EACjB,SAAS,IAAI,IAAI,CAAC,SAAS,EAC3B,CAAC,EACD,CAAC,CACF,CAAC;QAEF,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,KAAK,CAAC,CAAC;QAEzC,OAAO,UAAU,CAAC,eAAe,CAC/B,IAAI,CAAC,KAAK,EACV,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,CAAC,EAChD,UAAU,CACX,CAAC;IACJ,CAAC;IAEM,gBAAgB,CACrB,KAAmC,EACnC,GAAe,EACf,SAAkB;QAElB,IAAI,MAAkB,CAAC;QACvB,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,2BAA2B;QAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,cAAc,GAAG,WAAW,CAChC,IAAI,UAAU,CAAC,CAAC,CAAC,EACjB,SAAS,IAAI,IAAI,CAAC,SAAS,EAC3B,CAAC,EACD,CAAC,CACF,CAAC;QAEF,OAAO,UAAU,CAAC,eAAe,CAC/B,IAAI,CAAC,KAAK,EACV,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,CAAC,EAChD,IAAI,UAAU,EAAE,CACjB,CAAC;IACJ,CAAC;CACF"}
|
package/package.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"name":"@waku/rln","version":"0.1.5-
|
1
|
+
{"name":"@waku/rln","version":"0.1.5-731214b.0","description":"RLN (Rate Limiting Nullifier) implementation for Waku","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"type":"module","homepage":"https://github.com/waku-org/js-waku/tree/master/packages/rln#readme","repository":{"type":"git","url":"https://github.com/waku-org/js-waku.git"},"bugs":{"url":"https://github.com/waku-org/js-waku/issues"},"license":"MIT OR Apache-2.0","keywords":["waku","rln","rate-limiting","privacy","web3"],"scripts":{"build":"run-s build:**","build:copy":"mkdir -p dist/resources && cp -r src/resources/* dist/resources/","build:esm":"tsc","build:bundle":"rollup --config rollup.config.js","fix":"run-s fix:*","fix:lint":"eslint src *.js --fix","check":"run-s check:*","check:tsc":"tsc -p tsconfig.dev.json","check:lint":"eslint \"src/!(resources)/**/*.{ts,js}\" *.js","check:spelling":"cspell \"{README.md,src/**/*.ts}\"","test":"NODE_ENV=test run-s test:*","test:browser":"karma start karma.conf.cjs","watch:build":"tsc -p tsconfig.json -w","watch:test":"mocha --watch","prepublish":"npm run build","reset-hard":"git clean -dfx -e .idea && git reset --hard && npm i && npm run build"},"engines":{"node":">=20"},"devDependencies":{"@rollup/plugin-commonjs":"^25.0.7","@rollup/plugin-json":"^6.0.0","@rollup/plugin-node-resolve":"^15.2.3","@types/chai":"^5.0.1","@types/chai-spies":"^1.0.6","@types/deep-equal-in-any-order":"^1.0.4","@types/lodash":"^4.17.15","@types/sinon":"^17.0.3","@waku/build-utils":"^1.0.0","@waku/message-encryption":"0.0.33-731214b.0","deep-equal-in-any-order":"^2.0.6","fast-check":"^3.23.2","rollup-plugin-copy":"^3.5.0"},"files":["dist","bundle","src/**/*.ts","!**/*.spec.*","!**/*.json","CHANGELOG.md","LICENSE","README.md"],"dependencies":{"@chainsafe/bls-keystore":"3.0.0","@waku/core":"0.0.35-731214b.0","@waku/utils":"0.0.23-731214b.0","@noble/hashes":"^1.2.0","@waku/zerokit-rln-wasm":"^0.0.13","ethereum-cryptography":"^3.1.0","ethers":"^5.7.2","lodash":"^4.17.21","uuid":"^11.0.5","chai":"^5.1.2","chai-as-promised":"^8.0.1","chai-spies":"^1.1.0","chai-subset":"^1.6.0","sinon":"^19.0.2"}}
|
package/src/contract/index.ts
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
/* eslint-disable no-console */
|
1
2
|
import { Logger } from "@waku/utils";
|
2
3
|
import { ethers } from "ethers";
|
3
4
|
|
@@ -33,15 +34,6 @@ export class RLNBaseContract {
|
|
33
34
|
* Allows injecting a mocked contract for testing purposes.
|
34
35
|
*/
|
35
36
|
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
37
|
const {
|
46
38
|
address,
|
47
39
|
signer,
|
@@ -49,15 +41,38 @@ export class RLNBaseContract {
|
|
49
41
|
contract
|
50
42
|
} = options;
|
51
43
|
|
52
|
-
|
44
|
+
log.info("Initializing RLNBaseContract", { address, rateLimit });
|
53
45
|
|
54
46
|
this.contract = contract || new ethers.Contract(address, RLN_ABI, signer);
|
55
47
|
this.rateLimit = rateLimit;
|
56
48
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
49
|
+
try {
|
50
|
+
log.info("Setting up event filters");
|
51
|
+
// Initialize event filters
|
52
|
+
this._membersFilter = this.contract.filters.MembershipRegistered();
|
53
|
+
this._membershipErasedFilter = this.contract.filters.MembershipErased();
|
54
|
+
this._membersExpiredFilter = this.contract.filters.MembershipExpired();
|
55
|
+
log.info("Event filters initialized successfully");
|
56
|
+
} catch (error) {
|
57
|
+
log.error("Failed to initialize event filters", { error });
|
58
|
+
throw new Error(
|
59
|
+
"Failed to initialize event filters: " + (error as Error).message
|
60
|
+
);
|
61
|
+
}
|
62
|
+
|
63
|
+
// Initialize members and subscriptions
|
64
|
+
this.fetchMembers()
|
65
|
+
.then(() => {
|
66
|
+
this.subscribeToMembers();
|
67
|
+
})
|
68
|
+
.catch((error) => {
|
69
|
+
log.error("Failed to initialize members", { error });
|
70
|
+
});
|
71
|
+
|
72
|
+
// Validate rate limit asynchronously
|
73
|
+
this.validateRateLimit(rateLimit).catch((error) => {
|
74
|
+
log.error("Failed to validate initial rate limit", { error });
|
75
|
+
});
|
61
76
|
}
|
62
77
|
|
63
78
|
/**
|
@@ -134,7 +149,7 @@ export class RLNBaseContract {
|
|
134
149
|
* @param newRateLimit The new rate limit to use
|
135
150
|
*/
|
136
151
|
public async setRateLimit(newRateLimit: number): Promise<void> {
|
137
|
-
this.validateRateLimit(newRateLimit);
|
152
|
+
await this.validateRateLimit(newRateLimit);
|
138
153
|
this.rateLimit = newRateLimit;
|
139
154
|
}
|
140
155
|
|
@@ -358,72 +373,61 @@ export class RLNBaseContract {
|
|
358
373
|
);
|
359
374
|
}
|
360
375
|
|
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
376
|
public async getMembershipInfo(
|
399
|
-
|
377
|
+
idCommitmentBigInt: bigint
|
400
378
|
): Promise<MembershipInfo | undefined> {
|
401
379
|
try {
|
402
|
-
|
403
|
-
|
380
|
+
console.log("idCommitmentBigInt", idCommitmentBigInt);
|
381
|
+
const membershipData =
|
382
|
+
await this.contract.memberships(idCommitmentBigInt);
|
404
383
|
const currentBlock = await this.contract.provider.getBlockNumber();
|
384
|
+
console.log("membershipData", membershipData);
|
385
|
+
|
386
|
+
const [
|
387
|
+
depositAmount,
|
388
|
+
activeDuration,
|
389
|
+
gracePeriodStartTimestamp,
|
390
|
+
gracePeriodDuration,
|
391
|
+
rateLimit,
|
392
|
+
index,
|
393
|
+
holder,
|
394
|
+
token
|
395
|
+
] = membershipData;
|
396
|
+
|
397
|
+
const gracePeriodEnd = gracePeriodStartTimestamp.add(gracePeriodDuration);
|
398
|
+
console.log("gracePeriodEnd", gracePeriodEnd);
|
405
399
|
|
406
400
|
let state: MembershipState;
|
407
|
-
if (currentBlock <
|
401
|
+
if (currentBlock < gracePeriodStartTimestamp.toNumber()) {
|
408
402
|
state = MembershipState.Active;
|
409
|
-
} else if (currentBlock <
|
403
|
+
} else if (currentBlock < gracePeriodEnd.toNumber()) {
|
410
404
|
state = MembershipState.GracePeriod;
|
411
405
|
} else {
|
412
406
|
state = MembershipState.Expired;
|
413
407
|
}
|
414
408
|
|
415
|
-
|
416
|
-
|
409
|
+
console.log("state", state);
|
410
|
+
console.log("index", index);
|
411
|
+
console.log("idCommitment", idCommitmentBigInt.toString());
|
412
|
+
console.log("rateLimit", rateLimit);
|
413
|
+
console.log("gracePeriodStartTimestamp", gracePeriodStartTimestamp);
|
414
|
+
console.log("gracePeriodEnd", gracePeriodEnd);
|
417
415
|
|
418
416
|
return {
|
419
417
|
index,
|
420
|
-
idCommitment,
|
421
|
-
rateLimit: rateLimit
|
422
|
-
startBlock:
|
423
|
-
endBlock:
|
424
|
-
state
|
418
|
+
idCommitment: idCommitmentBigInt.toString(),
|
419
|
+
rateLimit: Number(rateLimit),
|
420
|
+
startBlock: gracePeriodStartTimestamp.toNumber(),
|
421
|
+
endBlock: gracePeriodEnd.toNumber(),
|
422
|
+
state,
|
423
|
+
depositAmount,
|
424
|
+
activeDuration,
|
425
|
+
gracePeriodDuration,
|
426
|
+
holder,
|
427
|
+
token
|
425
428
|
};
|
426
429
|
} catch (error) {
|
430
|
+
console.error("Error in getMembershipInfo:", error);
|
427
431
|
return undefined;
|
428
432
|
}
|
429
433
|
}
|
@@ -459,9 +463,9 @@ export class RLNBaseContract {
|
|
459
463
|
return this.contract.register(idCommitment, rateLimit, []);
|
460
464
|
}
|
461
465
|
|
462
|
-
public async withdraw(token: string,
|
466
|
+
public async withdraw(token: string, from: string): Promise<void> {
|
463
467
|
try {
|
464
|
-
const tx = await this.contract.withdraw(token,
|
468
|
+
const tx = await this.contract.withdraw(token, from);
|
465
469
|
await tx.wait();
|
466
470
|
} catch (error) {
|
467
471
|
log.error(`Error in withdraw: ${(error as Error).message}`);
|
@@ -546,7 +550,7 @@ export class RLNBaseContract {
|
|
546
550
|
membership: {
|
547
551
|
address,
|
548
552
|
treeIndex: membershipId,
|
549
|
-
chainId: network.chainId,
|
553
|
+
chainId: network.chainId.toString(),
|
550
554
|
rateLimit: decodedData.membershipRateLimit.toNumber()
|
551
555
|
}
|
552
556
|
};
|
@@ -640,7 +644,7 @@ export class RLNBaseContract {
|
|
640
644
|
membership: {
|
641
645
|
address,
|
642
646
|
treeIndex: membershipId,
|
643
|
-
chainId: network.chainId,
|
647
|
+
chainId: network.chainId.toString(),
|
644
648
|
rateLimit: decodedData.membershipRateLimit.toNumber()
|
645
649
|
}
|
646
650
|
};
|
@@ -656,13 +660,18 @@ export class RLNBaseContract {
|
|
656
660
|
* Validates that the rate limit is within the allowed range
|
657
661
|
* @throws Error if the rate limit is outside the allowed range
|
658
662
|
*/
|
659
|
-
private validateRateLimit(rateLimit: number): void {
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
)
|
663
|
+
private async validateRateLimit(rateLimit: number): Promise<void> {
|
664
|
+
const [minRate, maxRate] = await Promise.all([
|
665
|
+
this.contract.minMembershipRateLimit(),
|
666
|
+
this.contract.maxMembershipRateLimit()
|
667
|
+
]);
|
668
|
+
|
669
|
+
const minRateNum = ethers.BigNumber.from(minRate).toNumber();
|
670
|
+
const maxRateNum = ethers.BigNumber.from(maxRate).toNumber();
|
671
|
+
|
672
|
+
if (rateLimit < minRateNum || rateLimit > maxRateNum) {
|
664
673
|
throw new Error(
|
665
|
-
`Rate limit must be between ${
|
674
|
+
`Rate limit must be between ${minRateNum} and ${maxRateNum} messages per epoch`
|
666
675
|
);
|
667
676
|
}
|
668
677
|
}
|
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 {
|
@@ -30,11 +30,11 @@ export class RLNCredentialsManager {
|
|
30
30
|
protected started = false;
|
31
31
|
protected starting = false;
|
32
32
|
|
33
|
-
|
34
|
-
|
33
|
+
public contract: undefined | RLNBaseContract;
|
34
|
+
public signer: undefined | ethers.Signer;
|
35
35
|
|
36
36
|
protected keystore = Keystore.create();
|
37
|
-
|
37
|
+
public credentials: undefined | DecryptedCredentials;
|
38
38
|
|
39
39
|
public zerokit: undefined | Zerokit;
|
40
40
|
|
@@ -43,30 +43,6 @@ export class RLNCredentialsManager {
|
|
43
43
|
this.zerokit = zerokit;
|
44
44
|
}
|
45
45
|
|
46
|
-
public get contract(): undefined | RLNBaseContract {
|
47
|
-
return this._contract;
|
48
|
-
}
|
49
|
-
|
50
|
-
public set contract(contract: RLNBaseContract | undefined) {
|
51
|
-
this._contract = contract;
|
52
|
-
}
|
53
|
-
|
54
|
-
public get signer(): undefined | ethers.Signer {
|
55
|
-
return this._signer;
|
56
|
-
}
|
57
|
-
|
58
|
-
public set signer(signer: ethers.Signer | undefined) {
|
59
|
-
this._signer = signer;
|
60
|
-
}
|
61
|
-
|
62
|
-
public get credentials(): undefined | DecryptedCredentials {
|
63
|
-
return this._credentials;
|
64
|
-
}
|
65
|
-
|
66
|
-
public set credentials(credentials: DecryptedCredentials | undefined) {
|
67
|
-
this._credentials = credentials;
|
68
|
-
}
|
69
|
-
|
70
46
|
public get provider(): undefined | ethers.providers.Provider {
|
71
47
|
return this.contract?.provider;
|
72
48
|
}
|
@@ -102,12 +78,12 @@ export class RLNCredentialsManager {
|
|
102
78
|
log.info("Using provided keystore");
|
103
79
|
}
|
104
80
|
|
105
|
-
this.
|
106
|
-
this.
|
107
|
-
this.
|
81
|
+
this.credentials = credentials;
|
82
|
+
this.signer = signer!;
|
83
|
+
this.contract = new RLNBaseContract({
|
108
84
|
address: address!,
|
109
85
|
signer: signer!,
|
110
|
-
rateLimit: rateLimit ?? this.zerokit?.
|
86
|
+
rateLimit: rateLimit ?? this.zerokit?.rateLimit
|
111
87
|
});
|
112
88
|
|
113
89
|
log.info("RLNCredentialsManager successfully started");
|
@@ -160,8 +136,8 @@ export class RLNCredentialsManager {
|
|
160
136
|
*/
|
161
137
|
public async useCredentials(id: string, password: Password): Promise<void> {
|
162
138
|
log.info(`Attempting to use credentials with ID: ${id}`);
|
163
|
-
this.
|
164
|
-
if (this.
|
139
|
+
this.credentials = await this.keystore?.readCredential(id, password);
|
140
|
+
if (this.credentials) {
|
165
141
|
log.info("Successfully loaded credentials");
|
166
142
|
} else {
|
167
143
|
log.warn("Failed to load credentials");
|
@@ -179,7 +155,7 @@ export class RLNCredentialsManager {
|
|
179
155
|
LINEA_CONTRACT.address;
|
180
156
|
|
181
157
|
if (address === LINEA_CONTRACT.address) {
|
182
|
-
chainId = LINEA_CONTRACT.chainId;
|
158
|
+
chainId = LINEA_CONTRACT.chainId.toString();
|
183
159
|
log.info(`Using Linea contract with chainId: ${chainId}`);
|
184
160
|
}
|
185
161
|
|
@@ -187,7 +163,7 @@ export class RLNCredentialsManager {
|
|
187
163
|
const currentChainId = await signer.getChainId();
|
188
164
|
log.info(`Current chain ID: ${currentChainId}`);
|
189
165
|
|
190
|
-
if (chainId && chainId !== currentChainId) {
|
166
|
+
if (chainId && chainId !== currentChainId.toString()) {
|
191
167
|
log.error(
|
192
168
|
`Chain ID mismatch: contract=${chainId}, current=${currentChainId}`
|
193
169
|
);
|
@@ -260,7 +236,7 @@ export class RLNCredentialsManager {
|
|
260
236
|
const chainId = credentials.membership.chainId;
|
261
237
|
const network = await this.contract.provider.getNetwork();
|
262
238
|
const currentChainId = network.chainId;
|
263
|
-
if (chainId !== currentChainId) {
|
239
|
+
if (chainId !== currentChainId.toString()) {
|
264
240
|
throw Error(
|
265
241
|
`Failed to verify chain coordinates: credentials chainID=${chainId} is not equal to registryContract chainID=${currentChainId}`
|
266
242
|
);
|
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";
|
@@ -275,7 +275,7 @@ export class Keystore {
|
|
275
275
|
treeIndex: _.get(obj, "treeIndex"),
|
276
276
|
chainId: _.get(obj, "membershipContract.chainId"),
|
277
277
|
address: _.get(obj, "membershipContract.address"),
|
278
|
-
rateLimit: _.get(obj, "
|
278
|
+
rateLimit: _.get(obj, "userMessageLimit")
|
279
279
|
}
|
280
280
|
};
|
281
281
|
} catch (err) {
|
@@ -284,11 +284,18 @@ export class Keystore {
|
|
284
284
|
}
|
285
285
|
}
|
286
286
|
|
287
|
-
private static fromArraylikeToBytes(
|
288
|
-
|
289
|
-
|
290
|
-
|
287
|
+
private static fromArraylikeToBytes(
|
288
|
+
obj:
|
289
|
+
| number[]
|
290
|
+
| {
|
291
|
+
[key: number]: number;
|
292
|
+
}
|
293
|
+
): Uint8Array {
|
294
|
+
if (Array.isArray(obj)) {
|
295
|
+
return new Uint8Array(obj);
|
296
|
+
}
|
291
297
|
|
298
|
+
const bytes = [];
|
292
299
|
let index = 0;
|
293
300
|
let lastElement = obj[index];
|
294
301
|
|
@@ -303,7 +310,9 @@ export class Keystore {
|
|
303
310
|
|
304
311
|
// follows nwaku implementation
|
305
312
|
// https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L111
|
306
|
-
private static computeMembershipHash(
|
313
|
+
private static computeMembershipHash(
|
314
|
+
info: KeystoreMembershipInfo
|
315
|
+
): MembershipHash {
|
307
316
|
return bytesToHex(
|
308
317
|
sha256(utf8ToBytes(`${info.chainId}${info.address}${info.treeIndex}`))
|
309
318
|
).toUpperCase();
|
@@ -316,15 +325,16 @@ export class Keystore {
|
|
316
325
|
JSON.stringify({
|
317
326
|
treeIndex: options.membership.treeIndex,
|
318
327
|
identityCredential: {
|
319
|
-
idCommitment: options.identity.IDCommitment,
|
320
|
-
idNullifier: options.identity.IDNullifier,
|
321
|
-
idSecretHash: options.identity.IDSecretHash,
|
322
|
-
idTrapdoor: options.identity.IDTrapdoor
|
328
|
+
idCommitment: Array.from(options.identity.IDCommitment),
|
329
|
+
idNullifier: Array.from(options.identity.IDNullifier),
|
330
|
+
idSecretHash: Array.from(options.identity.IDSecretHash),
|
331
|
+
idTrapdoor: Array.from(options.identity.IDTrapdoor)
|
323
332
|
},
|
324
333
|
membershipContract: {
|
325
334
|
chainId: options.membership.chainId,
|
326
335
|
address: options.membership.address
|
327
|
-
}
|
336
|
+
},
|
337
|
+
userMessageLimit: options.membership.rateLimit
|
328
338
|
})
|
329
339
|
);
|
330
340
|
}
|
package/src/keystore/types.ts
CHANGED
@@ -7,8 +7,8 @@ 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
|
11
|
-
chainId:
|
10
|
+
export type KeystoreMembershipInfo = {
|
11
|
+
chainId: string;
|
12
12
|
address: string;
|
13
13
|
treeIndex: number;
|
14
14
|
rateLimit: 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/rln.ts
CHANGED
package/src/zerokit.ts
CHANGED
@@ -16,7 +16,7 @@ export class Zerokit {
|
|
16
16
|
public constructor(
|
17
17
|
private readonly zkRLN: number,
|
18
18
|
private readonly witnessCalculator: WitnessCalculator,
|
19
|
-
private readonly
|
19
|
+
private readonly _rateLimit: number = DEFAULT_RATE_LIMIT
|
20
20
|
) {}
|
21
21
|
|
22
22
|
public get getZkRLN(): number {
|
@@ -27,8 +27,8 @@ export class Zerokit {
|
|
27
27
|
return this.witnessCalculator;
|
28
28
|
}
|
29
29
|
|
30
|
-
public get
|
31
|
-
return this.
|
30
|
+
public get rateLimit(): number {
|
31
|
+
return this._rateLimit;
|
32
32
|
}
|
33
33
|
|
34
34
|
public generateIdentityCredentials(): IdentityCredential {
|