diff --git a/packages/merkle-tree/README.md b/packages/merkle-tree/README.md new file mode 100644 index 0000000..b434124 --- /dev/null +++ b/packages/merkle-tree/README.md @@ -0,0 +1,145 @@ +

+

+ Merkle Tree +

+

Merkle tree implementation in TypeScript.

+

+ +

+ + + + + Github license + + + NPM version + + + Downloads + + + npm bundle size (scoped) + + + Linter eslint + + + Code style prettier + +

+ +--- + +## 🛠 Install + +### npm or yarn + +Install the `@zk-kit/merkle-tree` package with npm: + +```bash +npm i @zk-kit/merkle-tree --save +``` + +or yarn: + +```bash +yarn add @zk-kit/merkle-tree +``` + +### CDN + +You can also load it using a `script` tag using [unpkg](https://unpkg.com/): + +```html + +``` + +or [JSDelivr](https://www.jsdelivr.com/): + +```html + +``` + +## 📜 Usage + +\# **new MerkleTree**(hash: _HashFunction_, depth: _number_, zero: _Node_): _MerkleTree_ + +```typescript +import { MerkleTree } from "@zk-kit/merkle-tree" +import { poseidon } from "circomlibjs" // v0.0.8 + +const tree = new MerkleTree(poseidon, 16, BigInt(0)) + +console.log(tree.root) // 19217088683336594659449020493828377907203207941212636669271704950158751593251 +``` + +\# **insert**(leaf: _Node_) + +```typescript +tree.insert(BigInt(1)) + +console.log(tree.root) // 16211261537006706331557500769845541584780950636316907182067421710925347020533 +``` + +\# **delete**(index: _number_) + +```typescript +tree.delete(0) + +console.log(tree.root) // 19217088683336594659449020493828377907203207941212636669271704950158751593251 +``` + +\# **indexOf**(leaf: _Node_): _number_ + +```typescript +tree.insert(BigInt(2)) + +const index = tree.indexOf(BigInt(2)) + +console.log(index) // 1 +// The first element is the previously deleted leaf = 0. +``` + +\# **createProof**(index: _number_): _Proof_ + +```typescript +const proof = tree.createProof(1) + +console.log(proof) +/* +{ + root: 2187155820074874614256666533049960968550634565313477432886010125943412357599n, + leaf: 2n, + siblingNodes: [ + 0n, + 14744269619966411208579211824598458697587494354926760081771325075741142829156n, + 7423237065226347324353380772367382631490014989348495481811164164159255474657n, + 11286972368698509976183087595462810875513684078608517520839298933882497716792n, + 3607627140608796879659380071776844901612302623152076817094415224584923813162n, + 19712377064642672829441595136074946683621277828620209496774504837737984048981n, + 20775607673010627194014556968476266066927294572720319469184847051418138353016n, + 3396914609616007258851405644437304192397291162432396347162513310381425243293n, + 21551820661461729022865262380882070649935529853313286572328683688269863701601n, + 6573136701248752079028194407151022595060682063033565181951145966236778420039n, + 12413880268183407374852357075976609371175688755676981206018884971008854919922n, + 14271763308400718165336499097156975241954733520325982997864342600795471836726n, + 20066985985293572387227381049700832219069292839614107140851619262827735677018n, + 9394776414966240069580838672673694685292165040808226440647796406499139370960n, + 11331146992410411304059858900317123658895005918277453009197229807340014528524n, + 15819538789928229930262697811477882737253464456578333862691129291651619515538n + ], + path: [ + 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 + ] +} +*/ +``` + +\# **verifyProof**(proof: _Proof_): _boolean_ + +```typescript +console.log(tree.verifyProof(proof)) // true +``` diff --git a/packages/merkle-tree/build.tsconfig.json b/packages/merkle-tree/build.tsconfig.json new file mode 100644 index 0000000..415816a --- /dev/null +++ b/packages/merkle-tree/build.tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declarationDir": "dist/types" + }, + "include": ["src"] +} diff --git a/packages/merkle-tree/jest.config.json b/packages/merkle-tree/jest.config.json new file mode 100644 index 0000000..325fac1 --- /dev/null +++ b/packages/merkle-tree/jest.config.json @@ -0,0 +1,10 @@ +{ + "displayName": "merkle-tree", + "transform": { + "\\.(ts|tsx)": "ts-jest" + }, + "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$", + "moduleFileExtensions": ["ts", "js"], + "coveragePathIgnorePatterns": ["/node_modules/", "/test/"], + "collectCoverageFrom": ["src/**/*.{js,ts}"] +} diff --git a/packages/merkle-tree/package.json b/packages/merkle-tree/package.json new file mode 100644 index 0000000..a08e86d --- /dev/null +++ b/packages/merkle-tree/package.json @@ -0,0 +1,42 @@ +{ + "name": "@zk-kit/merkle-tree", + "version": "0.2.1", + "description": "Merkle tree implementation in TypeScript.", + "iife": "dist/index.js", + "unpkg": "dist/index.min.js", + "jsdelivr": "dist/index.min.js", + "main": "dist/index.node.js", + "exports": { + "import": "./dist/index.mjs", + "require": "./dist/index.node.js" + }, + "types": "dist/types/index.d.ts", + "files": [ + "dist/", + "src/", + "LICENSE", + "README.md" + ], + "repository": "git@github.com:appliedzkp/zk-kit.git", + "homepage": "https://github.com/appliedzkp/zk-kit/tree/main/packages/merkle-tree", + "author": { + "name": "Omar Desogus", + "email": "me@cedoor.dev", + "url": "https://cedoor.dev" + }, + "license": "MIT", + "scripts": { + "build:watch": "rollup -c rollup.config.ts -w --configPlugin typescript", + "build": "rimraf dist && rollup -c rollup.config.ts --configPlugin typescript", + "prepublishOnly": "yarn build" + }, + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@rollup/plugin-node-resolve": "^13.0.6", + "@rollup/plugin-typescript": "^8.3.0", + "circomlibjs": "^0.0.8", + "rollup-plugin-terser": "^7.0.2" + } +} diff --git a/packages/merkle-tree/rollup.config.ts b/packages/merkle-tree/rollup.config.ts new file mode 100644 index 0000000..4b84a64 --- /dev/null +++ b/packages/merkle-tree/rollup.config.ts @@ -0,0 +1,36 @@ +import { nodeResolve } from "@rollup/plugin-node-resolve" +import typescript from "@rollup/plugin-typescript" +import fs from "fs" +import { terser } from "rollup-plugin-terser" + +const pkg = JSON.parse(fs.readFileSync("./package.json", "utf8")) +const banner = `/** + * @module ${pkg.name} + * @version ${pkg.version} + * @file ${pkg.description} + * @copyright ${pkg.author.name} ${new Date().getFullYear()} + * @license ${pkg.license} + * @see [Github]{@link ${pkg.homepage}} +*/` +const name = pkg.name.substr(1).replace(/[-/]./g, (x: string) => x.toUpperCase()[1]) + +export default { + input: "src/index.ts", + output: [ + { + file: pkg.iife, + name, + format: "iife", + banner + }, + { + file: pkg.unpkg, + name, + format: "iife", + plugins: [terser({ output: { preamble: banner } })] + }, + { file: pkg.exports.require, format: "cjs", banner, exports: "auto" }, + { file: pkg.exports.import, format: "es", banner } + ], + plugins: [typescript({ tsconfig: "./build.tsconfig.json" }), nodeResolve()] +} diff --git a/packages/merkle-tree/src/checkParameter.ts b/packages/merkle-tree/src/checkParameter.ts new file mode 100644 index 0000000..32f7020 --- /dev/null +++ b/packages/merkle-tree/src/checkParameter.ts @@ -0,0 +1,9 @@ +export default function checkParameter(value: any, name: string, ...types: string[]) { + if (value === undefined) { + throw new TypeError(`Parameter '${name}' is not defined`) + } + + if (!types.includes(typeof value)) { + throw new TypeError(`Parameter '${name}' is none of these types: ${types.join(", ")}`) + } +} diff --git a/packages/merkle-tree/src/index.ts b/packages/merkle-tree/src/index.ts new file mode 100644 index 0000000..4e15bc7 --- /dev/null +++ b/packages/merkle-tree/src/index.ts @@ -0,0 +1,4 @@ +import MerkleTree from "./merkle-tree" + +export { MerkleTree } +export * from "./types" diff --git a/packages/merkle-tree/src/merkle-tree.ts b/packages/merkle-tree/src/merkle-tree.ts new file mode 100644 index 0000000..3673938 --- /dev/null +++ b/packages/merkle-tree/src/merkle-tree.ts @@ -0,0 +1,221 @@ +import checkParameter from "./checkParameter" +import { HashFunction, Proof, Node } from "./types" + +/** + * A Merkle tree is a tree in which every leaf node is labelled with the cryptographic hash of a + * data block, and every non-leaf node is labelled with the cryptographic hash of the labels of its child nodes. + * It allows efficient and secure verification of the contents of large data structures. + * The MerkleTree class is a TypeScript implementation of Merkle tree and it provides all the functions to create + * efficient trees and to generate and verify proofs of membership. + */ +export default class MerkleTree { + static readonly maxDepth = 32 // 2**32 = 4294967296 possible leaves. + + private _root: Node + private readonly _nodes: Node[][] + private readonly _zeroes: Node[] + private readonly _hash: HashFunction + private readonly _depth: number + + /** + * Initializes the Merkle tree with the hash function, the depth and the zero value to use for zeroes. + * @param hash Hash function. + * @param depth Tree depth. + * @param zeroValue Zero values for zeroes. + */ + constructor(hash: HashFunction, depth: number, zeroValue: Node) { + checkParameter(hash, "hash", "function") + checkParameter(depth, "depth", "number") + checkParameter(zeroValue, "zeroValue", "number", "string", "bigint") + + if (depth < 1 || depth > MerkleTree.maxDepth) { + throw new Error("The tree depth must be between 1 and 32") + } + + // Initialize the attributes. + this._hash = hash + this._depth = depth + this._zeroes = [] + this._nodes = [] + + for (let i = 0; i < depth; i += 1) { + this._zeroes.push(zeroValue) + this._nodes[i] = [] + // There must be a zero value for each tree level (except the root). + zeroValue = hash([zeroValue, zeroValue]) + } + + // The default root is the last zero value. + this._root = zeroValue + + // Freeze the array objects. It prevents unintentional changes. + Object.freeze(this._zeroes) + Object.freeze(this._nodes) + } + + /** + * Returns the root hash of the tree. + * @returns Root hash. + */ + public get root(): Node { + return this._root + } + + /** + * Returns the depth of the tree. + * @returns Tree depth. + */ + public get depth(): number { + return this._depth + } + + /** + * Returns the leaves of the tree. + * @returns List of leaves. + */ + public get leaves(): Node[] { + return this._nodes[0].slice() + } + + /** + * Returns the zeroes nodes of the tree. + * @returns List of zeroes. + */ + public get zeroes(): Node[] { + return this._zeroes + } + + /** + * Inserts a new leaf in the tree. + * @param leaf New leaf. + */ + public insert(leaf: Node) { + checkParameter(leaf, "leaf", "number", "string", "bigint") + + if (leaf === this._zeroes[0]) { + throw new Error("The leaf cannot be a zero value") + } + + if (this.leaves.length >= 2 ** this._depth) { + throw new Error("The tree is full") + } + + let node = leaf + + this.forEachLevel(this.leaves.length, (l, i, d) => { + this._nodes[l][i] = node + + if (d) { + node = this._hash([node, this._zeroes[l]]) + } else { + node = this._hash([this._nodes[l][i - 1], node]) + } + }) + + this._root = node + } + + /** + * Deletes a leaf from the tree. It does not remove the leaf from + * the data structure. It set the leaf to be deleted to a zero value. + * @param index Index of the leaf to be deleted. + */ + public delete(index: number) { + checkParameter(index, "index", "number") + + if (index < 0 || index >= this.leaves.length) { + throw new Error("The leaf does not exist in this tree") + } + + let node = this._zeroes[0] + + this.forEachLevel(index, (l, i, d) => { + this._nodes[l][i] = node + + if (d) { + node = this._hash([node, this._nodes[l][i + 1] || this._zeroes[l]]) + } else { + node = this._hash([this._nodes[l][i - 1], node]) + } + }) + + this._root = node + } + + /** + * Creates a proof of membership. + * @param index Index of the proof's leaf. + * @returns Proof object. + */ + public createProof(index: number): Proof { + checkParameter(index, "index", "number") + + if (index < 0 || index >= this.leaves.length) { + throw new Error("The leaf does not exist in this tree") + } + + const siblingNodes: Node[] = [] + const path: (0 | 1)[] = [] + + this.forEachLevel(index, (l, i, d) => { + if (d) { + path.push(0) + siblingNodes.push(this._nodes[l][i + 1] || this._zeroes[l]) + } else { + path.push(1) + siblingNodes.push(this._nodes[l][i - 1]) + } + }) + + return { root: this._root, leaf: this.leaves[index], siblingNodes, path } + } + + /** + * Verifies a proof and return true or false. + * @param proof Proof to be verified. + * @returns True or false. + */ + public verifyProof(proof: Proof): boolean { + checkParameter(proof, "proof", "object") + checkParameter(proof.root, "proof.root", "number", "string", "bigint") + checkParameter(proof.leaf, "proof.leaf", "number", "string", "bigint") + checkParameter(proof.siblingNodes, "proof.siblingNodes", "object") + checkParameter(proof.path, "proof.path", "object") + + let node = proof.leaf + + for (let i = 0; i < proof.siblingNodes.length; i += 1) { + if (proof.path[i]) { + node = this._hash([proof.siblingNodes[i], node]) + } else { + node = this._hash([node, proof.siblingNodes[i]]) + } + } + + return proof.root === node + } + + /** + * Returns the index of a leaf. If the leaf does not exist it returns -1. + * @param leaf Tree leaf. + * @returns Index of the leaf. + */ + public indexOf(leaf: Node): number { + checkParameter(leaf, "leaf", "number", "string", "bigint") + + return this.leaves.indexOf(leaf) + } + + /** + * Provides a bottom-up tree traversal where for each level it calls a callback. + * @param index Index of the leaf. + * @param callback Callback with tree level, index of node in that level and direction (left node: true, right node: false). + */ + private forEachLevel(index: number, callback: (level: number, index: number, direction: boolean) => void) { + for (let level = 0; level < this._depth; level += 1) { + callback(level, index, index % 2 === 0) + + index = Math.floor(index / 2) + } + } +} diff --git a/packages/merkle-tree/src/types/index.ts b/packages/merkle-tree/src/types/index.ts new file mode 100644 index 0000000..07f5aef --- /dev/null +++ b/packages/merkle-tree/src/types/index.ts @@ -0,0 +1,10 @@ +export type Node = any + +export type HashFunction = (values: Node[]) => Node + +export type Proof = { + root: Node + leaf: Node + siblingNodes: Node[] + path: (0 | 1)[] +} diff --git a/packages/merkle-tree/test/index.test.ts b/packages/merkle-tree/test/index.test.ts new file mode 100644 index 0000000..9a8623f --- /dev/null +++ b/packages/merkle-tree/test/index.test.ts @@ -0,0 +1,122 @@ +import { poseidon } from "circomlibjs" +import { MerkleTree } from "../src" + +describe("InterRep Merkle Tree", () => { + const depth = 16 + + let tree: MerkleTree + + describe("Merkle Tree class", () => { + beforeEach(() => { + tree = new MerkleTree(poseidon, depth, BigInt(0)) + }) + + it("Should not initialize a Merkle tree with wrong parameters", () => { + expect(() => new MerkleTree(undefined as any, 33, 0)).toThrow("Parameter 'hash' is not defined") + expect(() => new MerkleTree(1 as any, 33, 0)).toThrow("Parameter 'hash' is none of these types: function") + }) + + it("Should not initialize a Merkle tree with depth > 32", () => { + expect(() => new MerkleTree(poseidon, 33, BigInt(0))).toThrow("The tree depth must be between 1 and 32") + }) + + it("Should initialize a Merkle tree", () => { + expect(tree.depth).toEqual(depth) + expect(tree.root).toEqual( + BigInt("19217088683336594659449020493828377907203207941212636669271704950158751593251") + ) + expect(tree.leaves).toHaveLength(0) + expect(tree.zeroes).toHaveLength(depth) + }) + + it("Should not insert a zero leaf", () => { + expect(() => tree.insert(BigInt(0))).toThrow("The leaf cannot be a zero value") + }) + + it("Should not insert a leaf in a full tree", () => { + const fullTree = new MerkleTree(poseidon, 1, BigInt(0)) + + fullTree.insert(BigInt(1)) + fullTree.insert(BigInt(2)) + + expect(() => fullTree.insert(BigInt(3))).toThrow("The tree is full") + }) + + it("Should insert a leaf", () => { + tree.insert(BigInt(1)) + + expect(tree.root).toEqual( + BigInt("16211261537006706331557500769845541584780950636316907182067421710925347020533") + ) + expect(tree.leaves).toHaveLength(1) + }) + + it("Should not delete a leaf that does not exist", () => { + expect(() => tree.delete(0)).toThrow("The leaf does not exist in this tree") + }) + + it("Should delete a leaf", () => { + tree.insert(BigInt(1)) + + tree.delete(0) + + expect(tree.root).toEqual( + BigInt("19217088683336594659449020493828377907203207941212636669271704950158751593251") + ) + expect(tree.leaves[0]).toEqual(BigInt(0)) + }) + + it("Should delete all the leaves of a tree", () => { + tree.insert(BigInt(1)) + tree.insert(BigInt(2)) + tree.insert(BigInt(3)) + + tree.delete(0) + tree.delete(1) + tree.delete(2) + + expect(tree.root).toEqual( + BigInt("19217088683336594659449020493828377907203207941212636669271704950158751593251") + ) + }) + + it("Should return the index of a leaf", () => { + tree.insert(BigInt(1)) + tree.insert(BigInt(2)) + + const index = tree.indexOf(BigInt(2)) + + expect(index).toEqual(1) + }) + + it("Should not create any proof if the leaf does not exist", () => { + tree.insert(BigInt(1)) + + expect(() => tree.createProof(1)).toThrow("The leaf does not exist in this tree") + }) + + it("Should create a valid proof", () => { + tree.insert(BigInt(1)) + tree.insert(BigInt(2)) + tree.insert(BigInt(3)) + tree.insert(BigInt(4)) + tree.insert(BigInt(5)) + + tree.delete(0) + tree.delete(2) + + for (let i = 0; i < 5; i += 1) { + const proof = tree.createProof(i) + + expect(tree.verifyProof(proof)).toBeTruthy() + } + }) + + it("Should not verify any proof if the parameters are wrong", () => { + expect(() => tree.verifyProof(1 as any)).toThrow("Parameter 'proof' is none of these types: object") + expect(() => tree.verifyProof({ root: true } as any)).toThrow( + "Parameter 'proof.root' is none of these types: number, string, bigint" + ) + }) + }) +}) diff --git a/packages/merkle-tree/tsconfig.json b/packages/merkle-tree/tsconfig.json new file mode 100644 index 0000000..91d87e3 --- /dev/null +++ b/packages/merkle-tree/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src", "test", "types", "rollup.config.ts"] +} diff --git a/packages/merkle-tree/types/circomlibjs/index.d.ts b/packages/merkle-tree/types/circomlibjs/index.d.ts new file mode 100644 index 0000000..143e781 --- /dev/null +++ b/packages/merkle-tree/types/circomlibjs/index.d.ts @@ -0,0 +1,895 @@ +/** Declaration file generated by dts-gen */ + +declare module "circomlibjs" { + export class evmasm { + constructor(...args: any[]) + + add(...args: any[]): void + + addmod(...args: any[]): void + + address(...args: any[]): void + + and(...args: any[]): void + + balance(...args: any[]): void + + blockhash(...args: any[]): void + + byte(...args: any[]): void + + call(...args: any[]): void + + callcode(...args: any[]): void + + calldatacopy(...args: any[]): void + + calldataload(...args: any[]): void + + calldatasize(...args: any[]): void + + caller(...args: any[]): void + + callvalue(...args: any[]): void + + codecopy(...args: any[]): void + + codesize(...args: any[]): void + + coinbase(...args: any[]): void + + create(...args: any[]): void + + createTxData(...args: any[]): void + + delegatecall(...args: any[]): void + + difficulty(...args: any[]): void + + div(...args: any[]): void + + dup(...args: any[]): void + + eq(...args: any[]): void + + exp(...args: any[]): void + + extcodecopy(...args: any[]): void + + extcodesize(...args: any[]): void + + gas(...args: any[]): void + + gaslimit(...args: any[]): void + + gasprice(...args: any[]): void + + gt(...args: any[]): void + + invalid(...args: any[]): void + + iszero(...args: any[]): void + + jmp(...args: any[]): void + + jmpi(...args: any[]): void + + keccak(...args: any[]): void + + label(...args: any[]): void + + log0(...args: any[]): void + + log1(...args: any[]): void + + log2(...args: any[]): void + + log3(...args: any[]): void + + log4(...args: any[]): void + + lt(...args: any[]): void + + mload(...args: any[]): void + + mod(...args: any[]): void + + msize(...args: any[]): void + + mstore(...args: any[]): void + + mstore8(...args: any[]): void + + mul(...args: any[]): void + + mulmod(...args: any[]): void + + not(...args: any[]): void + + number(...args: any[]): void + + or(...args: any[]): void + + origin(...args: any[]): void + + pc(...args: any[]): void + + pop(...args: any[]): void + + push(...args: any[]): void + + return(...args: any[]): void + + returndatacopy(...args: any[]): void + + returndatasize(...args: any[]): void + + revert(...args: any[]): void + + sdiv(...args: any[]): void + + selfdestruct(...args: any[]): void + + sgt(...args: any[]): void + + sha3(...args: any[]): void + + shor(...args: any[]): void + + signextend(...args: any[]): void + + sload(...args: any[]): void + + slt(...args: any[]): void + + smod(...args: any[]): void + + sstore(...args: any[]): void + + staticcall(...args: any[]): void + + stop(...args: any[]): void + + sub(...args: any[]): void + + swap(...args: any[]): void + + timestamp(...args: any[]): void + } + + export class smt_memdb { + constructor(...args: any[]) + + get(...args: any[]): void + + getRoot(...args: any[]): void + + multiDel(...args: any[]): void + + multiGet(...args: any[]): void + + multiIns(...args: any[]): void + + setRoot(...args: any[]): void + } + + export function poseidon(inputs: any): any + + export function poseidon_slow(inputs: any): any + + export namespace babyjub { + const A: any + + const Base8: any[] + + const D: any + + const Generator: any[] + + const order: any + + const p: any + + const subOrder: any + + function addPoint(a: any, b: any): any + + function inCurve(P: any): any + + function inSubgroup(P: any): any + + function mulPointEscalar(base: any, e: any): any + + function packPoint(P: any): any + + function unpackPoint(_buff: any): any + + namespace F { + const R: any + + const Ri: any + + const bitLength: number + + const half: any + + const m: number + + const mask: any + + const n32: number + + const n64: number + + const n8: number + + const negone: any + + const nqr: any + + const nqr_to_t: any + + const one: any + + const p: any + + const s: number + + const sqrt_q: any + + const sqrt_s: number + + const sqrt_t: any + + const sqrt_tm1d2: any + + const sqrt_z: any + + const t: any + + const two: any + + const type: string + + const zero: any + + function add(...args: any[]): void + + function band(...args: any[]): void + + function bnot(...args: any[]): void + + function bor(...args: any[]): void + + function bxor(...args: any[]): void + + function div(...args: any[]): void + + function e(...args: any[]): void + + function eq(...args: any[]): void + + function exp(...args: any[]): void + + function fromRng(...args: any[]): void + + function fromRprBE(...args: any[]): void + + function fromRprBEM(...args: any[]): void + + function fromRprLE(...args: any[]): void + + function fromRprLEM(...args: any[]): void + + function geq(...args: any[]): void + + function gt(...args: any[]): void + + function idiv(...args: any[]): void + + function inv(...args: any[]): void + + function isZero(...args: any[]): void + + function land(...args: any[]): void + + function leq(...args: any[]): void + + function lnot(...args: any[]): void + + function lor(...args: any[]): void + + function lt(...args: any[]): void + + function mod(...args: any[]): void + + function mul(...args: any[]): void + + function mulScalar(...args: any[]): void + + function neg(...args: any[]): void + + function neq(...args: any[]): void + + function normalize(...args: any[]): void + + function pow(...args: any[]): void + + function random(...args: any[]): void + + function shl(...args: any[]): void + + function shr(...args: any[]): void + + function sqrt(a: any): any + + function sqrt_old(...args: any[]): void + + function square(...args: any[]): void + + function sub(...args: any[]): void + + function toRprBE(...args: any[]): void + + function toRprBEM(...args: any[]): void + + function toRprLE(...args: any[]): void + + function toRprLEM(...args: any[]): void + + function toString(...args: any[]): void + } + } + + export namespace eddsa { + function packSignature(sig: any): any + + function pruneBuffer(_buff: any): any + + function prv2pub(prv: any): any + + function sign(prv: any, msg: any): any + + function signMiMC(prv: any, msg: any): any + + function signMiMCSponge(prv: any, msg: any): any + + function signPoseidon(prv: any, msg: any): any + + function unpackSignature(sigBuff: any): any + + function verify(msg: any, sig: any, A: any): any + + function verifyMiMC(msg: any, sig: any, A: any): any + + function verifyMiMCSponge(msg: any, sig: any, A: any): any + + function verifyPoseidon(msg: any, sig: any, A: any): any + } + + export namespace mimc7 { + function getConstants(seed: any, nRounds: any): any + + function getIV(seed: any): any + + function hash(_x_in: any, _k: any): any + + function multiHash(arr: any, key: any): any + + namespace F { + const R: any + + const Ri: any + + const bitLength: number + + const half: any + + const m: number + + const mask: any + + const n32: number + + const n64: number + + const n8: number + + const negone: any + + const nqr: any + + const nqr_to_t: any + + const one: any + + const p: any + + const s: number + + const sqrt_q: any + + const sqrt_s: number + + const sqrt_t: any + + const sqrt_tm1d2: any + + const sqrt_z: any + + const t: any + + const two: any + + const type: string + + const zero: any + + function add(...args: any[]): void + + function band(...args: any[]): void + + function bnot(...args: any[]): void + + function bor(...args: any[]): void + + function bxor(...args: any[]): void + + function div(...args: any[]): void + + function e(...args: any[]): void + + function eq(...args: any[]): void + + function exp(...args: any[]): void + + function fromRng(...args: any[]): void + + function fromRprBE(...args: any[]): void + + function fromRprBEM(...args: any[]): void + + function fromRprLE(...args: any[]): void + + function fromRprLEM(...args: any[]): void + + function geq(...args: any[]): void + + function gt(...args: any[]): void + + function idiv(...args: any[]): void + + function inv(...args: any[]): void + + function isZero(...args: any[]): void + + function land(...args: any[]): void + + function leq(...args: any[]): void + + function lnot(...args: any[]): void + + function lor(...args: any[]): void + + function lt(...args: any[]): void + + function mod(...args: any[]): void + + function mul(...args: any[]): void + + function mulScalar(...args: any[]): void + + function neg(...args: any[]): void + + function neq(...args: any[]): void + + function normalize(...args: any[]): void + + function pow(...args: any[]): void + + function random(...args: any[]): void + + function shl(...args: any[]): void + + function shr(...args: any[]): void + + function sqrt(a: any): any + + function sqrt_old(...args: any[]): void + + function square(...args: any[]): void + + function sub(...args: any[]): void + + function toRprBE(...args: any[]): void + + function toRprBEM(...args: any[]): void + + function toRprLE(...args: any[]): void + + function toRprLEM(...args: any[]): void + + function toString(...args: any[]): void + } + } + + export namespace mimc_gencontract { + const abi: { + constant: boolean + inputs: { + name: string + type: string + }[] + name: string + outputs: { + name: string + type: string + }[] + payable: boolean + stateMutability: string + type: string + }[] + + function createCode(seed: any, n: any): any + } + + export namespace mimcsponge { + function getConstants(seed: any, nRounds: any): any + + function getIV(seed: any): any + + function hash(_xL_in: any, _xR_in: any, _k: any): any + + function multiHash(arr: any, key: any, numOutputs: any): any + } + + export namespace mimcsponge_gencontract { + const abi: { + constant: boolean + inputs: { + name: string + type: string + }[] + name: string + outputs: { + name: string + type: string + }[] + payable: boolean + stateMutability: string + type: string + }[] + + function createCode(seed: any, n: any): any + } + + export namespace pedersenHash { + function getBasePoint(baseHashType: any, pointIdx: any): any + + function hash(msg: any, options: any): any + } + + export namespace poseidon_gencontract { + function createCode(nInputs: any): any + + function generateABI(nInputs: any): any + } + + export namespace smt { + class SMT { + constructor(...args: any[]) + + delete(...args: any[]): void + + find(...args: any[]): void + + insert(...args: any[]): void + + update(...args: any[]): void + } + + class SMTMemDB { + constructor(...args: any[]) + + get(...args: any[]): void + + getRoot(...args: any[]): void + + multiDel(...args: any[]): void + + multiGet(...args: any[]): void + + multiIns(...args: any[]): void + + setRoot(...args: any[]): void + } + + function loadFromFile(fileName: any): void + + function newMemEmptyTrie(): any + } + + export namespace smt_hashes_mimc { + function hash0(left: any, right: any): any + + function hash1(key: any, value: any): any + + namespace F { + const R: any + + const Ri: any + + const bitLength: number + + const half: any + + const m: number + + const mask: any + + const n32: number + + const n64: number + + const n8: number + + const negone: any + + const nqr: any + + const nqr_to_t: any + + const one: any + + const p: any + + const s: number + + const sqrt_q: any + + const sqrt_s: number + + const sqrt_t: any + + const sqrt_tm1d2: any + + const sqrt_z: any + + const t: any + + const two: any + + const type: string + + const zero: any + + function add(...args: any[]): void + + function band(...args: any[]): void + + function bnot(...args: any[]): void + + function bor(...args: any[]): void + + function bxor(...args: any[]): void + + function div(...args: any[]): void + + function e(...args: any[]): void + + function eq(...args: any[]): void + + function exp(...args: any[]): void + + function fromRng(...args: any[]): void + + function fromRprBE(...args: any[]): void + + function fromRprBEM(...args: any[]): void + + function fromRprLE(...args: any[]): void + + function fromRprLEM(...args: any[]): void + + function geq(...args: any[]): void + + function gt(...args: any[]): void + + function idiv(...args: any[]): void + + function inv(...args: any[]): void + + function isZero(...args: any[]): void + + function land(...args: any[]): void + + function leq(...args: any[]): void + + function lnot(...args: any[]): void + + function lor(...args: any[]): void + + function lt(...args: any[]): void + + function mod(...args: any[]): void + + function mul(...args: any[]): void + + function mulScalar(...args: any[]): void + + function neg(...args: any[]): void + + function neq(...args: any[]): void + + function normalize(...args: any[]): void + + function pow(...args: any[]): void + + function random(...args: any[]): void + + function shl(...args: any[]): void + + function shr(...args: any[]): void + + function sqrt(a: any): any + + function sqrt_old(...args: any[]): void + + function square(...args: any[]): void + + function sub(...args: any[]): void + + function toRprBE(...args: any[]): void + + function toRprBEM(...args: any[]): void + + function toRprLE(...args: any[]): void + + function toRprLEM(...args: any[]): void + + function toString(...args: any[]): void + } + } + + export namespace smt_hashes_poseidon { + function hash0(left: any, right: any): any + + function hash1(key: any, value: any): any + + namespace F { + const R: any + + const Ri: any + + const bitLength: number + + const half: any + + const m: number + + const mask: any + + const n32: number + + const n64: number + + const n8: number + + const negone: any + + const nqr: any + + const nqr_to_t: any + + const one: any + + const p: any + + const s: number + + const sqrt_q: any + + const sqrt_s: number + + const sqrt_t: any + + const sqrt_tm1d2: any + + const sqrt_z: any + + const t: any + + const two: any + + const type: string + + const zero: any + + function add(...args: any[]): void + + function band(...args: any[]): void + + function bnot(...args: any[]): void + + function bor(...args: any[]): void + + function bxor(...args: any[]): void + + function div(...args: any[]): void + + function e(...args: any[]): void + + function eq(...args: any[]): void + + function exp(...args: any[]): void + + function fromRng(...args: any[]): void + + function fromRprBE(...args: any[]): void + + function fromRprBEM(...args: any[]): void + + function fromRprLE(...args: any[]): void + + function fromRprLEM(...args: any[]): void + + function geq(...args: any[]): void + + function gt(...args: any[]): void + + function idiv(...args: any[]): void + + function inv(...args: any[]): void + + function isZero(...args: any[]): void + + function land(...args: any[]): void + + function leq(...args: any[]): void + + function lnot(...args: any[]): void + + function lor(...args: any[]): void + + function lt(...args: any[]): void + + function mod(...args: any[]): void + + function mul(...args: any[]): void + + function mulScalar(...args: any[]): void + + function neg(...args: any[]): void + + function neq(...args: any[]): void + + function normalize(...args: any[]): void + + function pow(...args: any[]): void + + function random(...args: any[]): void + + function shl(...args: any[]): void + + function shr(...args: any[]): void + + function sqrt(a: any): any + + function sqrt_old(...args: any[]): void + + function square(...args: any[]): void + + function sub(...args: any[]): void + + function toRprBE(...args: any[]): void + + function toRprBEM(...args: any[]): void + + function toRprLE(...args: any[]): void + + function toRprLEM(...args: any[]): void + + function toString(...args: any[]): void + } + } +}