@waku/rln 0.1.1 → 0.1.2-86d4f56

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.
Files changed (63) hide show
  1. package/README.md +26 -2
  2. package/bundle/assets/rln_wasm_bg-a503e304.wasm +0 -0
  3. package/bundle/index.js +58446 -12248
  4. package/dist/.tsbuildinfo +1 -1
  5. package/dist/byte_utils.d.ts +13 -0
  6. package/dist/byte_utils.js +22 -0
  7. package/dist/byte_utils.js.map +1 -1
  8. package/dist/codec.d.ts +5 -3
  9. package/dist/codec.js +8 -4
  10. package/dist/codec.js.map +1 -1
  11. package/dist/constants.d.ts +2 -2
  12. package/dist/constants.js +62 -9
  13. package/dist/constants.js.map +1 -1
  14. package/dist/create.d.ts +2 -0
  15. package/dist/create.js +8 -0
  16. package/dist/create.js.map +1 -0
  17. package/dist/index.d.ts +5 -3
  18. package/dist/index.js +5 -10
  19. package/dist/index.js.map +1 -1
  20. package/dist/keystore/cipher.d.ts +4 -0
  21. package/dist/keystore/cipher.js +28 -0
  22. package/dist/keystore/cipher.js.map +1 -0
  23. package/dist/keystore/credential_validation_generated.d.ts +8 -0
  24. package/dist/keystore/credential_validation_generated.js +121 -0
  25. package/dist/keystore/credential_validation_generated.js.map +1 -0
  26. package/dist/keystore/index.d.ts +4 -0
  27. package/dist/keystore/index.js +3 -0
  28. package/dist/keystore/index.js.map +1 -0
  29. package/dist/keystore/keystore.d.ts +50 -0
  30. package/dist/keystore/keystore.js +202 -0
  31. package/dist/keystore/keystore.js.map +1 -0
  32. package/dist/keystore/keystore_validation_generated.d.ts +8 -0
  33. package/dist/keystore/keystore_validation_generated.js +75 -0
  34. package/dist/keystore/keystore_validation_generated.js.map +1 -0
  35. package/dist/keystore/schema_validator.d.ts +2 -0
  36. package/dist/keystore/schema_validator.js +18 -0
  37. package/dist/keystore/schema_validator.js.map +1 -0
  38. package/dist/keystore/types.d.ts +29 -0
  39. package/dist/keystore/types.js +2 -0
  40. package/dist/keystore/types.js.map +1 -0
  41. package/dist/message.d.ts +2 -1
  42. package/dist/message.js +4 -1
  43. package/dist/message.js.map +1 -1
  44. package/dist/metamask.d.ts +2 -0
  45. package/dist/metamask.js +11 -0
  46. package/dist/metamask.js.map +1 -0
  47. package/dist/rln.d.ts +51 -0
  48. package/dist/rln.js +134 -12
  49. package/dist/rln.js.map +1 -1
  50. package/dist/rln_contract.d.ts +25 -14
  51. package/dist/rln_contract.js +80 -34
  52. package/dist/rln_contract.js.map +1 -1
  53. package/package.json +23 -8
  54. package/src/byte_utils.ts +24 -0
  55. package/src/codec.ts +10 -5
  56. package/src/constants.ts +63 -9
  57. package/src/create.ts +9 -0
  58. package/src/index.ts +13 -11
  59. package/src/message.ts +5 -1
  60. package/src/metamask.ts +16 -0
  61. package/src/rln.ts +240 -14
  62. package/src/rln_contract.ts +135 -53
  63. package/bundle/assets/rln_wasm_bg-6f96f821.wasm +0 -0
