diff --git a/src/codec.spec.ts b/src/codec.spec.ts index a707b4b..e0c88b0 100644 --- a/src/codec.spec.ts +++ b/src/codec.spec.ts @@ -25,8 +25,8 @@ import { RLNDecoder, RLNEncoder, } from "./codec.js"; -import { epochBytesToInt } from "./epoch.js"; import { RlnMessage } from "./message.js"; +import { epochBytesToInt } from "./utils/index.js"; import * as rln from "./index.js"; diff --git a/src/codec.ts b/src/codec.ts index 1a093c7..06dc7ea 100644 --- a/src/codec.ts +++ b/src/codec.ts @@ -8,8 +8,9 @@ import type { } from "@waku/interfaces"; import debug from "debug"; +import type { IdentityCredential } from "./identity.js"; import { RlnMessage, toRLNSignal } from "./message.js"; -import { IdentityCredential, RLNInstance } from "./rln.js"; +import { RLNInstance } from "./rln.js"; const log = debug("waku:rln:encoder"); diff --git a/src/constants.ts b/src/contract/constants.ts similarity index 100% rename from src/constants.ts rename to src/contract/constants.ts diff --git a/src/contract/index.ts b/src/contract/index.ts index 24ac169..caa0fec 100644 --- a/src/contract/index.ts +++ b/src/contract/index.ts @@ -1 +1,2 @@ export { RLNContract } from "./rln_contract.js"; +export * from "./constants.js"; diff --git a/src/contract/rln_contract.spec.ts b/src/contract/rln_contract.spec.ts index 5af6cfa..4218ed9 100644 --- a/src/contract/rln_contract.spec.ts +++ b/src/contract/rln_contract.spec.ts @@ -2,7 +2,7 @@ import chai from "chai"; import spies from "chai-spies"; import * as ethers from "ethers"; -import * as rln from "./index.js"; +import * as rln from "../index.js"; chai.use(spies); diff --git a/src/contract/rln_contract.ts b/src/contract/rln_contract.ts index 4a8759c..0bbfa15 100644 --- a/src/contract/rln_contract.ts +++ b/src/contract/rln_contract.ts @@ -1,12 +1,13 @@ import { hexToBytes } from "@waku/utils/bytes"; import { ethers } from "ethers"; +import type { IdentityCredential } from "../identity.js"; +import type { DecryptedCredentials } from "../keystore/index.js"; +import type { RLNInstance } from "../rln.js"; +import { MerkleRootTracker } from "../root_tracker.js"; import { zeroPadLE } from "../utils/index.js"; import { RLN_REGISTRY_ABI, RLN_STORAGE_ABI } from "./constants.js"; -import type { DecryptedCredentials } from "./keystore/index.js"; -import { type IdentityCredential, RLNInstance } from "./rln.js"; -import { MerkleRootTracker } from "./root_tracker.js"; type Member = { idCommitment: string; diff --git a/src/index.spec.ts b/src/create.spec.ts similarity index 95% rename from src/index.spec.ts rename to src/create.spec.ts index 25a78cd..acad8a4 100644 --- a/src/index.spec.ts +++ b/src/create.spec.ts @@ -1,10 +1,10 @@ import { assert, expect } from "chai"; -import * as rln from "./index.js"; +import { createRLN } from "./create.js"; describe("js-rln", () => { it("should verify a proof", async function () { - const rlnInstance = await rln.createRLN(); + const rlnInstance = await createRLN(); const credential = rlnInstance.generateIdentityCredentials(); @@ -59,7 +59,7 @@ describe("js-rln", () => { } }); it("should verify a proof with a seeded membership key generation", async function () { - const rlnInstance = await rln.createRLN(); + const rlnInstance = await createRLN(); const seed = "This is a test seed"; const credential = rlnInstance.generateSeededIdentityCredential(seed); @@ -115,7 +115,7 @@ describe("js-rln", () => { }); it("should generate the same membership key if the same seed is provided", async function () { - const rlnInstance = await rln.createRLN(); + const rlnInstance = await createRLN(); const seed = "This is a test seed"; const memKeys1 = rlnInstance.generateSeededIdentityCredential(seed); const memKeys2 = rlnInstance.generateSeededIdentityCredential(seed); diff --git a/src/identity.ts b/src/identity.ts new file mode 100644 index 0000000..06cd436 --- /dev/null +++ b/src/identity.ts @@ -0,0 +1,27 @@ +import { buildBigIntFromUint8Array } from "./utils/index.js"; + +export class IdentityCredential { + constructor( + public readonly IDTrapdoor: Uint8Array, + public readonly IDNullifier: Uint8Array, + public readonly IDSecretHash: Uint8Array, + public readonly IDCommitment: Uint8Array, + public readonly IDCommitmentBigInt: bigint + ) {} + + static fromBytes(memKeys: Uint8Array): IdentityCredential { + const idTrapdoor = memKeys.subarray(0, 32); + const idNullifier = memKeys.subarray(32, 64); + const idSecretHash = memKeys.subarray(64, 96); + const idCommitment = memKeys.subarray(96); + const idCommitmentBigInt = buildBigIntFromUint8Array(idCommitment); + + return new IdentityCredential( + idTrapdoor, + idNullifier, + idSecretHash, + idCommitment, + idCommitmentBigInt + ); + } +} diff --git a/src/index.ts b/src/index.ts index d5b2751..54dcd26 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,12 +3,13 @@ import { RLN_REGISTRY_ABI, RLN_STORAGE_ABI, SEPOLIA_CONTRACT, -} from "./constants.js"; +} from "./contract/index.js"; import { RLNContract } from "./contract/index.js"; import { createRLN } from "./create.js"; +import { IdentityCredential } from "./identity.js"; import { Keystore } from "./keystore/index.js"; import { Proof } from "./proof.js"; -import { IdentityCredential, RLNInstance } from "./rln.js"; +import { RLNInstance } from "./rln.js"; import { MerkleRootTracker } from "./root_tracker.js"; import { extractMetaMaskSigner } from "./utils/index.js"; diff --git a/src/keystore/keystore.spec.ts b/src/keystore/keystore.spec.ts index 896759d..a926d14 100644 --- a/src/keystore/keystore.spec.ts +++ b/src/keystore/keystore.spec.ts @@ -7,8 +7,8 @@ chai.use(chaiSubset); chai.use(deepEqualInAnyOrder); chai.use(chaiAsPromised); -import { buildBigIntFromUint8Array } from "../byte_utils.js"; -import { IdentityCredential } from "../rln.js"; +import { IdentityCredential } from "../identity.js"; +import { buildBigIntFromUint8Array } from "../utils/bytes.js"; import { Keystore } from "./keystore.js"; import type { MembershipInfo } from "./types.js"; diff --git a/src/keystore/keystore.ts b/src/keystore/keystore.ts index 51714d4..c104de6 100644 --- a/src/keystore/keystore.ts +++ b/src/keystore/keystore.ts @@ -13,7 +13,7 @@ import { import _ from "lodash"; import { v4 as uuidV4 } from "uuid"; -import { buildBigIntFromUint8Array } from "../byte_utils.js"; +import { buildBigIntFromUint8Array } from "../utils/bytes.js"; import { decryptEipKeystore, keccak256Checksum } from "./cipher.js"; import { isCredentialValid, isKeystoreValid } from "./schema_validator.js"; diff --git a/src/keystore/types.ts b/src/keystore/types.ts index 417eb83..9d8e86a 100644 --- a/src/keystore/types.ts +++ b/src/keystore/types.ts @@ -1,4 +1,4 @@ -import type { IdentityCredential } from "../rln.js"; +import type { IdentityCredential } from "../identity.js"; export type MembershipHash = string; export type Sha256Hash = string; diff --git a/src/message.ts b/src/message.ts index bc051a2..190dc06 100644 --- a/src/message.ts +++ b/src/message.ts @@ -5,8 +5,8 @@ import type { } from "@waku/interfaces"; import * as utils from "@waku/utils/bytes"; -import { epochBytesToInt } from "./epoch.js"; import { RLNInstance } from "./rln.js"; +import { epochBytesToInt } from "./utils/index.js"; export function toRLNSignal(contentTopic: string, msg: IMessage): Uint8Array { const contentTopicBytes = utils.utf8ToBytes(contentTopic ?? ""); diff --git a/src/witness_calculator.d.ts b/src/resources/witness_calculator.d.ts similarity index 100% rename from src/witness_calculator.d.ts rename to src/resources/witness_calculator.d.ts diff --git a/src/witness_calculator.js b/src/resources/witness_calculator.js similarity index 100% rename from src/witness_calculator.js rename to src/resources/witness_calculator.js diff --git a/src/rln.ts b/src/rln.ts index d50977a..724cf76 100644 --- a/src/rln.ts +++ b/src/rln.ts @@ -9,11 +9,14 @@ import init from "@waku/zerokit-rln-wasm"; import * as zerokitRLN from "@waku/zerokit-rln-wasm"; import { ethers } from "ethers"; -import type { RLNDecoder, RLNEncoder } from "./codec.js"; -import { createRLNDecoder, createRLNEncoder } from "./codec.js"; -import { SEPOLIA_CONTRACT } from "./constants.js"; -import { RLNContract } from "./contract/index.js"; -import { dateToEpoch, epochIntToBytes } from "./epoch.js"; +import { + createRLNDecoder, + createRLNEncoder, + type RLNDecoder, + type RLNEncoder, +} from "./codec.js"; +import { RLNContract, SEPOLIA_CONTRACT } from "./contract/index.js"; +import { IdentityCredential } from "./identity.js"; import { Keystore } from "./keystore/index.js"; import type { DecryptedCredentials, @@ -22,14 +25,15 @@ import type { import { KeystoreEntity, Password } from "./keystore/types.js"; import { Proof, proofToBytes } from "./proof.js"; import verificationKey from "./resources/verification_key.js"; +import * as wc from "./resources/witness_calculator.js"; +import { WitnessCalculator } from "./resources/witness_calculator.js"; import { - buildBigIntFromUint8Array, concatenate, + dateToEpoch, + epochIntToBytes, extractMetaMaskSigner, writeUIntLE, } from "./utils/index.js"; -import * as wc from "./witness_calculator.js"; -import { WitnessCalculator } from "./witness_calculator.js"; async function loadWitnessCalculator(): Promise { const url = new URL("./resources/rln.wasm", import.meta.url); @@ -63,32 +67,6 @@ export async function create(): Promise { return new RLNInstance(zkRLN, witnessCalculator); } -export class IdentityCredential { - constructor( - public readonly IDTrapdoor: Uint8Array, - public readonly IDNullifier: Uint8Array, - public readonly IDSecretHash: Uint8Array, - public readonly IDCommitment: Uint8Array, - public readonly IDCommitmentBigInt: bigint - ) {} - - static fromBytes(memKeys: Uint8Array): IdentityCredential { - const idTrapdoor = memKeys.subarray(0, 32); - const idNullifier = memKeys.subarray(32, 64); - const idSecretHash = memKeys.subarray(64, 96); - const idCommitment = memKeys.subarray(96); - const idCommitmentBigInt = buildBigIntFromUint8Array(idCommitment); - - return new IdentityCredential( - idTrapdoor, - idNullifier, - idSecretHash, - idCommitment, - idCommitmentBigInt - ); - } -} - type StartRLNOptions = { /** * If not set - will extract MetaMask account and get signer from it. diff --git a/src/epoch.spec.ts b/src/utils/epoch.spec.ts similarity index 100% rename from src/epoch.spec.ts rename to src/utils/epoch.spec.ts diff --git a/src/epoch.ts b/src/utils/epoch.ts similarity index 100% rename from src/epoch.ts rename to src/utils/epoch.ts diff --git a/src/utils/index.ts b/src/utils/index.ts index f0faaab..b706700 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -6,3 +6,4 @@ export { zeroPadLE, } from "./bytes.js"; export { sha256, poseidonHash } from "./hash.js"; +export { dateToEpoch, epochIntToBytes, epochBytesToInt } from "./epoch.js";