diff --git a/.cspell.json b/.cspell.json index 0daa01b..0073fbe 100644 --- a/.cspell.json +++ b/.cspell.json @@ -13,7 +13,14 @@ "vkey", "Waku", "zerokit", - "zkey" + "zkey", + "Keccak", + "keccak", + "chainsafe", + "kdfparams", + "ciphertext", + "cipherparams", + "codegen" ], "flagWords": [], "ignorePaths": [ diff --git a/.eslintrc.json b/.eslintrc.json index 2b07974..46a471f 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -7,7 +7,14 @@ "env": { "es6": true }, - "ignorePatterns": ["node_modules", "build", "coverage", "proto"], + "ignorePatterns": [ + "node_modules", + "build", + "coverage", + "proto", + "*/**/credential_validation_generated.ts", + "*/**/keystore_validation_generated.ts" + ], "plugins": ["import", "eslint-comments", "functional"], "extends": [ "eslint:recommended", diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..0350437 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +*/**/*_generated.ts \ No newline at end of file diff --git a/example/index.js b/example/index.js index 5762b9e..4b2e9d3 100644 --- a/example/index.js +++ b/example/index.js @@ -62,3 +62,99 @@ rln.create().then(async (rlnInstance) => { const event = await contract.registerMember(rlnInstance, signature); console.log(`Registered as member with ${event}`); }); + +const run = async () => { + const data = { + "application": "waku-rln-relay", + "appIdentifier": "01234567890abcdef", + "credentials": { + "9DB2B4718A97485B9F70F68D1CC19F4E10F0B4CE943418838E94956CB8E57548": { + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "fd6b39eb71d44c59f6bf5ff3d8945c80" + }, + "ciphertext": "9c72f47ce95de03ed34502d0288e7576b66b51b9e7d5ae882c27bd89f94e6a03c2c44c2ddf0c982e72003d67212105f1b64614f57cabb0ceadab7e07be165eee1121ad6b81951368a9f3be2dd99ea294515f6013d5f2bd4702a40e36cfde2ea298b23b31e5ce719d8040c3331f73d6bf44f88bca39bac0e917d8bf545500e4f40d321c235426a80f315ac70666acbd3bdf803fbc1e7e7103fed466525ed332b25d72b2dbedf6fa383b2305987c1fe276b029570519b3e79930edf08c1029868d05c2c08ab61d7c64f63c054b4f6a5a12d43cdc79751b6fe58d3ed26b69443eb7c9f7efce27912340129c91b6b813ac94efd5776a40b1dda896d61357de208c7c47a14af911cc231355c8093ee6626e89c07e1037f9e0b22c690e3e049014399ca0212c509cb04c71c7860d1b17a0c47711c490c27bad2825926148a1f15a507f36ba2cdaa04897fce2914e53caed0beaf1bebd2a83af76511cc15bff2165ff0860ad6eca1f30022d7739b2a6b6a72f2feeef0f5941183cda015b4631469e1f4cf27003cab9a90920301cb30d95e4554686922dc5a05c13dfb575cdf113c700d607896011970e6ee7d6edb61210ab28ac8f0c84c606c097e3e300f0a5f5341edfd15432bef6225a498726b62a98283829ad51023b2987f30686cfb4ea3951f3957654035ec291f9b0964a3a8665d81b16cec20fb40f944d5f9bf03ac1e444ad45bae3fa85e7465ce620c0966d8148d6e2856f676c4fbbe3ebe470453efb4bbda1866680037917e37765f680e3da96ef3991f3fe5cda80c523996c2234758bf5f7b6d052dc6942f5a92c8b8eec5d2d8940203bbb6b1cba7b7ebc1334334ca69cdb509a5ea58ec6b2ebaea52307589eaae9430eb15ad234c0c39c83accdf3b77e52a616e345209c5bc9b442f9f0fa96836d9342f983a7", + "kdf": "pbkdf2", + "kdfparams": { + "dklen": 32, + "c": 1000000, + "prf": "hmac-sha256", + "salt": "60f0aa92fbf63a8356dfdbed2ab18058" + }, + "mac": "51a227ac6db7f2797c63925880b3db664e034231a4c68daa919ab42d8df38bc6" + } + }, + "263335559F0578FD785F9CDFEDBB45CFF276799A27580B8F580CDFDCB990257C": { + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "69f95461f811ac35a21987b1fdaa605e" + }, + "ciphertext": "edfe844f8e2aedd62f26753e7247554920352b6b167f54ea4f728cd715577e9d2b7192b782471914870794205e77c2708b6db2d0ada19fec6b3533098cb2b7350bbaf81526d6bde7f1d0e83c366e3a2ddcced942cfb09a3c7704db7041132c3b511fed2f6d8599e6cddf649250b240687c2c335bf0aa75c892bc97f81c537898aefed20d1488e816d54eec72572acf36f140dc98cba0430cdeb8a00b8e8c8edf9b1292ca0e9c9a606acec51ea3dbe46438cb74b95d708cec18f8f126aecabbff11dd068d9194b25803f959f0bb62d49785dbc694486754f46bfe084cfa780cae27eca48cdcc88f4083d166d1747b8e2e637619e5d3848b9b6cdf7c7161eda8e476edfc083d417691d47b84fb224bfd26bf7713958893b934388e50783e49c5c84999971538ccda14c54b48b0d4aa37503e2a40212e9a1407d5a1ea4e96760de3d87e1b2287465a4e51cf330b7f1d14e3f2fb6521d10d32c798856464927b1e0286086a78f07a8f6f436d8c0c7b530f585320515e276d82c7b1f244702fa9ca6e6ad164fd2b1d9badcbdc17e01e95abf58e6825d8eeba5bc22db3a66dd41c64887d4c862298e921b3bae17d9fb7be1f619c60c82bd60dee351b77514d36e25d4092d6cde8ab613c40a117f7b784c80d65310e5b9cf1a31ba555f848e6984cc0c2d48315167d60131f3ffaaca5c81e359134bbfc81fa217f29b533868604ced4a2c5da8c89bd1238147b9f348168864ebea40c36a6abbf3d59d43086f26777104ce0a9f60cbf350058a337bc66abd5e4976950e5908192f98a9a8c1913abbc0d918479aeaa99e89a0e5cd65fd84a347d73df1d9c829863728a6fcd90150e52ecdec48bd07802110384f6c0aff0ca05ad42feb521223b58719fd4fc4ae88df8225ea58e303e4c61e8288e80f854bf0b", + "kdf": "pbkdf2", + "kdfparams": { + "dklen": 32, + "c": 1000000, + "prf": "hmac-sha256", + "salt": "3cf796e4857f296bef3bdb9ca844b1bf" + }, + "mac": "3d6cb0492afcf89c891365f097ae8989dc50038010c419b18228be6816c24c32" + } + }, + "F62A7FCE85E5B796AFCB38F54A44210515CB688EA0224E9A436CCA0A542F2C9D": { + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "49816dacf881c85db9f11f7f068dcf71" + }, + "ciphertext": "d7d805ee24dd34368e3d1829aa6d0856ca2ea54d9bcdc2655f8f197af0d293aff56c6e06de3137b0eddffbcad7cc0b8e3f6ba761ac7983d8e59ce04c8936868297b9f70238cb295e17567f2404b278b93c985496a6e1e46185965491449ccbc1e7155224acdba354ed18b1b9867ff6f1a833a77c9b21e2e9c4b6af27d5bd6303efd574465920928e5c467bd3c7888c3f31e8bece6af2e0c35fa03661399e9b420eeecd4376cb2b3266692f46c03161bb32cc2c79521f7b19cb0e6ec911213e105967f8887d94c73e793b18e4c14ee045dca13fcfb62ae267d3175f8a4fefd0e8bd636bd9431cc0cc7119e75f116a16dcbdcac1c15a3dcec57e1c49dbf5dccd1c75c0cfcb3473e81e8546048ce5231a4d4c8dd5d66311354e9ab70ad5745d5be27746954a08b0b29218562bfb632ae0a498cf09d7955a27377ed7a50fc1b4adaa0a3fb3e87a3b4d923136be0767a1428050944b9fd247332dea1b5016dfa1ec4da167e70e11e07cd58034b8470366dc16d77978b49a61e213ab5a7817fd69af26c2a8c3cd3a488d6e1491e0215071e1f3e9d49d0dfab3a7e324644c98a088e20259980495dcc379dcdce2e61752711bdf8abf057a2e696624078601245828193d838cc806065ee3f2bb138302ec72c70f34f14c0ab816211011f0ac55423732875e220175c717f6bc86f071bb4fab51c1963eb5c5d70d504c1e4d2307a8c8c4b8b5a84566a4606deb3fc6d7a420adc2b2b37c0ef3018f82a3ce0044e082407e8e7cb6214a3abc139b7f75b2c36c6902080e7696c730ab062e75e597274e0c945b6a7a366d20bd210dd02b097071142d033597e2fc4174be683a866510fa1c2fe150a2fb81dbd2b5da25da27f29367fb22dd4e9d4785856e4deea56219f9495fb3ab772f7867db11cb14026b", + "kdf": "pbkdf2", + "kdfparams": { + "dklen": 32, + "c": 1000000, + "prf": "hmac-sha256", + "salt": "2dcb5ba5c98fe5e46d961dad36e79a5b" + }, + "mac": "2d6e9de6440f52c5db64b13f80399967c8770e82616294e14f40a2e213e7d925" + } + }, + "8479C6B9125D43E7B7739F1BAB41779F2F5A4D27FF0E2B6F6CA353032010A22C": { + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "b0eef2c385a04909c4ae9b318e179fa7" + }, + "ciphertext": "90b982222072366566fa194be5c170506888e184cadbd52aa38f184ac4e9bc160cc719d809fb6a128e0cbd908e70a71efdc5d51c4dab8aab71e3e6a2ebd9ea4238cb47585137990e896dfa53961bb2b328abfbba82f49db6a9b6e3790cf9e29c145796c6dbf409dc875e7998db827c944a835a29ab4192a11ad1efde5ebdd1a775ecbfefd139c50fbdcbebd6c124d9d65ba6ddaaa83e57695293e7c85dfd6f418d58fa5ffb9ab9b2395c84b57da796d31b6351fde3f1dbab29da6c3f259859bd0719c34f5111a9a12075b53ee91b4598fb2f452dbea823ec094cb757f370b5386a8e5db25cf732681d0cd9bda651ae55cdd125138fd2c8f1ffe87a5eea14df7d355762b37e3e71c33c6fe46a10c2083538910fec12e294de84ff587cab2dd268203699cb180e481f4a3a093b86854cea64341dd9482305abd4a9d7bb304b078bc255bf7cde78689225f17006f24c2cd82d38a59f1e0899965c38fcfd1ec67069143ee05a34922963a527549a002e3221e1461463f573e5f66ba87dcb83a63cb8e3a721c13cd9d4d0c9a0334a558f32027424a5bc9fc12b91981a3f74ac4b62eea3aae8be6c44504696b96afadce5d9222bb67dddf5a7d98dd43d544d79f8720a946c37eba8eb5ae6d70f4bdbbe554cbd4b3abb35ed357c8cb8f55e016ab83bef12bf5c0cdf26c7624c86f16437f545d796addb1aa7370de329930c68b174c871706e7afdf78cc07e0f0c58e45495d0d3bcf3faf9fb6d20369b0adc89766b0c9132677e52112770d017da7658f2a0c0eaeac57416f203700f98bf7b30119407733d4f0bd4322c622120cdf81646c4a1adfb80e757954e41ba0e7816c403b2e4b9ceb2d36e4198921ea719a410ae6f6983e49e7b99c266deb0465af716799e36a5bab70923291da808edeba54267e31e8b64c37123fd45d86e0638", + "kdf": "pbkdf2", + "kdfparams": { + "dklen": 32, + "c": 1000000, + "prf": "hmac-sha256", + "salt": "142a0a65b7f6f480546cc4ef743d7ef9" + }, + "mac": "7119b7b78598850de5f6af742e42748a3b005394b6b8b272490f24527ebd8b15" + } + } + }, + "version": "0.2" + }; + + const keystore = await rln.Keystore.fromObject(data); + + const identity = { + "idTrapdoor":[248,73,210,129,12,83,146,208,57,117,35,145,20,66,203,61,238,130,60,23,94,249,123,92,114,190,24,0,4,242,10,24], + "idNullifier":[80,233,27,57,133,192,162,150,251,120,215,194,103,198,249,177,225,15,68,137,221,204,174,12,107,102,123,129,111,191,121,22], + "idSecretHash":[120,204,2,248,110,149,95,135,222,176,27,137,217,255,86,205,74,130,21,250,220,111,203,11,199,229,25,76,146,3,249,13], + "idCommitment":[71,207,30,230,39,50,198,40,128,131,79,200,166,168,187,137,235,132,131,164,92,233,195,170,21,205,94,85,246,144,203,9] + }; + const membership = { + "chainId":"0xAA36A7","address":"0x0A988fd9CA5BAebDf098b8A73621b2AaDa6492E8","treeIndex":66851 + }; + + await keystore.addCredential({ identity, membership }, "sup3rsecure"); + + await keystore.readCredential("8479C6B9125D43E7B7739F1BAB41779F2F5A4D27FF0E2B6F6CA353032010A22C", "sup3rsecure").then(console.log); +}; + +run(); \ No newline at end of file diff --git a/example/package-lock.json b/example/package-lock.json index 656ce29..a176628 100644 --- a/example/package-lock.json +++ b/example/package-lock.json @@ -8,7 +8,8 @@ "name": "@waku/rln-example", "version": "0.1.0", "dependencies": { - "@waku/rln": "file:../" + "@waku/rln": "file:../", + "@waku/utils": "^0.0.11" }, "devDependencies": { "copy-webpack-plugin": "^11.0.0", @@ -22,9 +23,13 @@ "version": "0.1.1", "license": "MIT OR Apache-2.0", "dependencies": { - "@waku/utils": "^0.0.6", + "@chainsafe/bls-keystore": "^3.0.0", + "@waku/utils": "^0.0.11", "@waku/zerokit-rln-wasm": "^0.0.10", - "ethers": "^5.7.2" + "ethers": "^5.7.2", + "lodash": "^4.17.21", + "rlnjs": "^3.2.3", + "uuid": "^9.0.1" }, "devDependencies": { "@rollup/plugin-commonjs": "^22.0.2", @@ -36,6 +41,7 @@ "@types/chai": "^4.2.15", "@types/chai-spies": "^1.0.3", "@types/debug": "^4.1.7", + "@types/lodash": "^4.14.199", "@types/mocha": "^9.1.0", "@types/node": "^17.0.6", "@types/tail": "^2.0.0", @@ -46,6 +52,8 @@ "@waku/interfaces": "^0.0.13", "@waku/message-encryption": "^0.0.16", "@web/rollup-plugin-import-meta-assets": "^1.0.7", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", "app-root-path": "^3.0.0", "chai": "^4.3.4", "chai-spies": "^1.0.0", @@ -365,10 +373,52 @@ "@types/node": "*" } }, + "node_modules/@waku/interfaces": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@waku/interfaces/-/interfaces-0.0.18.tgz", + "integrity": "sha512-esgXs8fZTth+7DSndnB92/YPOnpn0rD0E4GPu/yfQZbwSS+pPyfpk58iklgWterD/CelB487X4qy0ooe2uWrBg==", + "engines": { + "node": ">=16" + } + }, "node_modules/@waku/rln": { "resolved": "..", "link": true }, + "node_modules/@waku/utils": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@waku/utils/-/utils-0.0.11.tgz", + "integrity": "sha512-AG/S9vxqqxQUO9dlfi5Apv5o364dIzg3cLm32qstqQDSWw3QGhOSRLg+MBxdFrfmELCI3O1zdMoGdLRaZIwr8Q==", + "dependencies": { + "@waku/interfaces": "0.0.18", + "debug": "^4.3.4", + "uint8arrays": "^4.0.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@waku/utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@waku/utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -2173,6 +2223,15 @@ "multicast-dns": "cli.js" } }, + "node_modules/multiformats": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.2.tgz", + "integrity": "sha512-6mRIsrZXyw5xNPO31IGBMmxgDXBSgCGDsBAtazkZ02ip4hMwZNrQvfxXZtytRoBSWuzSq5f9VmMnXj76fIz5FQ==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -3260,6 +3319,14 @@ "node": ">= 0.6" } }, + "node_modules/uint8arrays": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.6.tgz", + "integrity": "sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw==", + "dependencies": { + "multiformats": "^12.0.1" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -3940,9 +4007,15 @@ "@types/node": "*" } }, + "@waku/interfaces": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@waku/interfaces/-/interfaces-0.0.18.tgz", + "integrity": "sha512-esgXs8fZTth+7DSndnB92/YPOnpn0rD0E4GPu/yfQZbwSS+pPyfpk58iklgWterD/CelB487X4qy0ooe2uWrBg==" + }, "@waku/rln": { "version": "file:..", "requires": { + "@chainsafe/bls-keystore": "^3.0.0", "@rollup/plugin-commonjs": "^22.0.2", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^13.3.0", @@ -3952,6 +4025,7 @@ "@types/chai": "^4.2.15", "@types/chai-spies": "^1.0.3", "@types/debug": "^4.1.7", + "@types/lodash": "^4.14.199", "@types/mocha": "^9.1.0", "@types/node": "^17.0.6", "@types/tail": "^2.0.0", @@ -3961,9 +4035,11 @@ "@waku/core": "^0.0.18", "@waku/interfaces": "^0.0.13", "@waku/message-encryption": "^0.0.16", - "@waku/utils": "^0.0.6", + "@waku/utils": "^0.0.11", "@waku/zerokit-rln-wasm": "^0.0.10", "@web/rollup-plugin-import-meta-assets": "^1.0.7", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", "app-root-path": "^3.0.0", "chai": "^4.3.4", "chai-spies": "^1.0.0", @@ -3987,6 +4063,7 @@ "karma-mocha": "^2.0.1", "karma-webpack": "^5.0.0", "lint-staged": "^13.0.3", + "lodash": "^4.17.21", "mocha": "10.1.0", "npm-run-all": "^4.1.5", "p-timeout": "^4.1.0", @@ -3994,6 +4071,7 @@ "process": "^0.11.10", "puppeteer": "^13.0.1", "resolve-typescript-plugin": "^1.2.0", + "rlnjs": "^3.2.3", "rollup": "^2.75.0", "rollup-plugin-copy": "^3.4.0", "size-limit": "^8.0.0", @@ -4001,7 +4079,33 @@ "ts-loader": "^9.3.1", "ts-node": "^10.9.1", "typedoc": "^0.23.10", - "typescript": "^4.5.5" + "typescript": "^4.5.5", + "uuid": "^9.0.1" + } + }, + "@waku/utils": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@waku/utils/-/utils-0.0.11.tgz", + "integrity": "sha512-AG/S9vxqqxQUO9dlfi5Apv5o364dIzg3cLm32qstqQDSWw3QGhOSRLg+MBxdFrfmELCI3O1zdMoGdLRaZIwr8Q==", + "requires": { + "@waku/interfaces": "0.0.18", + "debug": "^4.3.4", + "uint8arrays": "^4.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "@webassemblyjs/ast": { @@ -5399,6 +5503,11 @@ "thunky": "^1.0.2" } }, + "multiformats": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.2.tgz", + "integrity": "sha512-6mRIsrZXyw5xNPO31IGBMmxgDXBSgCGDsBAtazkZ02ip4hMwZNrQvfxXZtytRoBSWuzSq5f9VmMnXj76fIz5FQ==" + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -6187,6 +6296,14 @@ "mime-types": "~2.1.24" } }, + "uint8arrays": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.6.tgz", + "integrity": "sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw==", + "requires": { + "multiformats": "^12.0.1" + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/example/package.json b/example/package.json index 8029e71..5117129 100644 --- a/example/package.json +++ b/example/package.json @@ -9,12 +9,13 @@ "start": "webpack-dev-server" }, "dependencies": { - "@waku/rln": "file:../" + "@waku/rln": "file:../", + "@waku/utils": "^0.0.11" }, "devDependencies": { + "copy-webpack-plugin": "^11.0.0", "webpack": "^5.74.0", "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.11.1", - "copy-webpack-plugin": "^11.0.0" + "webpack-dev-server": "^4.11.1" } } diff --git a/package-lock.json b/package-lock.json index a74a8d6..a8369ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,14 @@ "version": "0.1.1", "license": "MIT OR Apache-2.0", "dependencies": { - "@waku/utils": "^0.0.6", + "@chainsafe/bls-keystore": "^3.0.0", + "@waku/utils": "^0.0.11", "@waku/zerokit-rln-wasm": "^0.0.10", - "ethers": "^5.7.2" + "ethereum-cryptography": "^2.1.2", + "ethers": "^5.7.2", + "lodash": "^4.17.21", + "rlnjs": "^3.2.3", + "uuid": "^9.0.1" }, "devDependencies": { "@rollup/plugin-commonjs": "^22.0.2", @@ -21,8 +26,12 @@ "@size-limit/preset-big-lib": "^8.0.0", "@types/app-root-path": "^1.2.4", "@types/chai": "^4.2.15", + "@types/chai-as-promised": "^7.1.6", "@types/chai-spies": "^1.0.3", + "@types/chai-subset": "^1.3.3", "@types/debug": "^4.1.7", + "@types/deep-equal-in-any-order": "^1.0.1", + "@types/lodash": "^4.14.199", "@types/mocha": "^9.1.0", "@types/node": "^17.0.6", "@types/tail": "^2.0.0", @@ -33,10 +42,15 @@ "@waku/interfaces": "^0.0.13", "@waku/message-encryption": "^0.0.16", "@web/rollup-plugin-import-meta-assets": "^1.0.7", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", "app-root-path": "^3.0.0", "chai": "^4.3.4", + "chai-as-promised": "^7.1.1", "chai-spies": "^1.0.0", + "chai-subset": "^1.6.0", "cspell": "^5.14.0", + "deep-equal-in-any-order": "^2.0.6", "eslint": "^8.6.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-eslint-comments": "^3.2.0", @@ -72,7 +86,7 @@ "typescript": "^4.5.5" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@achingbrain/ip-address": { @@ -151,6 +165,11 @@ "npm": ">=7.0.0" } }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", + "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" + }, "node_modules/@babel/code-frame": { "version": "7.18.6", "dev": true, @@ -247,6 +266,76 @@ "node": ">=4" } }, + "node_modules/@chainsafe/bls-keystore": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@chainsafe/bls-keystore/-/bls-keystore-3.0.0.tgz", + "integrity": "sha512-vlRIIXnn555wq2emhqnSR7btno17M0sCcfdQ+Dhgr7IH6n0CMoTGw9qcrpnNYwM+9OPm3matSYeZc9mNlXf7fQ==", + "dependencies": { + "ethereum-cryptography": "^1.0.0", + "uuid": "8.3.2" + } + }, + "node_modules/@chainsafe/bls-keystore/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@chainsafe/bls-keystore/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@chainsafe/bls-keystore/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@chainsafe/bls-keystore/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/@chainsafe/bls-keystore/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@chainsafe/is-ip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.0.1.tgz", @@ -572,6 +661,28 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", @@ -1302,6 +1413,20 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@iden3/bigarray": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz", + "integrity": "sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==" + }, + "node_modules/@iden3/binfileutils": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.11.tgz", + "integrity": "sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA==", + "dependencies": { + "fastfile": "0.0.20", + "ffjavascript": "^0.2.48" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -2076,6 +2201,28 @@ "npm": ">=7.0.0" } }, + "node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@noble/ed25519": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz", @@ -2093,7 +2240,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz", "integrity": "sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==", - "dev": true, "funding": [ { "type": "individual", @@ -2105,7 +2251,6 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "dev": true, "funding": [ { "type": "individual", @@ -2294,6 +2439,78 @@ "dev": true, "license": "MIT" }, + "node_modules/@scure/base": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", + "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", + "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", + "dependencies": { + "@noble/curves": "~1.1.0", + "@noble/hashes": "~1.3.1", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "dependencies": { + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@semaphore-protocol/group": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@semaphore-protocol/group/-/group-3.11.1.tgz", + "integrity": "sha512-7k02BqVY0tFYNwT9dddi2KsvyJZSJp8PWIn35hrZKyo8d1sskWQpiERx8uw1ALcinagChkSBRhunG8XqYxtoMA==", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@zk-kit/incremental-merkle-tree": "1.1.0" + } + }, + "node_modules/@semaphore-protocol/group/node_modules/@zk-kit/incremental-merkle-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@zk-kit/incremental-merkle-tree/-/incremental-merkle-tree-1.1.0.tgz", + "integrity": "sha512-WnNR/GQse3lX8zOHMU8zwhgX8u3qPoul8w4GjJ0WDHq+VGJimo7EGheRZ/ILeBQabnlzAerdv3vBqYBehBeoKA==" + }, + "node_modules/@semaphore-protocol/identity": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@semaphore-protocol/identity/-/identity-3.11.1.tgz", + "integrity": "sha512-PC369lATC/VhPVNjq27XS6Ll123rVU4YhAu83WYdVtyLkceY1CyBtBsMLPXs83pIYaU3kCeXJV/JQa3gDKn3ww==", + "dependencies": { + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/random": "^5.5.1", + "@ethersproject/strings": "^5.6.1", + "js-sha512": "^0.8.0" + } + }, "node_modules/@sitespeed.io/tracium": { "version": "0.3.3", "dev": true, @@ -2408,6 +2625,15 @@ "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", "dev": true }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz", + "integrity": "sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, "node_modules/@types/chai-spies": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/chai-spies/-/chai-spies-1.0.3.tgz", @@ -2417,6 +2643,15 @@ "@types/chai": "*" } }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -2440,6 +2675,12 @@ "@types/ms": "*" } }, + "node_modules/@types/deep-equal-in-any-order": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/deep-equal-in-any-order/-/deep-equal-in-any-order-1.0.1.tgz", + "integrity": "sha512-hUWUUE53WjKfcCncSmWmNXVNNT+0Iz7gYFnov3zdCXrX3Thxp1Cnmfd5LwWOeCVUV5LhpiFgS05vaAG72doo9w==", + "dev": true + }, "node_modules/@types/eslint": { "version": "8.4.6", "dev": true, @@ -2492,6 +2733,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/lodash": { + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==", + "dev": true + }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", @@ -2761,6 +3008,19 @@ } } }, + "node_modules/@waku/core/node_modules/@waku/utils": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@waku/utils/-/utils-0.0.6.tgz", + "integrity": "sha512-hyHeP3PLMoxWzg/ghQpagNZAm5G0nncuJSE1n/ml+4oeY5+oimF4Qh6PGXxakjJYKY5+JWN7Y3OHj+CO2cbKnA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "uint8arrays": "^4.0.3" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@waku/core/node_modules/it-all": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.2.tgz", @@ -2825,6 +3085,19 @@ "node": ">=16" } }, + "node_modules/@waku/message-encryption/node_modules/@waku/utils": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@waku/utils/-/utils-0.0.6.tgz", + "integrity": "sha512-hyHeP3PLMoxWzg/ghQpagNZAm5G0nncuJSE1n/ml+4oeY5+oimF4Qh6PGXxakjJYKY5+JWN7Y3OHj+CO2cbKnA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "uint8arrays": "^4.0.3" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@waku/proto": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/@waku/proto/-/proto-0.0.4.tgz", @@ -2838,17 +3111,26 @@ } }, "node_modules/@waku/utils": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@waku/utils/-/utils-0.0.6.tgz", - "integrity": "sha512-hyHeP3PLMoxWzg/ghQpagNZAm5G0nncuJSE1n/ml+4oeY5+oimF4Qh6PGXxakjJYKY5+JWN7Y3OHj+CO2cbKnA==", + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@waku/utils/-/utils-0.0.11.tgz", + "integrity": "sha512-AG/S9vxqqxQUO9dlfi5Apv5o364dIzg3cLm32qstqQDSWw3QGhOSRLg+MBxdFrfmELCI3O1zdMoGdLRaZIwr8Q==", "dependencies": { + "@waku/interfaces": "0.0.18", "debug": "^4.3.4", - "uint8arrays": "^4.0.3" + "uint8arrays": "^4.0.4" }, "engines": { "node": ">=16" } }, + "node_modules/@waku/utils/node_modules/@waku/interfaces": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@waku/interfaces/-/interfaces-0.0.18.tgz", + "integrity": "sha512-esgXs8fZTth+7DSndnB92/YPOnpn0rD0E4GPu/yfQZbwSS+pPyfpk58iklgWterD/CelB487X4qy0ooe2uWrBg==", + "engines": { + "node": ">=16" + } + }, "node_modules/@waku/zerokit-rln-wasm": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/@waku/zerokit-rln-wasm/-/zerokit-rln-wasm-0.0.10.tgz", @@ -3039,6 +3321,11 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "node_modules/@zk-kit/incremental-merkle-tree": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@zk-kit/incremental-merkle-tree/-/incremental-merkle-tree-0.4.3.tgz", + "integrity": "sha512-2qHfrJXtPx8/UmF0wFAUr4VqCLr3J/P859fk/e3fwKLUnf3baeIUAO6inY4wrh0NGy4bzpKUWYjDph0yTbPz6A==" + }, "node_modules/abab": { "version": "2.0.6", "dev": true, @@ -3152,13 +3439,14 @@ } }, "node_modules/ajv": { - "version": "6.12.6", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { @@ -3166,13 +3454,21 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, "node_modules/ansi-colors": { @@ -3219,7 +3515,6 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3351,12 +3646,25 @@ }, "node_modules/asynckit": { "version": "0.4.0", - "dev": true, "license": "MIT" }, + "node_modules/axios": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, "node_modules/balanced-match": { "version": "1.0.2", - "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -3392,6 +3700,29 @@ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "dev": true, @@ -3410,6 +3741,25 @@ "readable-stream": "^3.4.0" } }, + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -3456,7 +3806,6 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3673,6 +4022,18 @@ "node": ">=4" } }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, "node_modules/chai-spies": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/chai-spies/-/chai-spies-1.0.0.tgz", @@ -3685,9 +4046,17 @@ "chai": "*" } }, + "node_modules/chai-subset": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/chai-subset/-/chai-subset-1.6.0.tgz", + "integrity": "sha512-K3d+KmqdS5XKW5DWPd5sgNffL3uxdDe+6GdnJh3AYPhwnBGRY5urfvfcbRtWIvvpz+KxkL9FeBB6MZewLUNwug==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/chalk": { "version": "4.1.2", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -3709,6 +4078,11 @@ "node": "*" } }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" + }, "node_modules/chokidar": { "version": "3.5.3", "dev": true, @@ -3764,6 +4138,40 @@ "dev": true, "license": "MIT" }, + "node_modules/circom_runtime": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.24.tgz", + "integrity": "sha512-H7/7I2J/cBmRnZm9docOCGhfxzS61BEm4TMCWcrZGsWNBQhePNfQq88Oj2XpUfzmBTCd8pRvRb3Mvazt3TMrJw==", + "dependencies": { + "ffjavascript": "0.2.60" + }, + "bin": { + "calcwit": "calcwit.js" + } + }, + "node_modules/circom_runtime/node_modules/ffjavascript": { + "version": "0.2.60", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", + "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", + "dependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + }, + "node_modules/circom_runtime/node_modules/wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" + }, + "node_modules/circom_runtime/node_modules/wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "dependencies": { + "wasmbuilder": "0.0.16" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "dev": true, @@ -3855,7 +4263,6 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3866,7 +4273,6 @@ }, "node_modules/color-name": { "version": "1.1.4", - "dev": true, "license": "MIT" }, "node_modules/colorette": { @@ -3876,7 +4282,6 @@ }, "node_modules/combined-stream": { "version": "1.0.8", - "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -3915,7 +4320,6 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "dev": true, "license": "MIT" }, "node_modules/configstore": { @@ -4369,9 +4773,18 @@ "node": ">=0.12" } }, + "node_modules/deep-equal-in-any-order": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/deep-equal-in-any-order/-/deep-equal-in-any-order-2.0.6.tgz", + "integrity": "sha512-RfnWHQzph10YrUjvWwhd15Dne8ciSJcZ3U6OD7owPwiVwsdE5IFSoZGg8rlwJD11ES+9H5y8j3fCofviRHOqLQ==", + "dev": true, + "dependencies": { + "lodash.mapvalues": "^4.6.0", + "sort-any": "^2.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", - "dev": true, "license": "MIT" }, "node_modules/deepmerge": { @@ -4516,7 +4929,6 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -4645,6 +5057,20 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.242", "dev": true, @@ -5199,6 +5625,22 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.1.1", "dev": true, @@ -5219,6 +5661,12 @@ "node": ">=4.0" } }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/espree": { "version": "9.4.0", "dev": true, @@ -5237,7 +5685,6 @@ }, "node_modules/esprima": { "version": "4.0.1", - "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -5305,7 +5752,6 @@ }, "node_modules/estraverse": { "version": "4.3.0", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -5318,12 +5764,33 @@ }, "node_modules/esutils": { "version": "2.0.3", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/ethereum-cryptography": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", + "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "dependencies": { + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1", + "@scure/bip32": "1.3.1", + "@scure/bip39": "1.2.1" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ethers": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", @@ -5524,9 +5991,13 @@ }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "dev": true, "license": "MIT" }, + "node_modules/fastfile": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz", + "integrity": "sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==" + }, "node_modules/fastq": { "version": "1.13.0", "dev": true, @@ -5543,6 +6014,17 @@ "pend": "~1.2.0" } }, + "node_modules/ffjavascript": { + "version": "0.2.55", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.55.tgz", + "integrity": "sha512-8X0FCIPOWiK6DTWh3pnE3O6D6nIQsirStAXpWMzRDnoDX7SEnDX4I28aVhwjL7L35XS1vy2AU7zc0UCGYxdLjw==", + "dependencies": { + "big-integer": "^1.6.48", + "wasmbuilder": "^0.0.12", + "wasmcurves": "0.1.0", + "web-worker": "^1.2.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "dev": true, @@ -5554,6 +6036,33 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/filename-reserved-regex": { "version": "2.0.0", "dev": true, @@ -5703,7 +6212,6 @@ "version": "1.15.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "dev": true, "funding": [ { "type": "individual", @@ -5721,7 +6229,6 @@ }, "node_modules/form-data": { "version": "4.0.0", - "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -6083,7 +6590,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6168,6 +6674,14 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "dev": true, @@ -6995,6 +7509,28 @@ "npm": ">=7.0.0" } }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -7029,6 +7565,11 @@ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, + "node_modules/js-sha512": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", + "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==" + }, "node_modules/js-tokens": { "version": "4.0.0", "dev": true, @@ -7116,9 +7657,10 @@ "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -7153,6 +7695,28 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/karma": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.0.tgz", @@ -7665,8 +8229,14 @@ }, "node_modules/lodash": { "version": "4.17.21", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -7777,6 +8347,11 @@ "node": ">=8.0" } }, + "node_modules/logplease": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/logplease/-/logplease-1.2.15.tgz", + "integrity": "sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==" + }, "node_modules/longbits": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/longbits/-/longbits-1.1.0.tgz", @@ -7941,7 +8516,6 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -7949,7 +8523,6 @@ }, "node_modules/mime-types": { "version": "2.1.35", - "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -7981,7 +8554,6 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -8195,11 +8767,18 @@ "version": "11.0.2", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz", "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==", + "dev": true, + "peer": true, "engines": { "node": ">=16.0.0", "npm": ">=7.0.0" } }, + "node_modules/nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" + }, "node_modules/nanoid": { "version": "3.3.4", "dev": true, @@ -9063,6 +9642,11 @@ "node": ">=8" } }, + "node_modules/poseidon-lite": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/poseidon-lite/-/poseidon-lite-0.0.2.tgz", + "integrity": "sha512-bGdDPTOQkJbBjbtSEWc3gY+YhqlGTxGlZ8041F8TGGg5QyGGp1Cfs4b8AEnFFjHbkPg6WdWXUgEjU1GKOKWAPw==" + }, "node_modules/prelude-ls": { "version": "1.2.1", "dev": true, @@ -9177,7 +9761,6 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "dev": true, "license": "MIT" }, "node_modules/psl": { @@ -9346,6 +9929,40 @@ ], "license": "MIT" }, + "node_modules/r1csfile": { + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.47.tgz", + "integrity": "sha512-oI4mAwuh1WwuFg95eJDNDDL8hCaZkwnPuNZrQdLBWvDoRU7EG+L/MOHL7SwPW2Y+ZuYcTLpj3rBkgllBQZN/JA==", + "dependencies": { + "@iden3/bigarray": "0.0.2", + "@iden3/binfileutils": "0.0.11", + "fastfile": "0.0.20", + "ffjavascript": "0.2.60" + } + }, + "node_modules/r1csfile/node_modules/ffjavascript": { + "version": "0.2.60", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", + "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", + "dependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + }, + "node_modules/r1csfile/node_modules/wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" + }, + "node_modules/r1csfile/node_modules/wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "dependencies": { + "wasmbuilder": "0.0.16" + } + }, "node_modules/randombytes": { "version": "2.1.0", "dev": true, @@ -9523,6 +10140,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "dev": true, @@ -9663,6 +10289,93 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rlnjs": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/rlnjs/-/rlnjs-3.2.3.tgz", + "integrity": "sha512-rmSZGTd/WY/nrfRLWO7QwFAgc9E/qFZAQXV2FCu7oLv8ra+LiAvvCrKkmIiDCyy0gooftd2IwV3frIuoKNlwjg==", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/solidity": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@semaphore-protocol/group": "^3.10.1", + "@semaphore-protocol/identity": "^3.10.1", + "@zk-kit/incremental-merkle-tree": "^0.4.3", + "axios": "^1.5.0", + "ethers": "^6.4.0", + "ffjavascript": "0.2.55", + "poseidon-lite": "^0.0.2", + "snarkjs": "^0.7.0" + } + }, + "node_modules/rlnjs/node_modules/@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/rlnjs/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/rlnjs/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "node_modules/rlnjs/node_modules/ethers": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", + "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.9.2", + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.7.1", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/rlnjs/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/rollup": { "version": "2.79.0", "dev": true, @@ -9850,6 +10563,37 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", @@ -10016,6 +10760,49 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/snarkjs": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.1.tgz", + "integrity": "sha512-Qs1oxssa135WZkzfARgEp5SuKHKvKNtcspeJbE5je6MurUpBylD1rzcAzQSTGWA/EH/BV/TmUyTaTD64xScvbA==", + "dependencies": { + "@iden3/binfileutils": "0.0.11", + "bfj": "^7.0.2", + "blake2b-wasm": "^2.4.0", + "circom_runtime": "0.1.24", + "ejs": "^3.1.6", + "fastfile": "0.0.20", + "ffjavascript": "0.2.60", + "js-sha3": "^0.8.0", + "logplease": "^1.2.15", + "r1csfile": "0.0.47" + }, + "bin": { + "snarkjs": "build/cli.cjs" + } + }, + "node_modules/snarkjs/node_modules/ffjavascript": { + "version": "0.2.60", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", + "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", + "dependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + }, + "node_modules/snarkjs/node_modules/wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" + }, + "node_modules/snarkjs/node_modules/wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "dependencies": { + "wasmbuilder": "0.0.16" + } + }, "node_modules/socket.io": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", @@ -10055,9 +10842,18 @@ "node": ">=10.0.0" } }, + "node_modules/sort-any": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-any/-/sort-any-2.0.0.tgz", + "integrity": "sha512-T9JoiDewQEmWcnmPn/s9h/PH9t3d/LSWi0RgVmXSuDYeZXTZOZ1/wrK2PHaptuR1VXe3clLLt0pD6sgVOwjNEA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, "node_modules/source-map": { "version": "0.6.1", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -10113,6 +10909,82 @@ "dev": true, "peer": true }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -10339,7 +11211,6 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -10597,6 +11468,11 @@ "utf8-byte-length": "^1.0.1" } }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, "node_modules/ts-loader": { "version": "9.3.1", "dev": true, @@ -10686,7 +11562,6 @@ }, "node_modules/tslib": { "version": "2.4.0", - "dev": true, "license": "0BSD" }, "node_modules/tsutils": { @@ -10860,12 +11735,17 @@ } }, "node_modules/uint8arrays": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.3.tgz", - "integrity": "sha512-b+aKlI2oTnxnfeSQWV1sMacqSNxqhtXySaH6bflvONGxF8V/fT3ZlYH7z2qgGfydsvpVo4JUgM/Ylyfl2YouCg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.6.tgz", + "integrity": "sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw==", "dependencies": { - "multiformats": "^11.0.0" - }, + "multiformats": "^12.0.1" + } + }, + "node_modules/uint8arrays/node_modules/multiformats": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.2.tgz", + "integrity": "sha512-6mRIsrZXyw5xNPO31IGBMmxgDXBSgCGDsBAtazkZ02ip4hMwZNrQvfxXZtytRoBSWuzSq5f9VmMnXj76fIz5FQ==", "engines": { "node": ">=16.0.0", "npm": ">=7.0.0" @@ -10894,6 +11774,11 @@ "through": "^2.3.8" } }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, "node_modules/undici": { "version": "5.21.2", "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.2.tgz", @@ -10999,10 +11884,13 @@ } }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true, + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -11085,6 +11973,23 @@ "node": ">=12" } }, + "node_modules/wasmbuilder": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.12.tgz", + "integrity": "sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w==", + "dependencies": { + "big-integer": "^1.6.48" + } + }, + "node_modules/wasmcurves": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.1.0.tgz", + "integrity": "sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q==", + "dependencies": { + "big-integer": "^1.6.42", + "blakejs": "^1.1.0" + } + }, "node_modules/watchpack": { "version": "2.4.0", "dev": true, @@ -11097,6 +12002,11 @@ "node": ">=10.13.0" } }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "dev": true, @@ -11267,7 +12177,6 @@ }, "node_modules/word-wrap": { "version": "1.2.3", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11590,6 +12499,11 @@ "xml2js": "^0.5.0" } }, + "@adraffy/ens-normalize": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", + "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" + }, "@babel/code-frame": { "version": "7.18.6", "dev": true, @@ -11654,6 +12568,57 @@ } } }, + "@chainsafe/bls-keystore": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@chainsafe/bls-keystore/-/bls-keystore-3.0.0.tgz", + "integrity": "sha512-vlRIIXnn555wq2emhqnSR7btno17M0sCcfdQ+Dhgr7IH6n0CMoTGw9qcrpnNYwM+9OPm3matSYeZc9mNlXf7fQ==", + "requires": { + "ethereum-cryptography": "^1.0.0", + "uuid": "8.3.2" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==" + }, + "@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "requires": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "requires": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "requires": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, "@chainsafe/is-ip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.0.1.tgz", @@ -11911,6 +12876,26 @@ "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } }, "@ethersproject/abi": { @@ -12313,6 +13298,20 @@ "version": "1.2.1", "dev": true }, + "@iden3/bigarray": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz", + "integrity": "sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==" + }, + "@iden3/binfileutils": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.11.tgz", + "integrity": "sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA==", + "requires": { + "fastfile": "0.0.20", + "ffjavascript": "^0.2.48" + } + }, "@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -12905,6 +13904,21 @@ "varint": "^6.0.0" } }, + "@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "requires": { + "@noble/hashes": "1.3.1" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==" + } + } + }, "@noble/ed25519": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz", @@ -12915,14 +13929,12 @@ "@noble/hashes": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz", - "integrity": "sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==", - "dev": true + "integrity": "sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==" }, "@noble/secp256k1": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "dev": true + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -13066,6 +14078,67 @@ } } }, + "@scure/base": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", + "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==" + }, + "@scure/bip32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", + "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", + "requires": { + "@noble/curves": "~1.1.0", + "@noble/hashes": "~1.3.1", + "@scure/base": "~1.1.0" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" + } + } + }, + "@scure/bip39": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "requires": { + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" + } + }, + "@semaphore-protocol/group": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@semaphore-protocol/group/-/group-3.11.1.tgz", + "integrity": "sha512-7k02BqVY0tFYNwT9dddi2KsvyJZSJp8PWIn35hrZKyo8d1sskWQpiERx8uw1ALcinagChkSBRhunG8XqYxtoMA==", + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@zk-kit/incremental-merkle-tree": "1.1.0" + }, + "dependencies": { + "@zk-kit/incremental-merkle-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@zk-kit/incremental-merkle-tree/-/incremental-merkle-tree-1.1.0.tgz", + "integrity": "sha512-WnNR/GQse3lX8zOHMU8zwhgX8u3qPoul8w4GjJ0WDHq+VGJimo7EGheRZ/ILeBQabnlzAerdv3vBqYBehBeoKA==" + } + } + }, + "@semaphore-protocol/identity": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@semaphore-protocol/identity/-/identity-3.11.1.tgz", + "integrity": "sha512-PC369lATC/VhPVNjq27XS6Ll123rVU4YhAu83WYdVtyLkceY1CyBtBsMLPXs83pIYaU3kCeXJV/JQa3gDKn3ww==", + "requires": { + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/random": "^5.5.1", + "@ethersproject/strings": "^5.6.1", + "js-sha512": "^0.8.0" + } + }, "@sitespeed.io/tracium": { "version": "0.3.3", "dev": true, @@ -13142,6 +14215,15 @@ "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", "dev": true }, + "@types/chai-as-promised": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz", + "integrity": "sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, "@types/chai-spies": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/chai-spies/-/chai-spies-1.0.3.tgz", @@ -13151,6 +14233,15 @@ "@types/chai": "*" } }, + "@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -13173,6 +14264,12 @@ "@types/ms": "*" } }, + "@types/deep-equal-in-any-order": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/deep-equal-in-any-order/-/deep-equal-in-any-order-1.0.1.tgz", + "integrity": "sha512-hUWUUE53WjKfcCncSmWmNXVNNT+0Iz7gYFnov3zdCXrX3Thxp1Cnmfd5LwWOeCVUV5LhpiFgS05vaAG72doo9w==", + "dev": true + }, "@types/eslint": { "version": "8.4.6", "dev": true, @@ -13220,6 +14317,12 @@ "version": "0.0.29", "dev": true }, + "@types/lodash": { + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==", + "dev": true + }, "@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", @@ -13373,6 +14476,16 @@ "uuid": "^9.0.0" }, "dependencies": { + "@waku/utils": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@waku/utils/-/utils-0.0.6.tgz", + "integrity": "sha512-hyHeP3PLMoxWzg/ghQpagNZAm5G0nncuJSE1n/ml+4oeY5+oimF4Qh6PGXxakjJYKY5+JWN7Y3OHj+CO2cbKnA==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "uint8arrays": "^4.0.3" + } + }, "it-all": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.2.tgz", @@ -13419,6 +14532,18 @@ "@waku/utils": "0.0.6", "debug": "^4.3.4", "js-sha3": "^0.8.0" + }, + "dependencies": { + "@waku/utils": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@waku/utils/-/utils-0.0.6.tgz", + "integrity": "sha512-hyHeP3PLMoxWzg/ghQpagNZAm5G0nncuJSE1n/ml+4oeY5+oimF4Qh6PGXxakjJYKY5+JWN7Y3OHj+CO2cbKnA==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "uint8arrays": "^4.0.3" + } + } } }, "@waku/proto": { @@ -13431,12 +14556,20 @@ } }, "@waku/utils": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@waku/utils/-/utils-0.0.6.tgz", - "integrity": "sha512-hyHeP3PLMoxWzg/ghQpagNZAm5G0nncuJSE1n/ml+4oeY5+oimF4Qh6PGXxakjJYKY5+JWN7Y3OHj+CO2cbKnA==", + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@waku/utils/-/utils-0.0.11.tgz", + "integrity": "sha512-AG/S9vxqqxQUO9dlfi5Apv5o364dIzg3cLm32qstqQDSWw3QGhOSRLg+MBxdFrfmELCI3O1zdMoGdLRaZIwr8Q==", "requires": { + "@waku/interfaces": "0.0.18", "debug": "^4.3.4", - "uint8arrays": "^4.0.3" + "uint8arrays": "^4.0.4" + }, + "dependencies": { + "@waku/interfaces": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@waku/interfaces/-/interfaces-0.0.18.tgz", + "integrity": "sha512-esgXs8fZTth+7DSndnB92/YPOnpn0rD0E4GPu/yfQZbwSS+pPyfpk58iklgWterD/CelB487X4qy0ooe2uWrBg==" + } } }, "@waku/zerokit-rln-wasm": { @@ -13625,6 +14758,11 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "@zk-kit/incremental-merkle-tree": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@zk-kit/incremental-merkle-tree/-/incremental-merkle-tree-0.4.3.tgz", + "integrity": "sha512-2qHfrJXtPx8/UmF0wFAUr4VqCLr3J/P859fk/e3fwKLUnf3baeIUAO6inY4wrh0NGy4bzpKUWYjDph0yTbPz6A==" + }, "abab": { "version": "2.0.6", "dev": true @@ -13703,21 +14841,25 @@ } }, "ajv": { - "version": "6.12.6", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "requires": {} + "requires": { + "ajv": "^8.0.0" + } }, "ansi-colors": { "version": "4.1.1", @@ -13744,7 +14886,6 @@ }, "ansi-styles": { "version": "4.3.0", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -13827,12 +14968,25 @@ } }, "asynckit": { - "version": "0.4.0", - "dev": true + "version": "0.4.0" + }, + "axios": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" }, "balanced-match": { - "version": "1.0.2", - "dev": true + "version": "1.0.2" }, "base64-js": { "version": "1.5.1", @@ -13849,6 +15003,23 @@ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, + "bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "requires": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + } + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, "binary-extensions": { "version": "2.2.0", "dev": true @@ -13862,6 +15033,25 @@ "readable-stream": "^3.4.0" } }, + "blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "requires": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -13906,7 +15096,6 @@ }, "brace-expansion": { "version": "1.1.11", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14032,6 +15221,15 @@ "type-detect": "^4.0.5" } }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, "chai-spies": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/chai-spies/-/chai-spies-1.0.0.tgz", @@ -14039,9 +15237,14 @@ "dev": true, "requires": {} }, + "chai-subset": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/chai-subset/-/chai-subset-1.6.0.tgz", + "integrity": "sha512-K3d+KmqdS5XKW5DWPd5sgNffL3uxdDe+6GdnJh3AYPhwnBGRY5urfvfcbRtWIvvpz+KxkL9FeBB6MZewLUNwug==", + "dev": true + }, "chalk": { "version": "4.1.2", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14053,6 +15256,11 @@ "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", "dev": true }, + "check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" + }, "chokidar": { "version": "3.5.3", "dev": true, @@ -14088,6 +15296,39 @@ "version": "1.2.2", "dev": true }, + "circom_runtime": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.24.tgz", + "integrity": "sha512-H7/7I2J/cBmRnZm9docOCGhfxzS61BEm4TMCWcrZGsWNBQhePNfQq88Oj2XpUfzmBTCd8pRvRb3Mvazt3TMrJw==", + "requires": { + "ffjavascript": "0.2.60" + }, + "dependencies": { + "ffjavascript": { + "version": "0.2.60", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", + "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", + "requires": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + }, + "wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" + }, + "wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "requires": { + "wasmbuilder": "0.0.16" + } + } + } + }, "clean-stack": { "version": "2.2.0", "dev": true @@ -14153,14 +15394,12 @@ }, "color-convert": { "version": "2.0.1", - "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "dev": true + "version": "1.1.4" }, "colorette": { "version": "2.0.19", @@ -14168,7 +15407,6 @@ }, "combined-stream": { "version": "1.0.8", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -14193,8 +15431,7 @@ "dev": true }, "concat-map": { - "version": "0.0.1", - "dev": true + "version": "0.0.1" }, "configstore": { "version": "5.0.1", @@ -14521,9 +15758,18 @@ "type-detect": "^4.0.0" } }, + "deep-equal-in-any-order": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/deep-equal-in-any-order/-/deep-equal-in-any-order-2.0.6.tgz", + "integrity": "sha512-RfnWHQzph10YrUjvWwhd15Dne8ciSJcZ3U6OD7owPwiVwsdE5IFSoZGg8rlwJD11ES+9H5y8j3fCofviRHOqLQ==", + "dev": true, + "requires": { + "lodash.mapvalues": "^4.6.0", + "sort-any": "^2.0.0" + } + }, "deep-is": { - "version": "0.1.4", - "dev": true + "version": "0.1.4" }, "deepmerge": { "version": "4.2.2", @@ -14620,8 +15866,7 @@ } }, "delayed-stream": { - "version": "1.0.0", - "dev": true + "version": "1.0.0" }, "depd": { "version": "2.0.0", @@ -14714,6 +15959,14 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, + "ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "requires": { + "jake": "^10.8.5" + } + }, "electron-to-chromium": { "version": "1.4.242", "dev": true @@ -14971,6 +16224,18 @@ "text-table": "^0.2.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "eslint-scope": { "version": "7.1.1", "dev": true, @@ -14982,6 +16247,12 @@ "estraverse": { "version": "5.3.0", "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true } } }, @@ -15127,8 +16398,7 @@ } }, "esprima": { - "version": "4.0.1", - "dev": true + "version": "4.0.1" }, "esquery": { "version": "1.4.0", @@ -15168,16 +16438,32 @@ } }, "estraverse": { - "version": "4.3.0", - "dev": true + "version": "4.3.0" }, "estree-walker": { "version": "2.0.2", "dev": true }, "esutils": { - "version": "2.0.3", - "dev": true + "version": "2.0.3" + }, + "ethereum-cryptography": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", + "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "requires": { + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1", + "@scure/bip32": "1.3.1", + "@scure/bip39": "1.2.1" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==" + } + } }, "ethers": { "version": "5.7.2", @@ -15326,8 +16612,12 @@ "dev": true }, "fast-levenshtein": { - "version": "2.0.6", - "dev": true + "version": "2.0.6" + }, + "fastfile": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz", + "integrity": "sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==" }, "fastq": { "version": "1.13.0", @@ -15343,6 +16633,17 @@ "pend": "~1.2.0" } }, + "ffjavascript": { + "version": "0.2.55", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.55.tgz", + "integrity": "sha512-8X0FCIPOWiK6DTWh3pnE3O6D6nIQsirStAXpWMzRDnoDX7SEnDX4I28aVhwjL7L35XS1vy2AU7zc0UCGYxdLjw==", + "requires": { + "big-integer": "^1.6.48", + "wasmbuilder": "^0.0.12", + "wasmcurves": "0.1.0", + "web-worker": "^1.2.0" + } + }, "file-entry-cache": { "version": "6.0.1", "dev": true, @@ -15350,6 +16651,32 @@ "flat-cache": "^3.0.4" } }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "filename-reserved-regex": { "version": "2.0.0", "dev": true @@ -15453,12 +16780,10 @@ "follow-redirects": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "dev": true + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" }, "form-data": { "version": "4.0.0", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -15689,8 +17014,7 @@ "dev": true }, "has-flag": { - "version": "4.0.0", - "dev": true + "version": "4.0.0" }, "has-own-prop": { "version": "2.0.0", @@ -15746,6 +17070,11 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, "html-encoding-sniffer": { "version": "3.0.0", "dev": true, @@ -16261,6 +17590,24 @@ "dev": true, "peer": true }, + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "dependencies": { + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + } + } + }, "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -16288,6 +17635,11 @@ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, + "js-sha512": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", + "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==" + }, "js-tokens": { "version": "4.0.0", "dev": true @@ -16353,7 +17705,9 @@ "dev": true }, "json-schema-traverse": { - "version": "0.4.1", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "json-stable-stringify-without-jsonify": { @@ -16381,6 +17735,23 @@ "universalify": "^2.0.0" } }, + "jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "requires": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + }, + "dependencies": { + "esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==" + } + } + }, "karma": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.0.tgz", @@ -16770,6 +18141,13 @@ }, "lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", "dev": true }, "lodash.merge": { @@ -16846,6 +18224,11 @@ "streamroller": "^3.1.2" } }, + "logplease": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/logplease/-/logplease-1.2.15.tgz", + "integrity": "sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==" + }, "longbits": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/longbits/-/longbits-1.1.0.tgz", @@ -16954,12 +18337,10 @@ "dev": true }, "mime-db": { - "version": "1.52.0", - "dev": true + "version": "1.52.0" }, "mime-types": { "version": "2.1.35", - "dev": true, "requires": { "mime-db": "1.52.0" } @@ -16980,7 +18361,6 @@ }, "minimatch": { "version": "3.1.2", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -17134,7 +18514,14 @@ "multiformats": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz", - "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==" + "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==", + "dev": true, + "peer": true + }, + "nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" }, "nanoid": { "version": "3.3.4", @@ -17673,6 +19060,11 @@ } } }, + "poseidon-lite": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/poseidon-lite/-/poseidon-lite-0.0.2.tgz", + "integrity": "sha512-bGdDPTOQkJbBjbtSEWc3gY+YhqlGTxGlZ8041F8TGGg5QyGGp1Cfs4b8AEnFFjHbkPg6WdWXUgEjU1GKOKWAPw==" + }, "prelude-ls": { "version": "1.2.1", "dev": true @@ -17748,8 +19140,7 @@ } }, "proxy-from-env": { - "version": "1.1.0", - "dev": true + "version": "1.1.0" }, "psl": { "version": "1.9.0", @@ -17848,6 +19239,42 @@ "version": "1.2.3", "dev": true }, + "r1csfile": { + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.47.tgz", + "integrity": "sha512-oI4mAwuh1WwuFg95eJDNDDL8hCaZkwnPuNZrQdLBWvDoRU7EG+L/MOHL7SwPW2Y+ZuYcTLpj3rBkgllBQZN/JA==", + "requires": { + "@iden3/bigarray": "0.0.2", + "@iden3/binfileutils": "0.0.11", + "fastfile": "0.0.20", + "ffjavascript": "0.2.60" + }, + "dependencies": { + "ffjavascript": { + "version": "0.2.60", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", + "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", + "requires": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + }, + "wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" + }, + "wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "requires": { + "wasmbuilder": "0.0.16" + } + } + } + }, "randombytes": { "version": "2.1.0", "dev": true, @@ -17973,6 +19400,12 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "requires-port": { "version": "1.0.0", "dev": true @@ -18064,6 +19497,62 @@ "glob": "^7.1.3" } }, + "rlnjs": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/rlnjs/-/rlnjs-3.2.3.tgz", + "integrity": "sha512-rmSZGTd/WY/nrfRLWO7QwFAgc9E/qFZAQXV2FCu7oLv8ra+LiAvvCrKkmIiDCyy0gooftd2IwV3frIuoKNlwjg==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/solidity": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@semaphore-protocol/group": "^3.10.1", + "@semaphore-protocol/identity": "^3.10.1", + "@zk-kit/incremental-merkle-tree": "^0.4.3", + "axios": "^1.5.0", + "ethers": "^6.4.0", + "ffjavascript": "0.2.55", + "poseidon-lite": "^0.0.2", + "snarkjs": "^0.7.0" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==" + }, + "@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "ethers": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", + "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", + "requires": { + "@adraffy/ens-normalize": "1.9.2", + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.7.1", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + } + }, + "ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "requires": {} + } + } + }, "rollup": { "version": "2.79.0", "dev": true, @@ -18189,6 +19678,33 @@ "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } }, "scrypt-js": { @@ -18302,6 +19818,48 @@ } } }, + "snarkjs": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.1.tgz", + "integrity": "sha512-Qs1oxssa135WZkzfARgEp5SuKHKvKNtcspeJbE5je6MurUpBylD1rzcAzQSTGWA/EH/BV/TmUyTaTD64xScvbA==", + "requires": { + "@iden3/binfileutils": "0.0.11", + "bfj": "^7.0.2", + "blake2b-wasm": "^2.4.0", + "circom_runtime": "0.1.24", + "ejs": "^3.1.6", + "fastfile": "0.0.20", + "ffjavascript": "0.2.60", + "js-sha3": "^0.8.0", + "logplease": "^1.2.15", + "r1csfile": "0.0.47" + }, + "dependencies": { + "ffjavascript": { + "version": "0.2.60", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", + "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", + "requires": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + }, + "wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" + }, + "wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "requires": { + "wasmbuilder": "0.0.16" + } + } + } + }, "socket.io": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", @@ -18335,9 +19893,18 @@ "debug": "~4.3.1" } }, + "sort-any": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-any/-/sort-any-2.0.0.tgz", + "integrity": "sha512-T9JoiDewQEmWcnmPn/s9h/PH9t3d/LSWi0RgVmXSuDYeZXTZOZ1/wrK2PHaptuR1VXe3clLLt0pD6sgVOwjNEA==", + "dev": true, + "requires": { + "lodash": "^4.17.21" + } + }, "source-map": { "version": "0.6.1", - "dev": true + "devOptional": true }, "source-map-support": { "version": "0.5.21", @@ -18384,6 +19951,63 @@ "dev": true, "peer": true }, + "static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "requires": { + "escodegen": "^1.8.1" + }, + "dependencies": { + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -18530,7 +20154,6 @@ }, "supports-color": { "version": "7.2.0", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -18712,6 +20335,11 @@ "utf8-byte-length": "^1.0.1" } }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, "ts-loader": { "version": "9.3.1", "dev": true, @@ -18762,8 +20390,7 @@ } }, "tslib": { - "version": "2.4.0", - "dev": true + "version": "2.4.0" }, "tsutils": { "version": "3.21.0", @@ -18870,11 +20497,18 @@ } }, "uint8arrays": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.3.tgz", - "integrity": "sha512-b+aKlI2oTnxnfeSQWV1sMacqSNxqhtXySaH6bflvONGxF8V/fT3ZlYH7z2qgGfydsvpVo4JUgM/Ylyfl2YouCg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.6.tgz", + "integrity": "sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw==", "requires": { - "multiformats": "^11.0.0" + "multiformats": "^12.0.1" + }, + "dependencies": { + "multiformats": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.2.tgz", + "integrity": "sha512-6mRIsrZXyw5xNPO31IGBMmxgDXBSgCGDsBAtazkZ02ip4hMwZNrQvfxXZtytRoBSWuzSq5f9VmMnXj76fIz5FQ==" + } } }, "unbox-primitive": { @@ -18895,6 +20529,11 @@ "through": "^2.3.8" } }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, "undici": { "version": "5.21.2", "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.2.tgz", @@ -18963,10 +20602,9 @@ "dev": true }, "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" }, "v8-compile-cache-lib": { "version": "3.0.1", @@ -19029,6 +20667,23 @@ "xml-name-validator": "^4.0.0" } }, + "wasmbuilder": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.12.tgz", + "integrity": "sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w==", + "requires": { + "big-integer": "^1.6.48" + } + }, + "wasmcurves": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.1.0.tgz", + "integrity": "sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q==", + "requires": { + "big-integer": "^1.6.42", + "blakejs": "^1.1.0" + } + }, "watchpack": { "version": "2.4.0", "dev": true, @@ -19037,6 +20692,11 @@ "graceful-fs": "^4.1.2" } }, + "web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, "webidl-conversions": { "version": "7.0.0", "dev": true @@ -19155,8 +20815,7 @@ } }, "word-wrap": { - "version": "1.2.3", - "dev": true + "version": "1.2.3" }, "workerpool": { "version": "6.2.1", diff --git a/package.json b/package.json index efe4391..6ea8b95 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "scripts": { "prepare": "husky install", "build": "run-s build:**", + "build:codegen": "node ./scripts/schema_validator_codegen.js", "build:tsc": "tsc", "build:bundle": "rollup --config rollup.config.js", "size": "npm run build && size-limit", @@ -45,7 +46,7 @@ "crypto": false }, "engines": { - "node": ">=16" + "node": ">=18" }, "publishConfig": { "access": "public", @@ -59,19 +60,31 @@ "@size-limit/preset-big-lib": "^8.0.0", "@types/app-root-path": "^1.2.4", "@types/chai": "^4.2.15", + "@types/chai-as-promised": "^7.1.6", "@types/chai-spies": "^1.0.3", + "@types/chai-subset": "^1.3.3", "@types/debug": "^4.1.7", + "@types/deep-equal-in-any-order": "^1.0.1", + "@types/lodash": "^4.14.199", "@types/mocha": "^9.1.0", "@types/node": "^17.0.6", "@types/tail": "^2.0.0", "@types/uuid": "^8.3.0", "@typescript-eslint/eslint-plugin": "^5.8.1", "@typescript-eslint/parser": "^5.8.1", + "@waku/core": "^0.0.18", + "@waku/interfaces": "^0.0.13", + "@waku/message-encryption": "^0.0.16", "@web/rollup-plugin-import-meta-assets": "^1.0.7", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", "app-root-path": "^3.0.0", "chai": "^4.3.4", + "chai-as-promised": "^7.1.1", "chai-spies": "^1.0.0", + "chai-subset": "^1.6.0", "cspell": "^5.14.0", + "deep-equal-in-any-order": "^2.0.6", "eslint": "^8.6.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-eslint-comments": "^3.2.0", @@ -83,9 +96,6 @@ "husky": "^7.0.4", "ignore-loader": "^0.1.2", "isomorphic-fetch": "^3.0.0", - "@waku/interfaces": "^0.0.13", - "@waku/message-encryption": "^0.0.16", - "@waku/core": "^0.0.18", "jsdom": "^19.0.0", "jsdom-global": "^3.0.2", "karma": "^6.3.12", @@ -129,8 +139,13 @@ ] }, "dependencies": { - "@waku/utils": "^0.0.6", + "@chainsafe/bls-keystore": "^3.0.0", + "@waku/utils": "^0.0.11", "@waku/zerokit-rln-wasm": "^0.0.10", - "ethers": "^5.7.2" + "ethereum-cryptography": "^2.1.2", + "ethers": "^5.7.2", + "lodash": "^4.17.21", + "rlnjs": "^3.2.3", + "uuid": "^9.0.1" } } diff --git a/scripts/nwaku_keystore.json b/scripts/nwaku_keystore.json new file mode 100644 index 0000000..4da74c9 --- /dev/null +++ b/scripts/nwaku_keystore.json @@ -0,0 +1,23 @@ +{ + "$ref": "#/definitions/Keystore", + "definitions": { + "Keystore": { + "type": "object", + "properties": { + "credentials": { + "type": "object" + }, + "appIdentifier": { + "type": "string" + }, + "version": { + "type": "string" + }, + "application": { + "type": "string" + } + }, + "required": ["application", "appIdentifier", "credentials", "version"] + } + } +} diff --git a/scripts/nwaku_keystore_credential.json b/scripts/nwaku_keystore_credential.json new file mode 100644 index 0000000..7c5f729 --- /dev/null +++ b/scripts/nwaku_keystore_credential.json @@ -0,0 +1,42 @@ +{ + "$ref": "#/definitions/Credential", + "definitions": { + "Credential": { + "type": "object", + "properties": { + "crypto": { + "type": "object", + "properties": { + "cipher": { + "type": "string" + }, + "cipherparams": { + "type": "object" + }, + "ciphertext": { + "type": "string" + }, + "kdf": { + "type": "string" + }, + "kdfparams": { + "type": "object" + }, + "mac": { + "type": "string" + } + }, + "required": [ + "cipher", + "cipherparams", + "ciphertext", + "kdf", + "kdfparams", + "mac" + ] + } + }, + "required": ["crypto"] + } + } +} diff --git a/scripts/schema_validator_codegen.js b/scripts/schema_validator_codegen.js new file mode 100644 index 0000000..4833299 --- /dev/null +++ b/scripts/schema_validator_codegen.js @@ -0,0 +1,77 @@ +import { writeFileSync } from "fs"; +import { join } from "path"; +import { fileURLToPath } from "url"; +import { dirname } from "path"; + +import Ajv from "ajv"; +import addFormats from "ajv-formats"; +import standaloneCode from "ajv/dist/standalone/index.js"; + +import keystoreSchema from "./nwaku_keystore.json" assert { type: "json" }; +import credentialSchema from "./nwaku_keystore_credential.json" assert { type: "json" }; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +// Generate a function that validates the Keystore schema. +// Write the function to a file in the source. + +const OUTPUT_DIR = join(__dirname, "../src/keystore"); +const OUTPUT_KEYSTORE_FILE = join( + OUTPUT_DIR, + "keystore_validation_generated.ts" +); +const OUTPUT_CREDENTIALS_FILE = join( + OUTPUT_DIR, + "credential_validation_generated.ts" +); + +// Initialize ajv instance +let ajv = new Ajv({ + schemas: [keystoreSchema], + code: { + source: true, + esm: true, + }, +}); +addFormats(ajv); + +// The output code is minified vanilla javascript and uses the cute pattern of attaching errors to the exported function as a property. +// The easiest way to treat this is to just ts-ignore the whole output and wrap the function with a handcrafted type. +const keystoreModuleCode = + ` +/* eslint eslint-comments/no-unlimited-disable: "off" */ +// This file was generated by /scripts/schema-validation-codegen.ts +// Do not modify this file by hand. + +/* eslint-disable */ +// @ts-ignore +` + + standaloneCode(ajv, { + Keystore: "#/definitions/Keystore", + }); + +ajv = new Ajv({ + schemas: [credentialSchema], + code: { + source: true, + esm: true, + }, +}); +addFormats(ajv); + +const credentialModuleCode = + ` +/* eslint eslint-comments/no-unlimited-disable: "off" */ +// This file was generated by /scripts/schema-validation-codegen.ts +// Do not modify this file by hand. + +/* eslint-disable */ +// @ts-ignore +` + + standaloneCode(ajv, { + Credential: "#/definitions/Credential", + }); + +writeFileSync(OUTPUT_KEYSTORE_FILE, keystoreModuleCode); +writeFileSync(OUTPUT_CREDENTIALS_FILE, credentialModuleCode); diff --git a/src/byte_utils.ts b/src/byte_utils.ts index 99c9671..67cbb75 100644 --- a/src/byte_utils.ts +++ b/src/byte_utils.ts @@ -37,3 +37,13 @@ export function writeUIntLE( return buf; } + +/** + * Transforms Uint8Array into BigInt + * @param array: Uint8Array + * @returns BigInt + */ +export function buildBigIntFromUint8Array(array: Uint8Array): bigint { + const dataView = new DataView(array.buffer); + return dataView.getBigUint64(0, true); +} diff --git a/src/index.ts b/src/index.ts index 7e379e4..eef2b81 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,6 @@ import { RLNDecoder, RLNEncoder } from "./codec.js"; import { RLN_ABI, SEPOLIA_CONTRACT } from "./constants.js"; +import { Keystore } from "./keystore/index.js"; import { IdentityCredential, Proof, @@ -19,6 +20,7 @@ export async function create(): Promise { } export { + Keystore, RLNInstance, IdentityCredential, Proof, diff --git a/src/keystore/cipher.ts b/src/keystore/cipher.ts new file mode 100644 index 0000000..dbb8dd6 --- /dev/null +++ b/src/keystore/cipher.ts @@ -0,0 +1,54 @@ +import type { IKeystore as IEipKeystore } from "@chainsafe/bls-keystore"; +import { cipherDecrypt } from "@chainsafe/bls-keystore/lib/cipher.js"; +import { kdf } from "@chainsafe/bls-keystore/lib/kdf.js"; +import { normalizePassword } from "@chainsafe/bls-keystore/lib/password.js"; +import { keccak256 } from "ethereum-cryptography/keccak"; +import { + bytesToHex, + concatBytes, + hexToBytes, +} from "ethereum-cryptography/utils"; + +import type { Keccak256Hash, Password } from "./types.js"; + +// eipKeystore supports only sha256 checksum so we just make an assumption it is keccak256 +const validateChecksum = async ( + password: Password, + eipKeystore: IEipKeystore +): Promise => { + const computedChecksum = await keccak256Checksum(password, eipKeystore); + return computedChecksum === eipKeystore.crypto.checksum.message; +}; + +// decrypt from @chainsafe/bls-keystore supports only sha256 +// but nwaku uses keccak256 +// https://github.com/waku-org/nwaku/blob/25d6e52e3804d15f9b61bc4cc6dd448540c072a1/waku/waku_keystore/keyfile.nim#L367 +export const decryptEipKeystore = async ( + password: Password, + eipKeystore: IEipKeystore +): Promise => { + const decryptionKey = await kdf( + eipKeystore.crypto.kdf, + normalizePassword(password) + ); + const isChecksumValid = await validateChecksum(password, eipKeystore); + + if (!isChecksumValid) { + throw Error("Password is invalid."); + } + + return cipherDecrypt(eipKeystore.crypto.cipher, decryptionKey.slice(0, 16)); +}; + +export const keccak256Checksum = async ( + password: Password, + eipKeystore: IEipKeystore +): Promise => { + const key = await kdf(eipKeystore.crypto.kdf, normalizePassword(password)); + const payload = concatBytes( + key.slice(16), + hexToBytes(eipKeystore.crypto.cipher.message) + ); + const ciphertext = keccak256(payload); + return bytesToHex(ciphertext); +}; diff --git a/src/keystore/credential_validation_generated.ts b/src/keystore/credential_validation_generated.ts new file mode 100644 index 0000000..f14bb93 --- /dev/null +++ b/src/keystore/credential_validation_generated.ts @@ -0,0 +1,8 @@ + +/* eslint eslint-comments/no-unlimited-disable: "off" */ +// This file was generated by /scripts/schema-validation-codegen.ts +// Do not modify this file by hand. + +/* eslint-disable */ +// @ts-ignore +"use strict";export const Credential = validate11;const schema12 = {"type":"object","properties":{"crypto":{"type":"object","properties":{"cipher":{"type":"string"},"cipherparams":{"type":"object"},"ciphertext":{"type":"string"},"kdf":{"type":"string"},"kdfparams":{"type":"object"},"mac":{"type":"string"}},"required":["cipher","cipherparams","ciphertext","kdf","kdfparams","mac"]}},"required":["crypto"]};function validate11(data, {instancePath="", parentData, parentDataProperty, rootData=data}={}){let vErrors = null;let errors = 0;if(errors === 0){if(data && typeof data == "object" && !Array.isArray(data)){let missing0;if((data.crypto === undefined) && (missing0 = "crypto")){validate11.errors = [{instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: missing0},message:"must have required property '"+missing0+"'"}];return false;}else {if(data.crypto !== undefined){let data0 = data.crypto;const _errs1 = errors;if(errors === _errs1){if(data0 && typeof data0 == "object" && !Array.isArray(data0)){let missing1;if(((((((data0.cipher === undefined) && (missing1 = "cipher")) || ((data0.cipherparams === undefined) && (missing1 = "cipherparams"))) || ((data0.ciphertext === undefined) && (missing1 = "ciphertext"))) || ((data0.kdf === undefined) && (missing1 = "kdf"))) || ((data0.kdfparams === undefined) && (missing1 = "kdfparams"))) || ((data0.mac === undefined) && (missing1 = "mac"))){validate11.errors = [{instancePath:instancePath+"/crypto",schemaPath:"#/properties/crypto/required",keyword:"required",params:{missingProperty: missing1},message:"must have required property '"+missing1+"'"}];return false;}else {if(data0.cipher !== undefined){const _errs3 = errors;if(typeof data0.cipher !== "string"){validate11.errors = [{instancePath:instancePath+"/crypto/cipher",schemaPath:"#/properties/crypto/properties/cipher/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}var valid1 = _errs3 === errors;}else {var valid1 = true;}if(valid1){if(data0.cipherparams !== undefined){let data2 = data0.cipherparams;const _errs5 = errors;if(!(data2 && typeof data2 == "object" && !Array.isArray(data2))){validate11.errors = [{instancePath:instancePath+"/crypto/cipherparams",schemaPath:"#/properties/crypto/properties/cipherparams/type",keyword:"type",params:{type: "object"},message:"must be object"}];return false;}var valid1 = _errs5 === errors;}else {var valid1 = true;}if(valid1){if(data0.ciphertext !== undefined){const _errs7 = errors;if(typeof data0.ciphertext !== "string"){validate11.errors = [{instancePath:instancePath+"/crypto/ciphertext",schemaPath:"#/properties/crypto/properties/ciphertext/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}var valid1 = _errs7 === errors;}else {var valid1 = true;}if(valid1){if(data0.kdf !== undefined){const _errs9 = errors;if(typeof data0.kdf !== "string"){validate11.errors = [{instancePath:instancePath+"/crypto/kdf",schemaPath:"#/properties/crypto/properties/kdf/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}var valid1 = _errs9 === errors;}else {var valid1 = true;}if(valid1){if(data0.kdfparams !== undefined){let data5 = data0.kdfparams;const _errs11 = errors;if(!(data5 && typeof data5 == "object" && !Array.isArray(data5))){validate11.errors = [{instancePath:instancePath+"/crypto/kdfparams",schemaPath:"#/properties/crypto/properties/kdfparams/type",keyword:"type",params:{type: "object"},message:"must be object"}];return false;}var valid1 = _errs11 === errors;}else {var valid1 = true;}if(valid1){if(data0.mac !== undefined){const _errs13 = errors;if(typeof data0.mac !== "string"){validate11.errors = [{instancePath:instancePath+"/crypto/mac",schemaPath:"#/properties/crypto/properties/mac/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}var valid1 = _errs13 === errors;}else {var valid1 = true;}}}}}}}}else {validate11.errors = [{instancePath:instancePath+"/crypto",schemaPath:"#/properties/crypto/type",keyword:"type",params:{type: "object"},message:"must be object"}];return false;}}}}}else {validate11.errors = [{instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"}];return false;}}validate11.errors = vErrors;return errors === 0;} \ No newline at end of file diff --git a/src/keystore/index.ts b/src/keystore/index.ts new file mode 100644 index 0000000..fc85b09 --- /dev/null +++ b/src/keystore/index.ts @@ -0,0 +1,3 @@ +import { Keystore } from "./keystore.js"; + +export { Keystore }; diff --git a/src/keystore/keystore.spec.ts b/src/keystore/keystore.spec.ts new file mode 100644 index 0000000..9a385e3 --- /dev/null +++ b/src/keystore/keystore.spec.ts @@ -0,0 +1,313 @@ +import chai, { expect } from "chai"; +import chaiAsPromised from "chai-as-promised"; +import chaiSubset from "chai-subset"; +import deepEqualInAnyOrder from "deep-equal-in-any-order"; + +chai.use(chaiSubset); +chai.use(deepEqualInAnyOrder); +chai.use(chaiAsPromised); + +import { buildBigIntFromUint8Array } from "../byte_utils.js"; +import { IdentityCredential } from "../rln.js"; + +import { Keystore } from "./keystore.js"; +import type { MembershipInfo } from "./types.js"; + +const DEFAULT_PASSWORD = "sup3rsecure"; +const NWAKU_KEYSTORE = { + application: "waku-rln-relay", + appIdentifier: "01234567890abcdef", + version: "0.2", + credentials: { + "9DB2B4718A97485B9F70F68D1CC19F4E10F0B4CE943418838E94956CB8E57548": { + crypto: { + cipher: "aes-128-ctr", + cipherparams: { + iv: "fd6b39eb71d44c59f6bf5ff3d8945c80", + }, + ciphertext: + "9c72f47ce95de03ed34502d0288e7576b66b51b9e7d5ae882c27bd89f94e6a03c2c44c2ddf0c982e72003d67212105f1b64614f57cabb0ceadab7e07be165eee1121ad6b81951368a9f3be2dd99ea294515f6013d5f2bd4702a40e36cfde2ea298b23b31e5ce719d8040c3331f73d6bf44f88bca39bac0e917d8bf545500e4f40d321c235426a80f315ac70666acbd3bdf803fbc1e7e7103fed466525ed332b25d72b2dbedf6fa383b2305987c1fe276b029570519b3e79930edf08c1029868d05c2c08ab61d7c64f63c054b4f6a5a12d43cdc79751b6fe58d3ed26b69443eb7c9f7efce27912340129c91b6b813ac94efd5776a40b1dda896d61357de208c7c47a14af911cc231355c8093ee6626e89c07e1037f9e0b22c690e3e049014399ca0212c509cb04c71c7860d1b17a0c47711c490c27bad2825926148a1f15a507f36ba2cdaa04897fce2914e53caed0beaf1bebd2a83af76511cc15bff2165ff0860ad6eca1f30022d7739b2a6b6a72f2feeef0f5941183cda015b4631469e1f4cf27003cab9a90920301cb30d95e4554686922dc5a05c13dfb575cdf113c700d607896011970e6ee7d6edb61210ab28ac8f0c84c606c097e3e300f0a5f5341edfd15432bef6225a498726b62a98283829ad51023b2987f30686cfb4ea3951f3957654035ec291f9b0964a3a8665d81b16cec20fb40f944d5f9bf03ac1e444ad45bae3fa85e7465ce620c0966d8148d6e2856f676c4fbbe3ebe470453efb4bbda1866680037917e37765f680e3da96ef3991f3fe5cda80c523996c2234758bf5f7b6d052dc6942f5a92c8b8eec5d2d8940203bbb6b1cba7b7ebc1334334ca69cdb509a5ea58ec6b2ebaea52307589eaae9430eb15ad234c0c39c83accdf3b77e52a616e345209c5bc9b442f9f0fa96836d9342f983a7", + kdf: "pbkdf2", + kdfparams: { + dklen: 32, + c: 1000000, + prf: "hmac-sha256", + salt: "60f0aa92fbf63a8356dfdbed2ab18058", + }, + mac: "51a227ac6db7f2797c63925880b3db664e034231a4c68daa919ab42d8df38bc6", + }, + }, + "263335559F0578FD785F9CDFEDBB45CFF276799A27580B8F580CDFDCB990257C": { + crypto: { + cipher: "aes-128-ctr", + cipherparams: { + iv: "69f95461f811ac35a21987b1fdaa605e", + }, + ciphertext: + "edfe844f8e2aedd62f26753e7247554920352b6b167f54ea4f728cd715577e9d2b7192b782471914870794205e77c2708b6db2d0ada19fec6b3533098cb2b7350bbaf81526d6bde7f1d0e83c366e3a2ddcced942cfb09a3c7704db7041132c3b511fed2f6d8599e6cddf649250b240687c2c335bf0aa75c892bc97f81c537898aefed20d1488e816d54eec72572acf36f140dc98cba0430cdeb8a00b8e8c8edf9b1292ca0e9c9a606acec51ea3dbe46438cb74b95d708cec18f8f126aecabbff11dd068d9194b25803f959f0bb62d49785dbc694486754f46bfe084cfa780cae27eca48cdcc88f4083d166d1747b8e2e637619e5d3848b9b6cdf7c7161eda8e476edfc083d417691d47b84fb224bfd26bf7713958893b934388e50783e49c5c84999971538ccda14c54b48b0d4aa37503e2a40212e9a1407d5a1ea4e96760de3d87e1b2287465a4e51cf330b7f1d14e3f2fb6521d10d32c798856464927b1e0286086a78f07a8f6f436d8c0c7b530f585320515e276d82c7b1f244702fa9ca6e6ad164fd2b1d9badcbdc17e01e95abf58e6825d8eeba5bc22db3a66dd41c64887d4c862298e921b3bae17d9fb7be1f619c60c82bd60dee351b77514d36e25d4092d6cde8ab613c40a117f7b784c80d65310e5b9cf1a31ba555f848e6984cc0c2d48315167d60131f3ffaaca5c81e359134bbfc81fa217f29b533868604ced4a2c5da8c89bd1238147b9f348168864ebea40c36a6abbf3d59d43086f26777104ce0a9f60cbf350058a337bc66abd5e4976950e5908192f98a9a8c1913abbc0d918479aeaa99e89a0e5cd65fd84a347d73df1d9c829863728a6fcd90150e52ecdec48bd07802110384f6c0aff0ca05ad42feb521223b58719fd4fc4ae88df8225ea58e303e4c61e8288e80f854bf0b", + kdf: "pbkdf2", + kdfparams: { + dklen: 32, + c: 1000000, + prf: "hmac-sha256", + salt: "3cf796e4857f296bef3bdb9ca844b1bf", + }, + mac: "3d6cb0492afcf89c891365f097ae8989dc50038010c419b18228be6816c24c32", + }, + }, + F62A7FCE85E5B796AFCB38F54A44210515CB688EA0224E9A436CCA0A542F2C9D: { + crypto: { + cipher: "aes-128-ctr", + cipherparams: { + iv: "49816dacf881c85db9f11f7f068dcf71", + }, + ciphertext: + "d7d805ee24dd34368e3d1829aa6d0856ca2ea54d9bcdc2655f8f197af0d293aff56c6e06de3137b0eddffbcad7cc0b8e3f6ba761ac7983d8e59ce04c8936868297b9f70238cb295e17567f2404b278b93c985496a6e1e46185965491449ccbc1e7155224acdba354ed18b1b9867ff6f1a833a77c9b21e2e9c4b6af27d5bd6303efd574465920928e5c467bd3c7888c3f31e8bece6af2e0c35fa03661399e9b420eeecd4376cb2b3266692f46c03161bb32cc2c79521f7b19cb0e6ec911213e105967f8887d94c73e793b18e4c14ee045dca13fcfb62ae267d3175f8a4fefd0e8bd636bd9431cc0cc7119e75f116a16dcbdcac1c15a3dcec57e1c49dbf5dccd1c75c0cfcb3473e81e8546048ce5231a4d4c8dd5d66311354e9ab70ad5745d5be27746954a08b0b29218562bfb632ae0a498cf09d7955a27377ed7a50fc1b4adaa0a3fb3e87a3b4d923136be0767a1428050944b9fd247332dea1b5016dfa1ec4da167e70e11e07cd58034b8470366dc16d77978b49a61e213ab5a7817fd69af26c2a8c3cd3a488d6e1491e0215071e1f3e9d49d0dfab3a7e324644c98a088e20259980495dcc379dcdce2e61752711bdf8abf057a2e696624078601245828193d838cc806065ee3f2bb138302ec72c70f34f14c0ab816211011f0ac55423732875e220175c717f6bc86f071bb4fab51c1963eb5c5d70d504c1e4d2307a8c8c4b8b5a84566a4606deb3fc6d7a420adc2b2b37c0ef3018f82a3ce0044e082407e8e7cb6214a3abc139b7f75b2c36c6902080e7696c730ab062e75e597274e0c945b6a7a366d20bd210dd02b097071142d033597e2fc4174be683a866510fa1c2fe150a2fb81dbd2b5da25da27f29367fb22dd4e9d4785856e4deea56219f9495fb3ab772f7867db11cb14026b", + kdf: "pbkdf2", + kdfparams: { + dklen: 32, + c: 1000000, + prf: "hmac-sha256", + salt: "2dcb5ba5c98fe5e46d961dad36e79a5b", + }, + mac: "2d6e9de6440f52c5db64b13f80399967c8770e82616294e14f40a2e213e7d925", + }, + }, + "8479C6B9125D43E7B7739F1BAB41779F2F5A4D27FF0E2B6F6CA353032010A22C": { + crypto: { + cipher: "aes-128-ctr", + cipherparams: { + iv: "b0eef2c385a04909c4ae9b318e179fa7", + }, + ciphertext: + "90b982222072366566fa194be5c170506888e184cadbd52aa38f184ac4e9bc160cc719d809fb6a128e0cbd908e70a71efdc5d51c4dab8aab71e3e6a2ebd9ea4238cb47585137990e896dfa53961bb2b328abfbba82f49db6a9b6e3790cf9e29c145796c6dbf409dc875e7998db827c944a835a29ab4192a11ad1efde5ebdd1a775ecbfefd139c50fbdcbebd6c124d9d65ba6ddaaa83e57695293e7c85dfd6f418d58fa5ffb9ab9b2395c84b57da796d31b6351fde3f1dbab29da6c3f259859bd0719c34f5111a9a12075b53ee91b4598fb2f452dbea823ec094cb757f370b5386a8e5db25cf732681d0cd9bda651ae55cdd125138fd2c8f1ffe87a5eea14df7d355762b37e3e71c33c6fe46a10c2083538910fec12e294de84ff587cab2dd268203699cb180e481f4a3a093b86854cea64341dd9482305abd4a9d7bb304b078bc255bf7cde78689225f17006f24c2cd82d38a59f1e0899965c38fcfd1ec67069143ee05a34922963a527549a002e3221e1461463f573e5f66ba87dcb83a63cb8e3a721c13cd9d4d0c9a0334a558f32027424a5bc9fc12b91981a3f74ac4b62eea3aae8be6c44504696b96afadce5d9222bb67dddf5a7d98dd43d544d79f8720a946c37eba8eb5ae6d70f4bdbbe554cbd4b3abb35ed357c8cb8f55e016ab83bef12bf5c0cdf26c7624c86f16437f545d796addb1aa7370de329930c68b174c871706e7afdf78cc07e0f0c58e45495d0d3bcf3faf9fb6d20369b0adc89766b0c9132677e52112770d017da7658f2a0c0eaeac57416f203700f98bf7b30119407733d4f0bd4322c622120cdf81646c4a1adfb80e757954e41ba0e7816c403b2e4b9ceb2d36e4198921ea719a410ae6f6983e49e7b99c266deb0465af716799e36a5bab70923291da808edeba54267e31e8b64c37123fd45d86e0638", + kdf: "pbkdf2", + kdfparams: { + dklen: 32, + c: 1000000, + prf: "hmac-sha256", + salt: "142a0a65b7f6f480546cc4ef743d7ef9", + }, + mac: "7119b7b78598850de5f6af742e42748a3b005394b6b8b272490f24527ebd8b15", + }, + }, + }, +}; + +describe("Keystore", () => { + it("shoud create empty store with predefined values", () => { + const store = Keystore.create(); + + expect(store.toObject()).to.deep.eq({ + application: "waku-rln-relay", + appIdentifier: "01234567890abcdef", + version: "0.2", + credentials: {}, + }); + }); + + // TODO: add more thorow credentials testing + [ + { + some: "3123", + dadw: "1212", + }, + { + application: 123, + version: "01234567890abcdef", + appIdentifier: "0.2", + credentials: {}, + }, + { + application: "waku-rln-relay", + version: 213, + appIdentifier: "0.2", + credentials: {}, + }, + { + application: "waku-rln-relay", + version: "01234567890abcdef", + appIdentifier: 12, + credentials: {}, + }, + { + application: "waku-rln-relay", + version: "01234567890abcdef", + appIdentifier: "12", + credentials: [], + }, + { + application: "waku-rln-relay", + version: "01234567890abcdef", + appIdentifier: "12", + credentials: 123, + }, + { + application: "waku-rln-relay", + version: "01234567890abcdef", + appIdentifier: "12", + credentials: "123", + }, + { + application: "waku-rln-relay", + version: "01234567890abcdef", + appIdentifier: "12", + credentials: { + hash: { + invalid: "here", + }, + }, + }, + ].map((options) => { + it("should fail to create store from invalid object", () => { + expect(() => Keystore.fromObject(options as any)).to.throw( + "Invalid object, does not match Nwaku Keystore format." + ); + }); + }); + + it("shoud create store from valid object", () => { + const store = Keystore.fromObject(NWAKU_KEYSTORE as any); + expect(store.toObject()).to.deep.eq(NWAKU_KEYSTORE); + }); + + it("should fail to create store from invalid string", () => { + expect(Keystore.fromString("/asdq}")).to.eq(null); + expect(Keystore.fromString('{ "name": "it" }')).to.eq(null); + }); + + it("shoud create store from valid string", async () => { + const store = Keystore.fromObject(NWAKU_KEYSTORE as any); + expect(store.toObject()).to.deep.eq(NWAKU_KEYSTORE); + }); + + it("should convert keystore to string", async () => { + let store = Keystore.create(); + + expect(store.toString()).to.eq( + JSON.stringify({ + application: "waku-rln-relay", + appIdentifier: "01234567890abcdef", + version: "0.2", + credentials: {}, + }) + ); + + store = Keystore.fromObject(NWAKU_KEYSTORE as any); + + expect(store.toString()).to.eq(JSON.stringify(NWAKU_KEYSTORE)); + }); + + it("shoud add / read new credentials", async () => { + const expectedHash = + "9DB2B4718A97485B9F70F68D1CC19F4E10F0B4CE943418838E94956CB8E57548"; + const identity = { + IDTrapdoor: [ + 211, 23, 66, 42, 179, 130, 131, 111, 201, 205, 244, 34, 27, 238, 244, + 216, 131, 240, 188, 45, 193, 172, 4, 168, 225, 225, 43, 197, 114, 176, + 126, 9, + ], + IDNullifier: [ + 238, 168, 239, 65, 73, 63, 105, 19, 132, 62, 213, 205, 191, 255, 209, 9, + 178, 155, 239, 201, 131, 125, 233, 136, 246, 217, 9, 237, 55, 89, 81, + 42, + ], + IDSecretHash: [ + 150, 54, 194, 28, 18, 216, 138, 253, 95, 139, 120, 109, 98, 129, 146, + 101, 41, 194, 36, 36, 96, 152, 152, 89, 151, 160, 118, 15, 222, 124, + 187, 4, + ], + IDCommitment: [ + 112, 216, 27, 89, 188, 135, 203, 19, 168, 211, 117, 13, 231, 135, 229, + 58, 94, 20, 246, 8, 33, 65, 238, 37, 112, 97, 65, 241, 255, 93, 171, 15, + ], + IDCommitmentBigInt: buildBigIntFromUint8Array( + new Uint8Array([ + 112, 216, 27, 89, 188, 135, 203, 19, 168, 211, 117, 13, 231, 135, 229, + 58, 94, 20, 246, 8, 33, 65, 238, 37, 112, 97, 65, 241, 255, 93, 171, + 15, + ]) + ), + } as unknown as IdentityCredential; + const membership = { + chainId: "0xAA36A7", + treeIndex: 8, + address: "0x8e1F3742B987d8BA376c0CBbD7357fE1F003ED71", + } as unknown as MembershipInfo; + + const store = Keystore.create(); + const hash = await store.addCredential( + { identity, membership }, + DEFAULT_PASSWORD + ); + + expect(hash).to.eq(expectedHash); + + const actualCredentials = await store.readCredential( + expectedHash, + DEFAULT_PASSWORD + ); + expect(actualCredentials).to.deep.equalInAnyOrder({ + identity, + membership, + }); + }); + + it("shoud fail to add credentials if already exist", async () => { + const identity = { + IDTrapdoor: [ + 211, 23, 66, 42, 179, 130, 131, 111, 201, 205, 244, 34, 27, 238, 244, + 216, 131, 240, 188, 45, 193, 172, 4, 168, 225, 225, 43, 197, 114, 176, + 126, 9, + ], + IDNullifier: [ + 238, 168, 239, 65, 73, 63, 105, 19, 132, 62, 213, 205, 191, 255, 209, 9, + 178, 155, 239, 201, 131, 125, 233, 136, 246, 217, 9, 237, 55, 89, 81, + 42, + ], + IDSecretHash: [ + 150, 54, 194, 28, 18, 216, 138, 253, 95, 139, 120, 109, 98, 129, 146, + 101, 41, 194, 36, 36, 96, 152, 152, 89, 151, 160, 118, 15, 222, 124, + 187, 4, + ], + IDCommitment: [ + 112, 216, 27, 89, 188, 135, 203, 19, 168, 211, 117, 13, 231, 135, 229, + 58, 94, 20, 246, 8, 33, 65, 238, 37, 112, 97, 65, 241, 255, 93, 171, 15, + ], + } as unknown as IdentityCredential; + const membership = { + chainId: "0xAA36A7", + treeIndex: 8, + address: "0x8e1F3742B987d8BA376c0CBbD7357fE1F003ED71", + } as unknown as MembershipInfo; + + const store = Keystore.fromObject(NWAKU_KEYSTORE as any); + + try { + await store.addCredential({ identity, membership }, DEFAULT_PASSWORD); + } catch (e) { + expect((e as Error).message).to.eq( + "Credential already exists in the store." + ); + } + }); + + it("shoud fail to read credentials with wrong password", async () => { + const expectedHash = + "9DB2B4718A97485B9F70F68D1CC19F4E10F0B4CE943418838E94956CB8E57548"; + const store = Keystore.fromObject(NWAKU_KEYSTORE as any); + + try { + await store.readCredential(expectedHash, "wrong-password"); + } catch (e) { + expect((e as Error).message).to.eq("Password is invalid."); + } + }); + + it("shoud fail to read missing credentials", async () => { + const store = Keystore.fromObject(NWAKU_KEYSTORE as any); + + const result = await store.readCredential("wrong-hash", "wrong-password"); + expect(result).to.eq(null); + }); +}); diff --git a/src/keystore/keystore.ts b/src/keystore/keystore.ts new file mode 100644 index 0000000..71b86c6 --- /dev/null +++ b/src/keystore/keystore.ts @@ -0,0 +1,295 @@ +import type { + ICipherModule, + IKeystore as IEipKeystore, + IPbkdf2KdfModule, +} from "@chainsafe/bls-keystore"; +import { create as createEipKeystore } from "@chainsafe/bls-keystore"; +import { sha256 } from "ethereum-cryptography/sha256"; +import { + bytesToHex, + bytesToUtf8, + utf8ToBytes, +} from "ethereum-cryptography/utils"; +import _ from "lodash"; +import { v4 as uuidV4 } from "uuid"; + +import { buildBigIntFromUint8Array } from "../byte_utils.js"; +import type { IdentityCredential } from "../rln.js"; + +import { decryptEipKeystore, keccak256Checksum } from "./cipher.js"; +import { isCredentialValid, isKeystoreValid } from "./schema_validator.js"; +import type { + Keccak256Hash, + MembershipHash, + MembershipInfo, + Password, + Sha256Hash, +} from "./types.js"; + +type NwakuCredential = { + crypto: { + cipher: ICipherModule["function"]; + cipherparams: ICipherModule["params"]; + ciphertext: ICipherModule["message"]; + kdf: IPbkdf2KdfModule["function"]; + kdfparams: IPbkdf2KdfModule["params"]; + mac: Sha256Hash; + }; +}; + +// examples from nwaku +// https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/tests/test_waku_keystore.nim#L43 +// https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/keystore.nim#L154C35-L154C38 +// important: each credential has it's own password +// important: not compatible with https://eips.ethereum.org/EIPS/eip-2335 +interface NwakuKeystore { + application: string; + version: string; + appIdentifier: string; + credentials: { + [key: MembershipHash]: NwakuCredential; + }; +} + +type KeystoreCreateOptions = { + application?: string; + version?: string; + appIdentifier?: string; +}; + +type IdentityOptions = { + identity: IdentityCredential; + membership: MembershipInfo; +}; + +export class Keystore { + private data: NwakuKeystore; + + private constructor(options: KeystoreCreateOptions | NwakuKeystore) { + this.data = Object.assign( + { + application: "waku-rln-relay", + appIdentifier: "01234567890abcdef", + version: "0.2", + credentials: {}, + }, + options + ); + } + + public static create(options: KeystoreCreateOptions = {}): Keystore { + return new Keystore(options); + } + + public static fromString(str: string): Keystore | null { + try { + const obj = JSON.parse(str); + + if (!Keystore.isValidNwakuStore(obj)) { + throw Error("Invalid string, does not match Nwaku Keystore format."); + } + + return new Keystore(obj); + } catch (err) { + console.error("Cannot create Keystore from string:", err); + return null; + } + } + + public static fromObject(obj: NwakuKeystore): Keystore { + if (!Keystore.isValidNwakuStore(obj)) { + throw Error("Invalid object, does not match Nwaku Keystore format."); + } + + return new Keystore(obj); + } + + public async addCredential( + options: IdentityOptions, + password: Password + ): Promise { + const membershipHash: MembershipHash = Keystore.computeMembershipHash( + options.membership + ); + + if (this.data.credentials[membershipHash]) { + throw Error("Credential already exists in the store."); + } + + // these are not important + const stubPath = "/stub/path"; + const stubPubkey = new Uint8Array([0]); + const secret = Keystore.fromIdentityToBytes(options); + + const eipKeystore = await createEipKeystore( + password, + secret, + stubPubkey, + stubPath + ); + // need to re-compute checksum since nwaku uses keccak256 instead of sha256 + const checksum = await keccak256Checksum(password, eipKeystore); + const nwakuCredential = Keystore.fromEipToCredential(eipKeystore, checksum); + + this.data.credentials[membershipHash] = nwakuCredential; + return membershipHash; + } + + public async readCredential( + membershipHash: MembershipHash, + password: Password + ): Promise { + const nwakuCredential = this.data.credentials[membershipHash]; + + if (!nwakuCredential) { + return null; + } + + const eipKeystore = Keystore.fromCredentialToEip(nwakuCredential); + const bytes = await decryptEipKeystore(password, eipKeystore); + + return Keystore.fromBytesToIdentity(bytes); + } + + public removeCredential(hash: MembershipHash): void { + if (!this.data.credentials[hash]) { + return; + } + + delete this.data.credentials[hash]; + } + + public toString(): string { + return JSON.stringify(this.data); + } + + public toObject(): NwakuKeystore { + return this.data; + } + + private static isValidNwakuStore(obj: unknown): boolean { + if (!isKeystoreValid(obj)) { + return false; + } + + const areCredentialsValid = Object.values(_.get(obj, "credentials", {})) + .map((c) => isCredentialValid(c)) + .every((v) => v); + + return areCredentialsValid; + } + + private static fromCredentialToEip( + credential: NwakuCredential + ): IEipKeystore { + const nwakuCrypto = credential.crypto; + const eipCrypto: IEipKeystore["crypto"] = { + kdf: { + function: nwakuCrypto.kdf, + params: nwakuCrypto.kdfparams, + message: "", + }, + cipher: { + function: nwakuCrypto.cipher, + params: nwakuCrypto.cipherparams, + message: nwakuCrypto.ciphertext, + }, + checksum: { + // @chainsafe/bls-keystore supports only sha256 + // but nwaku uses keccak256 + // https://github.com/waku-org/nwaku/blob/25d6e52e3804d15f9b61bc4cc6dd448540c072a1/waku/waku_keystore/keyfile.nim#L367 + function: "sha256", + params: {}, + message: nwakuCrypto.mac, + }, + }; + + return { + version: 4, + uuid: uuidV4(), + description: undefined, + path: "safe to ignore, not important for decrypt", + pubkey: "safe to ignore, not important for decrypt", + crypto: eipCrypto, + }; + } + + private static fromEipToCredential( + eipKeystore: IEipKeystore, + checksum: Keccak256Hash + ): NwakuCredential { + const eipCrypto = eipKeystore.crypto; + const eipKdf = eipCrypto.kdf as IPbkdf2KdfModule; + return { + crypto: { + cipher: eipCrypto.cipher.function, + cipherparams: eipCrypto.cipher.params, + ciphertext: eipCrypto.cipher.message, + kdf: eipKdf.function, + kdfparams: eipKdf.params, + // @chainsafe/bls-keystore generates only sha256 + // but nwaku uses keccak256 + // https://github.com/waku-org/nwaku/blob/25d6e52e3804d15f9b61bc4cc6dd448540c072a1/waku/waku_keystore/keyfile.nim#L367 + mac: checksum, + }, + }; + } + + private static fromBytesToIdentity( + bytes: Uint8Array + ): null | IdentityOptions { + try { + const str = bytesToUtf8(bytes); + const obj = JSON.parse(str); + + // TODO: add runtime validation of nwaku credentials + return { + identity: { + IDCommitment: _.get(obj, "identityCredential.idCommitment"), + IDTrapdoor: _.get(obj, "identityCredential.idTrapdoor"), + IDNullifier: _.get(obj, "identityCredential.idNullifier"), + IDCommitmentBigInt: buildBigIntFromUint8Array( + new Uint8Array(_.get(obj, "identityCredential.idCommitment", [])) + ), + IDSecretHash: _.get(obj, "identityCredential.idSecretHash"), + }, + membership: { + treeIndex: _.get(obj, "treeIndex"), + chainId: _.get(obj, "membershipContract.chainId"), + address: _.get(obj, "membershipContract.address"), + }, + }; + } catch (err) { + console.error("Cannot parse bytes to Nwaku Credentials:", err); + return null; + } + } + + // follows nwaku implementation + // https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L111 + private static computeMembershipHash(info: MembershipInfo): MembershipHash { + return bytesToHex( + sha256(utf8ToBytes(`${info.chainId}${info.address}${info.treeIndex}`)) + ).toUpperCase(); + } + + // follows nwaku implementation + // https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L98 + private static fromIdentityToBytes(options: IdentityOptions): Uint8Array { + return utf8ToBytes( + JSON.stringify({ + treeIndex: options.membership.treeIndex, + identityCredential: { + idCommitment: options.identity.IDCommitment, + idNullifier: options.identity.IDNullifier, + idSecretHash: options.identity.IDSecretHash, + idTrapdoor: options.identity.IDTrapdoor, + }, + membershipContract: { + chainId: options.membership.chainId, + address: options.membership.address, + }, + }) + ); + } +} diff --git a/src/keystore/keystore_validation_generated.ts b/src/keystore/keystore_validation_generated.ts new file mode 100644 index 0000000..7b2925b --- /dev/null +++ b/src/keystore/keystore_validation_generated.ts @@ -0,0 +1,8 @@ + +/* eslint eslint-comments/no-unlimited-disable: "off" */ +// This file was generated by /scripts/schema-validation-codegen.ts +// Do not modify this file by hand. + +/* eslint-disable */ +// @ts-ignore +"use strict";export const Keystore = validate11;const schema12 = {"type":"object","properties":{"credentials":{"type":"object"},"appIdentifier":{"type":"string"},"version":{"type":"string"},"application":{"type":"string"}},"required":["application","appIdentifier","credentials","version"]};function validate11(data, {instancePath="", parentData, parentDataProperty, rootData=data}={}){let vErrors = null;let errors = 0;if(errors === 0){if(data && typeof data == "object" && !Array.isArray(data)){let missing0;if(((((data.application === undefined) && (missing0 = "application")) || ((data.appIdentifier === undefined) && (missing0 = "appIdentifier"))) || ((data.credentials === undefined) && (missing0 = "credentials"))) || ((data.version === undefined) && (missing0 = "version"))){validate11.errors = [{instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: missing0},message:"must have required property '"+missing0+"'"}];return false;}else {if(data.credentials !== undefined){let data0 = data.credentials;const _errs1 = errors;if(!(data0 && typeof data0 == "object" && !Array.isArray(data0))){validate11.errors = [{instancePath:instancePath+"/credentials",schemaPath:"#/properties/credentials/type",keyword:"type",params:{type: "object"},message:"must be object"}];return false;}var valid0 = _errs1 === errors;}else {var valid0 = true;}if(valid0){if(data.appIdentifier !== undefined){const _errs3 = errors;if(typeof data.appIdentifier !== "string"){validate11.errors = [{instancePath:instancePath+"/appIdentifier",schemaPath:"#/properties/appIdentifier/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}var valid0 = _errs3 === errors;}else {var valid0 = true;}if(valid0){if(data.version !== undefined){const _errs5 = errors;if(typeof data.version !== "string"){validate11.errors = [{instancePath:instancePath+"/version",schemaPath:"#/properties/version/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}var valid0 = _errs5 === errors;}else {var valid0 = true;}if(valid0){if(data.application !== undefined){const _errs7 = errors;if(typeof data.application !== "string"){validate11.errors = [{instancePath:instancePath+"/application",schemaPath:"#/properties/application/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}var valid0 = _errs7 === errors;}else {var valid0 = true;}}}}}}else {validate11.errors = [{instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"}];return false;}}validate11.errors = vErrors;return errors === 0;} \ No newline at end of file diff --git a/src/keystore/schema_validator.ts b/src/keystore/schema_validator.ts new file mode 100644 index 0000000..d33895d --- /dev/null +++ b/src/keystore/schema_validator.ts @@ -0,0 +1,34 @@ +import { Credential as _validateCredentialGenerated } from "./credential_validation_generated.js"; +import { Keystore as _validateKeystoreGenerated } from "./keystore_validation_generated.js"; + +type ErrorObject = { + instancePath: string; + schemaPath: string; + keyword: string; + params: object; + message: string; +}; + +type ValidatorFn = ((data: unknown) => boolean) & { errors: ErrorObject[] }; + +const _validateKeystore = _validateKeystoreGenerated as ValidatorFn; +const _validateCredential = _validateCredentialGenerated as ValidatorFn; + +function schemaValidationErrors( + validator: ValidatorFn, + data: unknown +): ErrorObject[] | null { + const validated = validator(data); + if (validated) { + return null; + } + return validator.errors; +} + +export function isKeystoreValid(keystore: unknown): boolean { + return !schemaValidationErrors(_validateKeystore, keystore); +} + +export function isCredentialValid(credential: unknown): boolean { + return !schemaValidationErrors(_validateCredential, credential); +} diff --git a/src/keystore/types.ts b/src/keystore/types.ts new file mode 100644 index 0000000..4873f97 --- /dev/null +++ b/src/keystore/types.ts @@ -0,0 +1,12 @@ +export type MembershipHash = string; +export type Sha256Hash = string; +export type Keccak256Hash = string; +export type Password = string | Uint8Array; + +// see reference +// https://github.com/waku-org/nwaku/blob/f05528d4be3d3c876a8b07f9bb7dfaae8aa8ec6e/waku/waku_keystore/protocol_types.nim#L111 +export type MembershipInfo = { + chainId: number; + address: string; + treeIndex: number; +}; diff --git a/src/rln.ts b/src/rln.ts index e9fa169..c475168 100644 --- a/src/rln.ts +++ b/src/rln.ts @@ -2,7 +2,7 @@ import type { IRateLimitProof } from "@waku/interfaces"; import { default as init } from "@waku/zerokit-rln-wasm"; import * as zerokitRLN from "@waku/zerokit-rln-wasm"; -import { writeUIntLE } from "./byte_utils.js"; +import { buildBigIntFromUint8Array, writeUIntLE } from "./byte_utils.js"; import { dateToEpoch, epochIntToBytes } from "./epoch.js"; import verificationKey from "./resources/verification_key.js"; import * as wc from "./witness_calculator.js"; @@ -27,16 +27,6 @@ function concatenate(...input: Uint8Array[]): Uint8Array { return result; } -/** - * Transforms Uint8Array into BigInt - * @param array: Uint8Array - * @returns BigInt - */ -function buildBigIntFromUint8Array(array: Uint8Array): bigint { - const dataView = new DataView(array.buffer); - return dataView.getBigUint64(0, true); -} - const stringEncoder = new TextEncoder(); const DEPTH = 20;