@@ -0,0 +1,18 @@
1
+ import { Credential as _validateCredentialGenerated } from "./credential_validation_generated.js";
2
+ import { Keystore as _validateKeystoreGenerated } from "./keystore_validation_generated.js";
3
+ const _validateKeystore = _validateKeystoreGenerated;
4
+ const _validateCredential = _validateCredentialGenerated;
5
+ function schemaValidationErrors(validator, data) {
6
+ const validated = validator(data);
7
+ if (validated) {
8
+ return null;
9
+ }
10
+ return validator.errors;
11
+ }
12
+ export function isKeystoreValid(keystore) {
13
+ return !schemaValidationErrors(_validateKeystore, keystore);
14
+ }
15
+ export function isCredentialValid(credential) {
16
+ return !schemaValidationErrors(_validateCredential, credential);
17
+ }
18
+ //# sourceMappingURL=schema_validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema_validator.js","sourceRoot":"","sources":["../../src/keystore/schema_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAClG,OAAO,EAAE,QAAQ,IAAI,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAY5F,MAAM,iBAAiB,GAAG,0BAAyC,CAAC;AACpE,MAAM,mBAAmB,GAAG,4BAA2C,CAAC;AAExE,SAAS,sBAAsB,CAC7B,SAAsB,EACtB,IAAa;IAEb,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,SAAS,EAAE;QACb,OAAO,IAAI,CAAC;KACb;IACD,OAAO,SAAS,CAAC,MAAM,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAiB;IAC/C,OAAO,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAmB;IACnD,OAAO,CAAC,sBAAsB,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { IdentityCredential } from "../rln.js";
2
+ export type MembershipHash = string;
3
+ export type Sha256Hash = string;
4
+ export type Keccak256Hash = string;
5
+ export type Password = string | Uint8Array;
6
+ export type MembershipInfo = {
7
+ chainId: number;
8
+ address: string;
9
+ treeIndex: number;
10
+ };
11
+ export type KeystoreEntity = {
12
+ identity: IdentityCredential;
13
+ membership: MembershipInfo;
14
+ };
15
+ export type DecryptedCredentials = KeystoreEntity;
16
+ export type EncryptedCredentials = {
17
+ /**
18
+ * Valid JSON string that contains Keystore
19
+ */
20
+ keystore: string;
21
+ /**
22
+ * ID of credentials from provided Keystore to use
23
+ */
24
+ id: string;
25
+ /**
26
+ * Password to decrypt credentials provided
27
+ */
28
+ password: Password;
29
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/keystore/types.ts"],"names":[],"mappings":""}
package/dist/message.d.ts CHANGED
@@ -5,7 +5,7 @@ export declare class RlnMessage<T extends IDecodedMessage> implements IDecodedMe
5
5
  rlnInstance: RLNInstance;
6
6
  msg: T;
7
7
  rateLimitProof: IRateLimitProof | undefined;
8
- pubSubTopic: string;
8
+ pubsubTopic: string;
9
9
  constructor(rlnInstance: RLNInstance, msg: T, rateLimitProof: IRateLimitProof | undefined);
10
10
  verify(roots: Uint8Array[]): boolean | undefined;
11
11
  verifyNoRoot(): boolean | undefined;
@@ -13,5 +13,6 @@ export declare class RlnMessage<T extends IDecodedMessage> implements IDecodedMe
13
13
  get contentTopic(): string;
14
14
  get timestamp(): Date | undefined;
15
15
  get ephemeral(): boolean | undefined;
16
+ get meta(): Uint8Array | undefined;
16
17
  get epoch(): number | undefined;
17
18
  }
package/dist/message.js CHANGED
@@ -9,7 +9,7 @@ export class RlnMessage {
9
9
  this.rlnInstance = rlnInstance;
10
10
  this.msg = msg;
11
11
  this.rateLimitProof = rateLimitProof;
12
- this.pubSubTopic = "";
12
+ this.pubsubTopic = "";
13
13
  }
