diff --git a/bun.lock b/bun.lock index 26222532..317afb7e 100644 --- a/bun.lock +++ b/bun.lock @@ -1,6 +1,5 @@ { "lockfileVersion": 1, - "configVersion": 0, "workspaces": { "": { "name": "@kynesyslabs/demosdk", @@ -10,7 +9,6 @@ "@coral-xyz/anchor": "^0.32.1", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stargate": "^0.32.4", - "@cryptkeeperzk/snarkjs": "^0.7.2", "@kynesyslabs/demosdk": "^2.8.22", "@metaplex-foundation/js": "^0.20.1", "@multiversx/sdk-core": "^13.17.2", @@ -63,6 +61,7 @@ "ripple-keypairs": "^2.0.0", "rubic-sdk": "^5.57.4", "simple-peer": "^9.11.1", + "snarkjs": "^0.7.5", "socket.io-client": "^4.8.1", "sphincs": "^3.0.4", "superdilithium": "^2.0.6", @@ -77,6 +76,7 @@ "@types/jest": "^29.5.14", "@types/node": "^20.19.13", "@types/node-forge": "^1.3.14", + "@types/snarkjs": "^0.7.9", "jest": "^29.7.0", "resolve-tspaths": "^0.8.23", "ts-jest": "^29.4.1", @@ -388,7 +388,7 @@ "@iden3/bigarray": ["@iden3/bigarray@0.0.2", "", {}, "sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g=="], - "@iden3/binfileutils": ["@iden3/binfileutils@0.0.11", "", { "dependencies": { "fastfile": "0.0.20", "ffjavascript": "^0.2.48" } }, "sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA=="], + "@iden3/binfileutils": ["@iden3/binfileutils@0.0.12", "", { "dependencies": { "fastfile": "0.0.20", "ffjavascript": "^0.3.0" } }, "sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ=="], "@inquirer/external-editor": ["@inquirer/external-editor@1.0.0", "", { "dependencies": { "chardet": "^2.1.0", "iconv-lite": "^0.6.3" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-5v3YXc5ZMfL6OJqXPrX9csb4l7NlQA2doO1yynUjpUChT9hg4JcuBVP0RbsEJ/3SL/sxWEyFjT2W69ZhtoBWqg=="], @@ -884,6 +884,8 @@ "@types/simple-peer": ["@types/simple-peer@9.11.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-rvqefdp2rvIA6wiomMgKWd2UZNPe6LM2EV5AuY3CPQJF+8TbdrL5TjYdMf0VAjGczzlkH4l1NjDkihwbj3Xodw=="], + "@types/snarkjs": ["@types/snarkjs@0.7.9", "", {}, "sha512-pb4Bq3GI2YQOQOG0dR/YuQs/mqcuL6k/vnz68LIPtpA2frrUL3twf69a3AUK9eUmNNeW0RIKkq6scDlC75Is+g=="], + "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], @@ -1170,7 +1172,7 @@ "cipher-base": ["cipher-base@1.0.6", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1" } }, "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw=="], - "circom_runtime": ["circom_runtime@0.1.23", "", { "dependencies": { "ffjavascript": "0.2.59" }, "bin": { "calcwit": "calcwit.js" } }, "sha512-S0A63qM5LtlcTgsHX4z/U6nWAKo/KQBrz4umxVMyADPHxt6qDWy2AahPc2lAWQT42cFIDuonFPjgCjviSgQU8A=="], + "circom_runtime": ["circom_runtime@0.1.28", "", { "dependencies": { "ffjavascript": "0.3.1" }, "bin": { "calcwit": "calcwit.js" } }, "sha512-ACagpQ7zBRLKDl5xRZ4KpmYIcZDUjOiNRuxvXLqhnnlLSVY1Dbvh73TI853nqoR0oEbihtWmMSjgc5f+pXf/jQ=="], "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], @@ -1340,6 +1342,8 @@ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], + "electron-to-chromium": ["electron-to-chromium@1.5.200", "", {}, "sha512-rFCxROw7aOe4uPTfIAx+rXv9cEcGx+buAF4npnhtTqCJk5KDFRnh3+KYj7rdVh6lsFt5/aPs+Irj9rZ33WMA7w=="], "elliptic": ["elliptic@6.6.1", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="], @@ -1480,7 +1484,7 @@ "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], - "ffjavascript": ["ffjavascript@0.2.63", "", { "dependencies": { "wasmbuilder": "0.0.16", "wasmcurves": "0.2.2", "web-worker": "1.2.0" } }, "sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A=="], + "ffjavascript": ["ffjavascript@0.3.1", "", { "dependencies": { "wasmbuilder": "0.0.16", "wasmcurves": "0.2.2", "web-worker": "1.2.0" } }, "sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw=="], "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], @@ -1960,7 +1964,7 @@ "nano-json-stream-parser": ["nano-json-stream-parser@0.1.2", "", {}, "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew=="], - "nanoassert": ["nanoassert@2.0.0", "", {}, "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA=="], + "nanoassert": ["nanoassert@1.1.0", "", {}, "sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ=="], "nanostores": ["nanostores@0.10.3", "", {}, "sha512-Nii8O1XqmawqSCf9o2aWqVxhKRN01+iue9/VEd1TiJCr9VT5XxgPFbF1Edl1XN6pwJcZRsl8Ki+z01yb/T/C2g=="], @@ -2132,7 +2136,7 @@ "quick-lru": ["quick-lru@6.1.2", "", {}, "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ=="], - "r1csfile": ["r1csfile@0.0.46", "", { "dependencies": { "@iden3/bigarray": "0.0.2", "@iden3/binfileutils": "0.0.11", "fastfile": "0.0.20", "ffjavascript": "0.2.59" } }, "sha512-mV0YshVFHEjGUdRbAYimileNQSaINkPoTDtJxZniFSbWgugM3dChGNSNITntQWmP3xnUFP7qZqONM6kLSBeoaw=="], + "r1csfile": ["r1csfile@0.0.48", "", { "dependencies": { "@iden3/bigarray": "0.0.2", "@iden3/binfileutils": "0.0.12", "fastfile": "0.0.20", "ffjavascript": "0.3.0" } }, "sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw=="], "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], @@ -2256,6 +2260,8 @@ "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], + "snarkjs": ["snarkjs@0.7.6", "", { "dependencies": { "@iden3/binfileutils": "0.0.12", "@noble/hashes": "^1.7.1", "bfj": "^7.0.2", "circom_runtime": "0.1.28", "ejs": "^3.1.6", "fastfile": "0.0.20", "ffjavascript": "0.3.1", "logplease": "^1.2.15", "r1csfile": "0.0.48" }, "bin": { "snarkjs": "build/cli.cjs" } }, "sha512-4uH1xA5JzVU5jaaWS2fXej3+RC6L5Erhr6INTJtUA27du4Elbh4VXCeeRjB4QiwL6N6y7SNKePw5prTxyEf4Zg=="], + "socket.io-client": ["socket.io-client@4.8.1", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ=="], "socket.io-parser": ["socket.io-parser@4.2.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } }, "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew=="], @@ -2510,7 +2516,7 @@ "wasmbuilder": ["wasmbuilder@0.0.16", "", {}, "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA=="], - "wasmcurves": ["wasmcurves@0.2.1", "", { "dependencies": { "wasmbuilder": "0.0.16" } }, "sha512-9ciO7bUE5bgpbOcdK7IO3enrSVIKHwrQmPibok4GLJWaCA7Wyqc9PRYnu5HbiFv9NDFNqVKPtU5R6Is5KujBLg=="], + "wasmcurves": ["wasmcurves@0.2.2", "", { "dependencies": { "wasmbuilder": "0.0.16" } }, "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ=="], "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], @@ -2762,8 +2768,16 @@ "@cosmjs/socket/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + "@cryptkeeperzk/ffjavascript/wasmcurves": ["wasmcurves@0.2.1", "", { "dependencies": { "wasmbuilder": "0.0.16" } }, "sha512-9ciO7bUE5bgpbOcdK7IO3enrSVIKHwrQmPibok4GLJWaCA7Wyqc9PRYnu5HbiFv9NDFNqVKPtU5R6Is5KujBLg=="], + + "@cryptkeeperzk/snarkjs/@iden3/binfileutils": ["@iden3/binfileutils@0.0.11", "", { "dependencies": { "fastfile": "0.0.20", "ffjavascript": "^0.2.48" } }, "sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA=="], + + "@cryptkeeperzk/snarkjs/circom_runtime": ["circom_runtime@0.1.23", "", { "dependencies": { "ffjavascript": "0.2.59" }, "bin": { "calcwit": "calcwit.js" } }, "sha512-S0A63qM5LtlcTgsHX4z/U6nWAKo/KQBrz4umxVMyADPHxt6qDWy2AahPc2lAWQT42cFIDuonFPjgCjviSgQU8A=="], + "@cryptkeeperzk/snarkjs/js-sha3": ["js-sha3@0.8.0", "", {}, "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="], + "@cryptkeeperzk/snarkjs/r1csfile": ["r1csfile@0.0.46", "", { "dependencies": { "@iden3/bigarray": "0.0.2", "@iden3/binfileutils": "0.0.11", "fastfile": "0.0.20", "ffjavascript": "0.2.59" } }, "sha512-mV0YshVFHEjGUdRbAYimileNQSaINkPoTDtJxZniFSbWgugM3dChGNSNITntQWmP3xnUFP7qZqONM6kLSBeoaw=="], + "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], "@ethereumjs/common/ethereumjs-util": ["ethereumjs-util@7.1.5", "", { "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", "create-hash": "^1.1.2", "ethereum-cryptography": "^0.1.3", "rlp": "^2.2.4" } }, "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg=="], @@ -3168,7 +3182,7 @@ "blake2b/blake2b-wasm": ["blake2b-wasm@1.1.7", "", { "dependencies": { "nanoassert": "^1.0.0" } }, "sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA=="], - "blake2b/nanoassert": ["nanoassert@1.1.0", "", {}, "sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ=="], + "blake2b-wasm/nanoassert": ["nanoassert@2.0.0", "", {}, "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA=="], "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], @@ -3192,8 +3206,6 @@ "cids/multicodec": ["multicodec@1.0.4", "", { "dependencies": { "buffer": "^5.6.0", "varint": "^5.0.0" } }, "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg=="], - "circom_runtime/ffjavascript": ["ffjavascript@0.2.59", "", { "dependencies": { "wasmbuilder": "0.0.16", "wasmcurves": "0.2.1", "web-worker": "^1.2.0" } }, "sha512-QssOEUv+wilz9Sg7Zaj6KWAm7QceOAEsFuEBTltUsDo1cjn11rA/LGYvzFBPbzNfxRlZxwgJ7uxpCQcdDlrNfw=="], - "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], @@ -3246,8 +3258,6 @@ "express/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], - "ffjavascript/wasmcurves": ["wasmcurves@0.2.2", "", { "dependencies": { "wasmbuilder": "0.0.16" } }, "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ=="], - "figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], "filelist/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], @@ -3346,7 +3356,7 @@ "pvtsutils/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "r1csfile/ffjavascript": ["ffjavascript@0.2.59", "", { "dependencies": { "wasmbuilder": "0.0.16", "wasmcurves": "0.2.1", "web-worker": "^1.2.0" } }, "sha512-QssOEUv+wilz9Sg7Zaj6KWAm7QceOAEsFuEBTltUsDo1cjn11rA/LGYvzFBPbzNfxRlZxwgJ7uxpCQcdDlrNfw=="], + "r1csfile/ffjavascript": ["ffjavascript@0.3.0", "", { "dependencies": { "wasmbuilder": "0.0.16", "wasmcurves": "0.2.2", "web-worker": "1.2.0" } }, "sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ=="], "raw-body/http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], @@ -3570,6 +3580,12 @@ "@coral-xyz/anchor/bs58/base-x": ["base-x@3.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA=="], + "@cryptkeeperzk/snarkjs/@iden3/binfileutils/ffjavascript": ["ffjavascript@0.2.63", "", { "dependencies": { "wasmbuilder": "0.0.16", "wasmcurves": "0.2.2", "web-worker": "1.2.0" } }, "sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A=="], + + "@cryptkeeperzk/snarkjs/circom_runtime/ffjavascript": ["ffjavascript@0.2.59", "", { "dependencies": { "wasmbuilder": "0.0.16", "wasmcurves": "0.2.1", "web-worker": "^1.2.0" } }, "sha512-QssOEUv+wilz9Sg7Zaj6KWAm7QceOAEsFuEBTltUsDo1cjn11rA/LGYvzFBPbzNfxRlZxwgJ7uxpCQcdDlrNfw=="], + + "@cryptkeeperzk/snarkjs/r1csfile/ffjavascript": ["ffjavascript@0.2.59", "", { "dependencies": { "wasmbuilder": "0.0.16", "wasmcurves": "0.2.1", "web-worker": "^1.2.0" } }, "sha512-QssOEUv+wilz9Sg7Zaj6KWAm7QceOAEsFuEBTltUsDo1cjn11rA/LGYvzFBPbzNfxRlZxwgJ7uxpCQcdDlrNfw=="], + "@ethereumjs/common/ethereumjs-util/ethereum-cryptography": ["ethereum-cryptography@0.1.3", "", { "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", "blakejs": "^1.1.0", "browserify-aes": "^1.2.0", "bs58check": "^2.1.2", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "hash.js": "^1.1.7", "keccak": "^3.0.0", "pbkdf2": "^3.0.17", "randombytes": "^2.1.0", "safe-buffer": "^5.1.2", "scrypt-js": "^3.0.0", "secp256k1": "^4.0.1", "setimmediate": "^1.0.5" } }, "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ=="], "@ethereumjs/tx/ethereumjs-util/ethereum-cryptography": ["ethereum-cryptography@0.1.3", "", { "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", "blakejs": "^1.1.0", "browserify-aes": "^1.2.0", "bs58check": "^2.1.2", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "hash.js": "^1.1.7", "keccak": "^3.0.0", "pbkdf2": "^3.0.17", "randombytes": "^2.1.0", "safe-buffer": "^5.1.2", "scrypt-js": "^3.0.0", "secp256k1": "^4.0.1", "setimmediate": "^1.0.5" } }, "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ=="], @@ -3956,6 +3972,10 @@ "@confio/ics23/protobufjs/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], + "@cryptkeeperzk/snarkjs/circom_runtime/ffjavascript/wasmcurves": ["wasmcurves@0.2.1", "", { "dependencies": { "wasmbuilder": "0.0.16" } }, "sha512-9ciO7bUE5bgpbOcdK7IO3enrSVIKHwrQmPibok4GLJWaCA7Wyqc9PRYnu5HbiFv9NDFNqVKPtU5R6Is5KujBLg=="], + + "@cryptkeeperzk/snarkjs/r1csfile/ffjavascript/wasmcurves": ["wasmcurves@0.2.1", "", { "dependencies": { "wasmbuilder": "0.0.16" } }, "sha512-9ciO7bUE5bgpbOcdK7IO3enrSVIKHwrQmPibok4GLJWaCA7Wyqc9PRYnu5HbiFv9NDFNqVKPtU5R6Is5KujBLg=="], + "@ethereumjs/common/ethereumjs-util/ethereum-cryptography/bs58check": ["bs58check@2.1.2", "", { "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", "safe-buffer": "^5.1.2" } }, "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA=="], "@ethereumjs/common/ethereumjs-util/ethereum-cryptography/secp256k1": ["secp256k1@4.0.4", "", { "dependencies": { "elliptic": "^6.5.7", "node-addon-api": "^5.0.0", "node-gyp-build": "^4.2.0" } }, "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw=="], diff --git a/package.json b/package.json index 48117c38..19159298 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "@coral-xyz/anchor": "^0.32.1", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stargate": "^0.32.4", - "@cryptkeeperzk/snarkjs": "^0.7.2", + "snarkjs": "^0.7.5", "@kynesyslabs/demosdk": "^2.8.22", "@metaplex-foundation/js": "^0.20.1", "@multiversx/sdk-core": "^13.17.2", @@ -166,6 +166,7 @@ "@types/jest": "^29.5.14", "@types/node": "^20.19.13", "@types/node-forge": "^1.3.14", + "@types/snarkjs": "^0.7.9", "jest": "^29.7.0", "resolve-tspaths": "^0.8.23", "ts-jest": "^29.4.1", diff --git a/src/encryption/zK/identity/ProofGenerator.ts b/src/encryption/zK/identity/ProofGenerator.ts index ba402fbb..9235cb29 100644 --- a/src/encryption/zK/identity/ProofGenerator.ts +++ b/src/encryption/zK/identity/ProofGenerator.ts @@ -4,13 +4,181 @@ * REVIEW: Phase 9 - SDK Integration * REVIEW: Phase 10.1 - Production Implementation (Real snarkjs proof generation) * REVIEW: Phase 10.4 - CDN Integration (Production-ready with CDN URLs) + * REVIEW: Phase 10.5 - Hybrid Environment Detection (Auto-detect service worker context) * * Generates Groth16 ZK-SNARK proofs for identity attestations using snarkjs. * Circuit artifacts (WASM, proving key, verification key) are loaded from CDN. + * + * Environment Compatibility: + * - Automatically detects Chrome MV3 service workers and uses single-threaded mode + * - Uses parallel Web Workers in standard browser/Node.js contexts for better performance + * - Can be manually overridden via ProofGeneratorConfig */ // REVIEW: Phase 10.1 - Production cryptographic implementation -import * as snarkjs from '@cryptkeeperzk/snarkjs' +import * as snarkjs from 'snarkjs' + +// Type augmentation for snarkjs - @types/snarkjs@0.7.9 doesn't include proverOptions for groth16.prove +declare module 'snarkjs' { + namespace groth16 { + interface ProverOptions { + singleThread?: boolean + } + interface Groth16Proof { + pi_a: string[] + pi_b: string[][] + pi_c: string[] + protocol: string + curve: string + } + // groth16.prove accepts proverOptions (including singleThread) + function prove( + zkeyFileName: string | Uint8Array, + wtnsFileName: Uint8Array | { type: string; data: Uint8Array }, + logger?: object, + proverOptions?: ProverOptions + ): Promise<{ proof: Groth16Proof; publicSignals: string[] }> + } + namespace wtns { + // Calculate witness from circuit inputs + function calculate( + input: object, + wasmFile: string | Uint8Array, + wtnsFileName: { type: string; data?: Uint8Array } + ): Promise<{ type: string; data: Uint8Array }> + } +} + +// Narrow interface for environment detection globals +interface RestrictedEnvGlobals { + ServiceWorkerGlobalScope?: { new(): unknown } + caches?: unknown + window?: unknown + document?: unknown + HTMLRewriter?: unknown + Bun?: unknown +} + +/** + * Detect if running in a restricted environment that doesn't support Web Workers + * + * Restricted environments include: + * - Chrome MV3 Service Workers (cannot spawn nested Web Workers) + * - Cloudflare Workers + * - Bun runtime (limited Worker support) + * - SES (Secure EcmaScript) sandboxes + * - Runtimes without Worker constructor + * + * @returns true if Web Workers are not available or unreliable + */ +function isRestrictedWorkerEnvironment(): boolean { + // Early check: if Worker constructor doesn't exist, it's restricted + if (typeof Worker === 'undefined') { + return true + } + + const g = globalThis as typeof globalThis & RestrictedEnvGlobals + + // Check for Service Worker context (Chrome MV3 extensions) + if ('ServiceWorkerGlobalScope' in g && + typeof g.ServiceWorkerGlobalScope !== 'undefined' && + typeof self !== 'undefined' && + self instanceof g.ServiceWorkerGlobalScope) { + return true + } + + // Check for Cloudflare Workers (no window, has caches API, has HTMLRewriter) + if ('caches' in g && typeof g.caches !== 'undefined' && + !('window' in g) && !('document' in g)) { + // Could be Cloudflare Worker or Service Worker - check for CF-specific globals + if ('HTMLRewriter' in g && typeof g.HTMLRewriter !== 'undefined') { + return true + } + } + + // Check if Worker constructor is a stub/polyfill + // A valid Worker implementation should have standard methods on its prototype + const workerProto = Worker.prototype + if (!workerProto || typeof workerProto.postMessage !== 'function' || typeof workerProto.terminate !== 'function') { + return true // Likely a stub Worker + } + + // Check for Bun runtime (limited Worker support) + if ('Bun' in g && typeof g.Bun !== 'undefined') { + return true + } + + // Default: assume Workers are available + return false +} + +// REVIEW: Phase 10.5 - Global Configuration API (configure, getConfig, willUseSingleThread) + +/** + * Configuration options for proof generation + */ +export interface ProofGeneratorConfig { + /** + * Force single-threaded mode regardless of environment detection. + * Useful for debugging or when you know Workers won't work. + * @default undefined (auto-detect) + */ + forceSingleThread?: boolean + + /** + * Custom logger for proof generation progress + * @default undefined (no logging) + */ + logger?: { + debug?: (msg: string) => void + info?: (msg: string) => void + warn?: (msg: string) => void + error?: (msg: string) => void + } +} + +// Global configuration (can be set once for all proof operations) +let globalConfig: ProofGeneratorConfig = {} + +/** + * Configure the ProofGenerator globally + * + * @param config - Configuration options + * + * @example + * ```typescript + * // Force single-threaded mode globally + * ProofGenerator.configure({ forceSingleThread: true }) + * + * // Add logging + * ProofGenerator.configure({ + * logger: { info: console.log, error: console.error } + * }) + * ``` + */ +export function configure(config: ProofGeneratorConfig): void { + globalConfig = { ...globalConfig, ...config } +} + +/** + * Get current configuration + */ +export function getConfig(): ProofGeneratorConfig { + return { ...globalConfig } +} + +/** + * Check if proof generation will use single-threaded mode + * + * @returns true if single-threaded mode will be used + */ +export function willUseSingleThread(): boolean { + if (globalConfig.forceSingleThread !== undefined) { + return globalConfig.forceSingleThread + } + + return isRestrictedWorkerEnvironment() +} export interface ZKProof { pi_a: string[] @@ -82,11 +250,28 @@ export async function generateIdentityProof( const wasmPath = 'https://files.demos.sh/zk-circuits/v1/identity_with_merkle.wasm' const zkeyPath = 'https://files.demos.sh/zk-circuits/v1/identity_with_merkle_final.zkey' + // REVIEW: Phase 10.5 - Hybrid environment detection + // Automatically use singleThread in restricted environments (service workers, etc.) + // Use parallel workers in standard browser/Node.js for better performance + const useSingleThread = willUseSingleThread() + + if (globalConfig.logger?.info) { + globalConfig.logger.info( + `[ProofGenerator] Using ${useSingleThread ? 'single-threaded' : 'parallel'} mode` + ) + } + // REVIEW: Phase 10.1 - Production-ready proof generation using snarkjs - const { proof, publicSignals } = await snarkjs.groth16.fullProve( - circuitInputs, - wasmPath, + // Step 1: Calculate witness from circuit inputs + const wtnsBuffer = { type: 'mem' as const, data: undefined as Uint8Array | undefined } + await snarkjs.wtns.calculate(circuitInputs, wasmPath, wtnsBuffer) + + // Step 2: Generate proof using groth16.prove (supports singleThread option) + const { proof, publicSignals } = await snarkjs.groth16.prove( zkeyPath, + wtnsBuffer as { type: string; data: Uint8Array }, + globalConfig.logger, + useSingleThread ? { singleThread: true } : undefined, // proverOptions - auto-detect environment ) // Convert proof to our ZKProof format @@ -146,6 +331,7 @@ export async function verifyProof( pi_b: proof.pi_b, pi_c: proof.pi_c, protocol: proof.protocol, + curve: 'bn128', // Standard curve for Groth16 proofs } return await snarkjs.groth16.verify(vkey, publicSignals, snarkjsProof)