14
14
  verify(roots) {
15
15
  return this.rateLimitProof
@@ -33,6 +33,9 @@ export class RlnMessage {
33
33
  get ephemeral() {
34
34
  return this.msg.ephemeral;
35
35
  }
36
+ get meta() {
37
+ return this.msg.meta;
38
+ }
36
39
  get epoch() {
37
40
  const bytes = this.msg.rateLimitProof?.epoch;
38
41
  if (!bytes)
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,GAAa;IAC7D,MAAM,iBAAiB,GAAG,KAAK,CAAC,WAAW,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,OAAO,UAAU;IAGrB,YACS,WAAwB,EACxB,GAAM,EACN,cAA2C;QAF3C,gBAAW,GAAX,WAAW,CAAa;QACxB,QAAG,GAAH,GAAG,CAAG;QACN,mBAAc,GAAd,cAAc,CAA6B;QAL7C,gBAAW,GAAG,EAAE,CAAC;IAMrB,CAAC;IAEG,MAAM,CAAC,KAAmB;QAC/B,OAAO,IAAI,CAAC,cAAc;YACxB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAC9B,IAAI,CAAC,cAAc,EACnB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,EAC5C,GAAG,KAAK,CACT,CAAC,2EAA2E;YAC/E,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAEM,YAAY;QACjB,OAAO,IAAI,CAAC,cAAc;YACxB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAC/B,IAAI,CAAC,cAAc,EACnB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAC7C,CAAC,2EAA2E;YAC/E,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;IAC/B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;IAC5B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;IAC5B,CAAC;IAED,IAAI,KAAK;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC;QAC7C,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;CACF"}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,GAAa;IAC7D,MAAM,iBAAiB,GAAG,KAAK,CAAC,WAAW,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,OAAO,UAAU;IAGrB,YACS,WAAwB,EACxB,GAAM,EACN,cAA2C;QAF3C,gBAAW,GAAX,WAAW,CAAa;QACxB,QAAG,GAAH,GAAG,CAAG;QACN,mBAAc,GAAd,cAAc,CAA6B;QAL7C,gBAAW,GAAG,EAAE,CAAC;IAMrB,CAAC;IAEG,MAAM,CAAC,KAAmB;QAC/B,OAAO,IAAI,CAAC,cAAc;YACxB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAC9B,IAAI,CAAC,cAAc,EACnB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,EAC5C,GAAG,KAAK,CACT,CAAC,2EAA2E;YAC/E,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAEM,YAAY;QACjB,OAAO,IAAI,CAAC,cAAc;YACxB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAC/B,IAAI,CAAC,cAAc,EACnB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAC7C,CAAC,2EAA2E;YAC/E,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;IAC/B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;IAC5B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;IAC5B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,IAAI,KAAK;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC;QAC7C,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ import { ethers } from "ethers";
2
+ export declare const extractMetaMaskSigner: () => Promise<ethers.Signer>;
@@ -0,0 +1,11 @@
1
+ import { ethers } from "ethers";
2
+ export const extractMetaMaskSigner = async () => {
3
+ const ethereum = window.ethereum;
4
+ if (!ethereum) {
5
+ throw Error("Missing or invalid Ethereum provider. Please install a Web3 wallet such as MetaMask.");
6
+ }
7
+ await ethereum.request({ method: "eth_requestAccounts" });
8
+ const provider = new ethers.providers.Web3Provider(ethereum, "any");
9
+ return provider.getSigner();
10
+ };
11
+ //# sourceMappingURL=metamask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metamask.js","sourceRoot":"","sources":["../src/metamask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,IAA4B,EAAE;IACtE,MAAM,QAAQ,GAAI,MAAc,CAAC,QAAQ,CAAC;IAE1C,IAAI,CAAC,QAAQ,EAAE;QACb,MAAM,KAAK,CACT,sFAAsF,CACvF,CAAC;KACH;IAED,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEpE,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAC;AAC9B,CAAC,CAAC"}
package/dist/rln.d.ts CHANGED
@@ -1,4 +1,10 @@
1
1
  import type { IRateLimitProof } from "@waku/interfaces";
2
+ import type { ContentTopic, IDecodedMessage, EncoderOptions as WakuEncoderOptions } from "@waku/interfaces";
3
+ import { ethers } from "ethers";
4
+ import type { RLNDecoder, RLNEncoder } from "./codec.js";
5
+ import type { DecryptedCredentials, EncryptedCredentials } from "./keystore/index.js";
6
+ import { Password } from "./keystore/types.js";
7
+ import { RLNContract } from "./rln_contract.js";
2
8
  import { WitnessCalculator } from "./witness_calculator.js";
3
9
  /**
4
10
  * Create an instance of RLN
@@ -35,10 +41,54 @@ export declare class Proof implements IRateLimitProof {
35
41
  export declare function proofToBytes(p: IRateLimitProof): Uint8Array;
36
42
  export declare function poseidonHash(...input: Array<Uint8Array>): Uint8Array;
37
43
  export declare function sha256(input: Uint8Array): Uint8Array;
44
+ type StartRLNOptions = {
45
+ /**
46
+ * If not set - will extract MetaMask account and get signer from it.
47
+ */
48
+ signer?: ethers.Signer;
49
+ /**
50
+ * If not set - will use default SEPOLIA_CONTRACT address.
51
+ */
52
+ registryAddress?: string;
53
+ /**
54
+ * Credentials to use for generating proofs and connecting to the contract and network.
55
+ * If provided used for validating the network chainId and connecting to registry contract.
56
+ */
57
+ credentials?: EncryptedCredentials | DecryptedCredentials;
58
+ };
59
+ type RegisterMembershipOptions = {
60
+ signature: string;
61
+ } | {
62
+ identity: IdentityCredential;
63
+ };
64
+ type WakuRLNEncoderOptions = WakuEncoderOptions & {
65
+ credentials: EncryptedCredentials | DecryptedCredentials;
66
+ };
38
67
  export declare class RLNInstance {
39
68
  private zkRLN;
40
69
  private witnessCalculator;
70
+ private started;
71
+ private starting;
72
+ private _contract;
73
+ private _signer;
74
+ private keystore;
75
+ private _credentials;
41
76
  constructor(zkRLN: number, witnessCalculator: WitnessCalculator);
77
+ get contract(): undefined | RLNContract;
78
+ get signer(): undefined | ethers.Signer;
79
+ start(options?: StartRLNOptions): Promise<void>;
80
+ private determineStartOptions;
81
+ private static decryptCredentialsIfNeeded;
82
+ registerMembership(options: RegisterMembershipOptions): Promise<undefined | DecryptedCredentials>;
83
+ /**
84
+ * Changes credentials in use by relying on provided Keystore earlier in rln.start
85
+ * @param id: string, hash of credentials to select from Keystore
86
+ * @param password: string or bytes to use to decrypt credentials from Keystore
87
+ */
88
+ useCredentials(id: string, password: Password): Promise<void>;
89
+ createEncoder(options: WakuRLNEncoderOptions): Promise<RLNEncoder>;
90
+ private verifyCredentialsAgainstContract;
91
+ createDecoder(contentTopic: ContentTopic): RLNDecoder<IDecodedMessage>;
42
92
  generateIdentityCredentials(): IdentityCredential;
43
93
  generateSeededIdentityCredential(seed: string): IdentityCredential;
44
94
  insertMember(idCommitment: Uint8Array): void;
@@ -51,3 +101,4 @@ export declare class RLNInstance {
51
101
  verifyWithRoots(proof: IRateLimitProof | Uint8Array, msg: Uint8Array, ...roots: Array<Uint8Array>): boolean;
52
102
  verifyWithNoRoot(proof: IRateLimitProof | Uint8Array, msg: Uint8Array): boolean;
53
103
  }
104
+ export {};
package/dist/rln.js CHANGED
@@ -1,7 +1,14 @@
1
- import init, * as zerokitRLN from "@waku/zerokit-rln-wasm";
2
- import { writeUIntLE } from "./byte_utils.js";
1
+ import { createDecoder, createEncoder } from "@waku/core";
2
+ import init from "@waku/zerokit-rln-wasm";
3
+ import * as zerokitRLN from "@waku/zerokit-rln-wasm";
4
+ import { buildBigIntFromUint8Array, writeUIntLE } from "./byte_utils.js";
5
+ import { createRLNDecoder, createRLNEncoder } from "./codec.js";
6
+ import { SEPOLIA_CONTRACT } from "./constants.js";
3
7
  import { dateToEpoch, epochIntToBytes } from "./epoch.js";
8
+ import { Keystore } from "./keystore/index.js";
9
+ import { extractMetaMaskSigner } from "./metamask.js";
4
10
  import verificationKey from "./resources/verification_key.js";
11
+ import { RLNContract } from "./rln_contract.js";
5
12
  import * as wc from "./witness_calculator.js";
6
13
  /**
7
14
  * Concatenate Uint8Arrays
@@ -21,15 +28,6 @@ function concatenate(...input) {
21
28
  }
22
29
  return result;
23
30
  }
24
- /**
25
- * Transforms Uint8Array into BigInt
26
- * @param array: Uint8Array
27
- * @returns BigInt
28
- */
29
- function buildBigIntFromUint8Array(array) {
30
- const dataView = new DataView(array.buffer);
31
- return dataView.getBigUint64(0, true);
32
- }
33
31
  const stringEncoder = new TextEncoder();
34
32
  const DEPTH = 20;
35
33
  async function loadWitnessCalculator() {
@@ -47,7 +45,7 @@ async function loadZkey() {
47
45
  * @returns RLNInstance
48
46
  */
49
47
  export async function create() {
50
- await init();
48
+ await init?.();
51
49
  zerokitRLN.init_panic_hook();
52
50
  const witnessCalculator = await loadWitnessCalculator();
53
51
  const zkey = await loadZkey();
@@ -122,6 +120,130 @@ export class RLNInstance {
122
120
  constructor(zkRLN, witnessCalculator) {
123
121
  this.zkRLN = zkRLN;
124
122
  this.witnessCalculator = witnessCalculator;
123
+ this.started = false;
124
+ this.starting = false;
125
+ this.keystore = Keystore.create();
126
+ }
127
+ get contract() {
128
+ return this._contract;
129
+ }
130
+ get signer() {
131
+ return this._signer;
132
+ }
133
+ async start(options = {}) {
134
+ if (this.started || this.starting) {
135
+ return;
136
+ }
137
+ this.starting = true;
138
+ try {
139
+ const { credentials, keystore } = await RLNInstance.decryptCredentialsIfNeeded(options.credentials);
140
+ const { signer, registryAddress } = await this.determineStartOptions(options, credentials);
141
+ if (keystore) {
142
+ this.keystore = keystore;
143
+ }
144
+ this._credentials = credentials;
145
+ this._signer = signer;
146
+ this._contract = await RLNContract.init(this, {
147
+ registryAddress: registryAddress,
148
+ signer: signer,
149
+ });
150
+ this.started = true;
151
+ }
152
+ finally {
153
+ this.starting = false;
154
+ }
155
+ }
156
+ async determineStartOptions(options, credentials) {
157
+ let chainId = credentials?.membership.chainId;
158
+ const registryAddress = credentials?.membership.address ||
159
+ options.registryAddress ||
160
+ SEPOLIA_CONTRACT.address;
161
+ if (registryAddress === SEPOLIA_CONTRACT.address) {
162
+ chainId = SEPOLIA_CONTRACT.chainId;
163
+ }
164
+ const signer = options.signer || (await extractMetaMaskSigner());
165
+ const currentChainId = await signer.getChainId();
166
+ if (chainId && chainId !== currentChainId) {
167
+ throw Error(`Failed to start RLN contract, chain ID of contract is different from current one: contract-${chainId}, current network-${currentChainId}`);
168
+ }
169
+ return {
170
+ signer,
171
+ registryAddress,
172
+ };
173
+ }
174
+ static async decryptCredentialsIfNeeded(credentials) {
175
+ if (!credentials) {
176
+ return {};
177
+ }
178
+ if ("identity" in credentials) {
179
+ return { credentials };
180
+ }
181
+ const keystore = Keystore.fromString(credentials.keystore);
182
+ if (!keystore) {
183
+ return {};
184
+ }
185
+ const decryptedCredentials = await keystore.readCredential(credentials.id, credentials.password);
186
+ return {
187
+ keystore,
188
+ credentials: decryptedCredentials,
189
+ };
190
+ }
191
+ async registerMembership(options) {
192
+ if (!this.contract) {
193
+ throw Error("RLN Contract is not initialized.");
194
+ }
195
+ let identity = "identity" in options && options.identity;
196
+ if ("signature" in options) {
197
+ identity = await this.generateSeededIdentityCredential(options.signature);
198
+ }
199
+ if (!identity) {
200
+ throw Error("Missing signature or identity to register membership.");
201
+ }
202
+ return this.contract.registerWithIdentity(identity);
203
+ }
204
+ /**
205
+ * Changes credentials in use by relying on provided Keystore earlier in rln.start
206
+ * @param id: string, hash of credentials to select from Keystore
207
+ * @param password: string or bytes to use to decrypt credentials from Keystore
208
+ */
209
+ async useCredentials(id, password) {
210
+ this._credentials = await this.keystore?.readCredential(id, password);
211
+ }
212
+ async createEncoder(options) {
213
+ const { credentials: decryptedCredentials } = await RLNInstance.decryptCredentialsIfNeeded(options.credentials);
214
+ const credentials = decryptedCredentials || this._credentials;
215
+ if (!credentials) {
216
+ throw Error("Failed to create Encoder: missing RLN credentials. Use createRLNEncoder directly.");
217
+ }
218
+ await this.verifyCredentialsAgainstContract(credentials);
219
+ return createRLNEncoder({
220
+ encoder: createEncoder(options),
221
+ rlnInstance: this,
222
+ index: credentials.membership.treeIndex,
223
+ credential: credentials.identity,
224
+ });
225
+ }
226
+ async verifyCredentialsAgainstContract(credentials) {
227
+ if (!this._contract) {
228
+ throw Error("Failed to verify chain coordinates: no contract initialized.");
229
+ }
230
+ const registryAddress = credentials.membership.address;
231
+ const currentRegistryAddress = this._contract.registry.address;
232
+ if (registryAddress !== currentRegistryAddress) {
233
+ throw Error(`Failed to verify chain coordinates: credentials contract address=${registryAddress} is not equal to registryContract address=${currentRegistryAddress}`);
234
+ }
235
+ const chainId = credentials.membership.chainId;
236
+ const network = await this._contract.registry.getNetwork();
237
+ const currentChainId = network.chainId;
238
+ if (chainId !== currentChainId) {
239
+ throw Error(`Failed to verify chain coordinates: credentials chainID=${chainId} is not equal to registryContract chainID=${currentChainId}`);
240
+ }
241
+ }
242
+ createDecoder(contentTopic) {
243
+ return createRLNDecoder({
244
+ rlnInstance: this,
245
+ decoder: createDecoder(contentTopic),
246
+ });
125
247
  }
126
248
  generateIdentityCredentials() {
127
249
  const memKeys = zerokitRLN.generateExtendedMembershipKey(this.zkRLN); // TODO: rename this function in zerokit rln-wasm
package/dist/rln.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rln.js","sourceRoot":"","sources":["../src/rln.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rln.js","sourceRoot":"","sources":["../src/rln.ts"],"names":[],"mappings":"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"}
@@ -1,34 +1,45 @@
1
1
  import { ethers } from "ethers";
2
- import { IdentityCredential, RLNInstance } from "./rln.js";
3
- declare type Member = {
4
- pubkey: string;
5
- index: number;
2
+ import type { DecryptedCredentials } from "./keystore/index.js";
3
+ import { type IdentityCredential, RLNInstance } from "./rln.js";
4
+ type Member = {
5
+ idCommitment: string;
6
+ index: ethers.BigNumber;
6
7
  };
7
- declare type ContractOptions = {
8
- address: string;
9
- provider: ethers.Signer | ethers.providers.Provider;
8
+ type Signer = ethers.Signer;
9
+ type RLNContractOptions = {
10
+ signer: Signer;
11
+ registryAddress: string;
10
12
  };
11
- declare type FetchMembersOptions = {
13
+ type RLNStorageOptions = {
14
+ storageIndex?: number;
15
+ };
16
+ type RLNContractInitOptions = RLNContractOptions & RLNStorageOptions;
17
+ type FetchMembersOptions = {
12
18
  fromBlock?: number;
13
19
  fetchRange?: number;
14
20
  fetchChunks?: number;
15
21
  };
16
22
  export declare class RLNContract {
17
- private _contract;
18
- private membersFilter;
23
+ private registryContract;
19
24
  private merkleRootTracker;
25
+ private deployBlock;
26
+ private storageIndex;
27
+ private storageContract;
28
+ private _membersFilter;
20
29
  private _members;
21
- static init(rlnInstance: RLNInstance, options: ContractOptions): Promise<RLNContract>;
22
- constructor(rlnInstance: RLNInstance, { address, provider }: ContractOptions);
30
+ static init(rlnInstance: RLNInstance, options: RLNContractInitOptions): Promise<RLNContract>;
31
+ constructor(rlnInstance: RLNInstance, { registryAddress, signer }: RLNContractOptions);
32
+ private initStorageContract;
33
+ get registry(): ethers.Contract;
23
34
  get contract(): ethers.Contract;
24
35
  get members(): Member[];
36
+ private get membersFilter();
25
37
  fetchMembers(rlnInstance: RLNInstance, options?: FetchMembersOptions): Promise<void>;
26
38
  processEvents(rlnInstance: RLNInstance, events: ethers.Event[]): void;
27
39
  private insertMembers;
28
40
  private removeMembers;
29
41
  subscribeToMembers(rlnInstance: RLNInstance): void;
30
- registerWithSignature(rlnInstance: RLNInstance, signature: string): Promise<ethers.Event | undefined>;
31
- registerWithKey(credential: IdentityCredential): Promise<ethers.Event | undefined>;
42
+ registerWithIdentity(identity: IdentityCredential): Promise<DecryptedCredentials | undefined>;
32
43
  roots(): Uint8Array[];
33
44
  }
34
45
  export {};
@@ -1,28 +1,60 @@
1
+ import { hexToBytes } from "@waku/utils/bytes";
1
2
  import { ethers } from "ethers";
2
- import { RLN_ABI } from "./constants.js";
3
- import { MerkleRootTracker } from "./root_tracker";
3
+ import { zeroPadLE } from "./byte_utils.js";
4
+ import { RLN_REGISTRY_ABI, RLN_STORAGE_ABI } from "./constants.js";
5
+ import { MerkleRootTracker } from "./root_tracker.js";
4
6
  export class RLNContract {
5
- constructor(rlnInstance, { address, provider }) {
6
- this._members = [];
7
- const initialRoot = rlnInstance.getMerkleRoot();
8
- this._contract = new ethers.Contract(address, RLN_ABI, provider);
9
- this.merkleRootTracker = new MerkleRootTracker(5, initialRoot);
10
- this.membersFilter = this.contract.filters.MemberRegistered();
11
- }
12
7
  static async init(rlnInstance, options) {
13
8
  const rlnContract = new RLNContract(rlnInstance, options);
9
+ await rlnContract.initStorageContract(options.signer);
14
10
  await rlnContract.fetchMembers(rlnInstance);
15
11
  rlnContract.subscribeToMembers(rlnInstance);
16
12
  return rlnContract;
17
13
  }
14
+ constructor(rlnInstance, { registryAddress, signer }) {
15
+ this._members = new Map();
16
+ const initialRoot = rlnInstance.getMerkleRoot();
17
+ this.registryContract = new ethers.Contract(registryAddress, RLN_REGISTRY_ABI, signer);
18
+ this.merkleRootTracker = new MerkleRootTracker(5, initialRoot);
19
+ }
20
+ async initStorageContract(signer, options = {}) {
21
+ const storageIndex = options?.storageIndex
22
+ ? options.storageIndex
23
+ : await this.registryContract.usingStorageIndex();
24
+ const storageAddress = await this.registryContract.storages(storageIndex);
25
+ if (!storageAddress || storageAddress === ethers.constants.AddressZero) {
26
+ throw Error("No RLN Storage initialized on registry contract.");
27
+ }
28
+ this.storageIndex = storageIndex;
29
+ this.storageContract = new ethers.Contract(storageAddress, RLN_STORAGE_ABI, signer);
30
+ this._membersFilter = this.storageContract.filters.MemberRegistered();
31
+ this.deployBlock = await this.storageContract.deployedBlockNumber();
32
+ }
33
+ get registry() {
34
+ if (!this.registryContract) {
35
+ throw Error("Registry contract was not initialized");
36
+ }
37
+ return this.registryContract;
38
+ }
18
39
  get contract() {
19
- return this._contract;
40
+ if (!this.storageContract) {
41
+ throw Error("Storage contract was not initialized");
42
+ }
43
+ return this.storageContract;
20
44
  }
21
45
  get members() {
22
- return this._members;
46
+ const sortedMembers = Array.from(this._members.values()).sort((left, right) => left.index.toNumber() - right.index.toNumber());
47
+ return sortedMembers;
48
+ }
49
+ get membersFilter() {
50
+ if (!this._membersFilter) {
51
+ throw Error("Members filter was not initialized.");
52
+ }
53
+ return this._membersFilter;
23
54
  }
24
55
  async fetchMembers(rlnInstance, options = {}) {
25
56
  const registeredMemberEvents = await queryFilter(this.contract, {
57
+ fromBlock: this.deployBlock,
26
58
  ...options,
27
59
  membersFilter: this.membersFilter,
28
60
  });
@@ -39,11 +71,11 @@ export class RLNContract {
39
71
  const index = evt.args.index;
40
72
  const toRemoveVal = toRemoveTable.get(evt.blockNumber);
41
73
  if (toRemoveVal != undefined) {
42
- toRemoveVal.push(index);
74
+ toRemoveVal.push(index.toNumber());
43
75
  toRemoveTable.set(evt.blockNumber, toRemoveVal);
44
76
  }
45
77
  else {
46
- toRemoveTable.set(evt.blockNumber, [index]);
78
+ toRemoveTable.set(evt.blockNumber, [index.toNumber()]);
47
79
  }
48
80
  }
49
81
  else {
@@ -54,21 +86,24 @@ export class RLNContract {
54
86
  eventsPerBlock.push(evt);
55
87
  toInsertTable.set(evt.blockNumber, eventsPerBlock);
56
88
  }
57
- this.removeMembers(rlnInstance, toRemoveTable);
58
- this.insertMembers(rlnInstance, toInsertTable);
59
89
  });
90
+ this.removeMembers(rlnInstance, toRemoveTable);
91
+ this.insertMembers(rlnInstance, toInsertTable);
60
92
  }
61
93
  insertMembers(rlnInstance, toInsert) {
62
94
  toInsert.forEach((events, blockNumber) => {
63
95
  events.forEach((evt) => {
64
- if (!evt.args) {
96
+ const _idCommitment = evt?.args?.idCommitment;
97
+ const index = evt?.args?.index;
98
+ if (!_idCommitment || !index) {
65
99
  return;
66
100
  }
67
- const pubkey = evt.args.pubkey;
68
- const index = evt.args.index;
69
- const idCommitment = ethers.utils.zeroPad(ethers.utils.arrayify(pubkey), 32);
101
+ const idCommitment = zeroPadLE(hexToBytes(_idCommitment?._hex), 32);
70
102
  rlnInstance.insertMember(idCommitment);
71
- this.members.push({ index, pubkey });
103
+ this._members.set(index.toNumber(), {
104
+ index,
105
+ idCommitment: _idCommitment?._hex,
106
+ });
72
107
  });
73
108
  const currentRoot = rlnInstance.getMerkleRoot();
74
109
  this.merkleRootTracker.pushRoot(blockNumber, currentRoot);
@@ -78,9 +113,8 @@ export class RLNContract {
78
113
  const removeDescending = new Map([...toRemove].sort().reverse());
79
114
  removeDescending.forEach((indexes, blockNumber) => {
80
115
  indexes.forEach((index) => {
81
- const idx = this.members.findIndex((m) => m.index === index);
82
- if (idx > -1) {
83
- this.members.splice(idx, 1);
116
+ if (this._members.has(index)) {
117
+ this._members.delete(index);
84
118
  }
85
119
  rlnInstance.deleteMember(index);
86
120
  });
@@ -88,19 +122,31 @@ export class RLNContract {
88
122
  });
89
123
  }
90
124
  subscribeToMembers(rlnInstance) {
91
- this.contract.on(this.membersFilter, (_pubkey, _index, event) => this.processEvents(rlnInstance, event));
125
+ this.contract.on(this.membersFilter, (_pubkey, _index, event) => this.processEvents(rlnInstance, [event]));
92
126
  }
93
- async registerWithSignature(rlnInstance, signature) {
94
- const identityCredential = await rlnInstance.generateSeededIdentityCredential(signature);
95
- return this.registerWithKey(identityCredential);
96
- }
97
- async registerWithKey(credential) {
98
- const depositValue = await this.contract.MEMBERSHIP_DEPOSIT();
99
- const txRegisterResponse = await this.contract.register(credential.IDCommitmentBigInt, {
100
- value: depositValue,
101
- });
127
+ async registerWithIdentity(identity) {
128
+ if (this.storageIndex === undefined) {
129
+ throw Error("Cannot register credential, no storage contract index found.");
130
+ }
131
+ const txRegisterResponse = await this.registryContract["register(uint16,uint256)"](this.storageIndex, identity.IDCommitmentBigInt, { gasLimit: 100000 });
102
132
  const txRegisterReceipt = await txRegisterResponse.wait();
103
- return txRegisterReceipt?.events?.[0];
133
+ // assumption: register(uint16,uint256) emits one event
134
+ const memberRegistered = txRegisterReceipt?.events?.[0];
135
+ if (!memberRegistered) {
136
+ return undefined;
137
+ }
138
+ const decodedData = this.contract.interface.decodeEventLog("MemberRegistered", memberRegistered.data);
139
+ const network = await this.registryContract.provider.getNetwork();
140
+ const address = this.registryContract.address;
141
+ const membershipId = decodedData.index.toNumber();
142
+ return {
143
+ identity,
144
+ membership: {
145
+ address,
146
+ treeIndex: membershipId,
147
+ chainId: network.chainId,
148
+ },
149
+ };
104
150
  }
105
151
  roots() {
106
152
  return this.merkleRootTracker.roots();