diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 000000000..4ba7ea3e0 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,3 @@ +[alias] +xtask = "run --package xtask --release --" +xtask-setup-blake3-groth16 = "run --package xtask --no-default-features -F cuda --release -- setup-blake3-groth16" diff --git a/.dockerignore b/.dockerignore index e4c80feec..51de2d8f7 100644 --- a/.dockerignore +++ b/.dockerignore @@ -13,4 +13,5 @@ examples crates/**/target crates/**/cache_market_x2 examples/**/target +**/target/ infra diff --git a/.github/workflows/bento.yml b/.github/workflows/bento.yml index 30b24d52c..5750cba01 100644 --- a/.github/workflows/bento.yml +++ b/.github/workflows/bento.yml @@ -85,6 +85,9 @@ jobs: with: version: ${{ env.FOUNDRY_VERSION }} + - name: Install protoc + run: sudo apt install protobuf-compiler -y + - name: Install cargo-sort uses: risc0/cargo-install@b9307573043522ab0d3e3be64a51763b765b52a4 with: diff --git a/.github/workflows/contracts.yml b/.github/workflows/contracts.yml index 48e514c45..ef748a8dc 100644 --- a/.github/workflows/contracts.yml +++ b/.github/workflows/contracts.yml @@ -182,6 +182,9 @@ jobs: risczero-version: ${{ env.RISC0_CRATE_VERSION }} toolchain-version: ${{ env.RISC0_TOOLCHAIN_VERSION }} + - name: Install protoc + run: sudo apt install protobuf-compiler -y + - name: checkout main code uses: actions/checkout@v4 with: diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bcfda834d..bf4b3aeb0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -94,6 +94,9 @@ jobs: with: version: ${{ env.FOUNDRY_VERSION }} + - name: Install protoc + run: sudo apt install protobuf-compiler -y + - name: Install cargo-sort uses: risc0/cargo-install@b9307573043522ab0d3e3be64a51763b765b52a4 with: @@ -373,6 +376,9 @@ jobs: with: version: ${{ env.FOUNDRY_VERSION }} + - name: Install protoc + run: sudo apt install protobuf-compiler -y + - name: Install cargo-sort uses: risc0/cargo-install@b9307573043522ab0d3e3be64a51763b765b52a4 with: diff --git a/.gitmodules b/.gitmodules index cc2770486..9903a039f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,9 +7,6 @@ [submodule "lib/openzeppelin-contracts-upgradeable"] path = lib/openzeppelin-contracts-upgradeable url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable -[submodule "lib/risc0-ethereum"] - path = lib/risc0-ethereum - url = https://github.com/risc0/risc0-ethereum [submodule "lib/openzeppelin-foundry-upgrades"] path = lib/openzeppelin-foundry-upgrades url = https://github.com/OpenZeppelin/openzeppelin-foundry-upgrades @@ -22,3 +19,6 @@ [submodule "lib/zkc"] path = lib/zkc url = https://github.com/boundless-xyz/zkc +[submodule "lib/risc0-ethereum"] + path = lib/risc0-ethereum + url = https://github.com/risc0/risc0-ethereum diff --git a/.vscode/settings.json b/.vscode/settings.json index b9638bb84..caa7222f5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,7 +8,9 @@ "CARGO_TARGET_DIR": "target/analyzer" }, "rust-analyzer.check.command": "clippy", - "rust-analyzer.check.extraArgs": ["--target-dir=target/analyzer"], + "rust-analyzer.check.extraArgs": [ + "--target-dir=target/analyzer" + ], "rust-analyzer.linkedProjects": [ "./Cargo.toml", "./crates/boundless-market/Cargo.toml", @@ -21,7 +23,10 @@ // "./examples/smart-contract-requestor/Cargo.toml", // "./examples/counter-with-callback/Cargo.toml" ], - "rust-analyzer.files.exclude": ["./lib/", "./contracts/out/"], + "rust-analyzer.files.exclude": [ + "./lib/", + "./contracts/out/" + ], "[javascript][javascriptreact][typescript][typescriptreact][github-actions-workflow][json][css]": { "editor.defaultFormatter": "biomejs.biome", "editor.codeActionsOnSave": { @@ -32,11 +37,13 @@ }, "biome.rename": true, "biome.enabled": true, - "cSpell.words": ["offchain"], + "cSpell.words": [ + "offchain" + ], "[typescript]": { "editor.defaultFormatter": "vscode.typescript-language-features" }, "[json]": { "editor.defaultFormatter": "vscode.json-language-features" } -} +} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index a6f5470e4..07d74efd1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,14 +21,23 @@ checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "cpp_demangle", "fallible-iterator", - "gimli", - "memmap2 0.9.8", - "object", + "gimli 0.31.1", + "memmap2 0.9.9", + "object 0.36.7", "rustc-demangle", "smallvec", "typed-arena", ] +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli 0.32.3", +] + [[package]] name = "adler2" version = "2.0.1" @@ -49,9 +58,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -64,9 +73,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17c19591d57add4f0c47922877a48aae1f47074e3433436545f8948353b3bbb" +checksum = "e01db470290bb814e0485fa79aba6e36bb5d221c2e3cfeba5fba05a8a2ca8dad" dependencies = [ "alloy-consensus", "alloy-contract", @@ -91,11 +100,11 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.2.9" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8ff73a143281cb77c32006b04af9c047a6b8fe5860e85a88ad325328965355" +checksum = "6068f356948cd84b5ad9ac30c50478e433847f14a50714d2b68f15d052724049" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "num_enum", "serde", "strum", @@ -103,12 +112,12 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a0dd3ed764953a6b20458b2b7abbfdc93d20d14b38babe1a70fe631a443a9f1" +checksum = "90d103d3e440ad6f703dd71a5b58a6abd24834563bde8a5fabe706e00242f810" dependencies = [ "alloy-eips", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", "alloy-serde", "alloy-trie 0.9.1", @@ -124,18 +133,18 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-consensus-any" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9556182afa73cddffa91e64a5aa9508d5e8c912b3a15f26998d2388a824d2c7b" +checksum = "48ead76c8c84ab3a50c31c56bc2c748c2d64357ad2131c32f9b10ab790a25e1a" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", "alloy-serde", "serde", @@ -143,16 +152,16 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b19d7092c96defc3d132ee0d8969ca1b79ef512b5eda5c66e3065266b253adf2" +checksum = "d5903097e4c131ad2dd80d87065f23c715ccb9cdb905fa169dffab8e1e798bae" dependencies = [ "alloy-consensus", "alloy-dyn-abi", "alloy-json-abi", "alloy-network", "alloy-network-primitives", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-provider", "alloy-pubsub", "alloy-rpc-types-eth", @@ -161,30 +170,30 @@ dependencies = [ "futures", "futures-util", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-core" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe6c56d58fbfa9f0f6299376e8ce33091fc6494239466814c3f54b55743cb09" +checksum = "5ca96214615ec8cf3fa2a54b32f486eb49100ca7fe7eb0b8c1137cd316e7250a" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", "alloy-sol-types", ] [[package]] name = "alloy-dyn-abi" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f56873f3cac7a2c63d8e98a4314b8311aa96adb1a0f82ae923eb2119809d2c" +checksum = "3fdff496dd4e98a81f4861e66f7eaf5f2488971848bb42d9c892f871730245c8" dependencies = [ "alloy-json-abi", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-sol-type-parser", "alloy-sol-types", "itoa", @@ -199,47 +208,49 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", "crc", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-eip2930" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" +checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", + "borsh", "serde", ] [[package]] name = "alloy-eip7702" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d4769c6ffddca380b0070d71c8b7f30bed375543fe76bb2f74ec0acf4b7cd16" +checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", + "borsh", "k256 0.13.4", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-eips" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305fa99b538ca7006b0c03cfed24ec6d82beda67aac857ef4714be24231d15e6" +checksum = "7bdbec74583d0067798d77afa43d58f00d93035335d7ceaa5d3f93857d461bb9" dependencies = [ "alloy-eip2124", "alloy-eip2930", "alloy-eip7702", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", "alloy-serde", "auto_impl", @@ -249,7 +260,7 @@ dependencies = [ "serde", "serde_with", "sha2 0.10.9", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -260,8 +271,8 @@ checksum = "0dbe7c66c859b658d879b22e8aaa19546dab726b0639f4649a424ada3d99349e" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-hardforks 0.3.0", - "alloy-primitives 1.3.1", + "alloy-hardforks 0.3.5", + "alloy-primitives 1.4.1", "alloy-rpc-types-eth", "alloy-sol-types", "auto_impl", @@ -269,17 +280,17 @@ dependencies = [ "op-alloy-consensus", "op-revm", "revm", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-genesis" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a272533715aefc900f89d51db00c96e6fd4f517ea081a12fea482a352c8c815c" +checksum = "c25d5acb35706e683df1ea333c862bdb6b7c5548836607cd5bb56e501cca0b4f" dependencies = [ "alloy-eips", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-serde", "alloy-trie 0.9.1", "serde", @@ -294,31 +305,31 @@ checksum = "3165210652f71dfc094b051602bafd691f506c54050a174b1cba18fb5ef706a3" dependencies = [ "alloy-chains", "alloy-eip2124", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "auto_impl", "dyn-clone", ] [[package]] name = "alloy-hardforks" -version = "0.3.0" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20b180071d4f22db71702329101685ccff2e2a8f400d30a68ba907700163bf5" +checksum = "889eb3949b58368a09d4f16931c660275ef5fb08e5fbd4a96573b19c7085c41f" dependencies = [ "alloy-chains", "alloy-eip2124", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "auto_impl", "dyn-clone", ] [[package]] name = "alloy-json-abi" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "125a1c373261b252e53e04d6e92c37d881833afc1315fceab53fd46045695640" +checksum = "5513d5e6bd1cba6bdcf5373470f559f320c05c8c59493b6e98912fbe6733943f" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-sol-type-parser", "serde", "serde_json", @@ -326,31 +337,31 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91676d242c0ced99c0dd6d0096d7337babe9457cc43407d26aa6367fcf90553" +checksum = "31b67c5a702121e618217f7a86f314918acb2622276d0273490e2d4534490bc0" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-sol-types", "http 1.3.1", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", ] [[package]] name = "alloy-network" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77f82150116b30ba92f588b87f08fa97a46a1bd5ffc0d0597efdf0843d36bfda" +checksum = "612296e6b723470bb1101420a73c63dfd535aa9bf738ce09951aedbd4ab7292e" dependencies = [ "alloy-consensus", "alloy-consensus-any", "alloy-eips", "alloy-json-rpc", "alloy-network-primitives", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rpc-types-any", "alloy-rpc-types-eth", "alloy-serde", @@ -362,39 +373,39 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-network-primitives" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "223612259a080160ce839a4e5df0125ca403a1d5e7206cc911cea54af5d769aa" +checksum = "a0e7918396eecd69d9c907046ec8a93fb09b89e2f325d5e7ea9c4e3929aa0dd2" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-serde", "serde", ] [[package]] name = "alloy-node-bindings" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3652a65bacfba0a169755090d4ecd7d3c63fa534b21d09b8e604dc2609760da6" +checksum = "0be31900cc96fede4dc888a100f3c28fa2d22093f8e09fb7992829ce886acc2f" dependencies = [ "alloy-genesis", "alloy-hardforks 0.2.13", "alloy-network", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-signer", "alloy-signer-local", "k256 0.13.4", "rand 0.8.5", "serde_json", "tempfile", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", "url", ] @@ -423,18 +434,18 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc9485c56de23438127a731a6b4c87803d49faf1a7068dcd1d8768aca3a9edb9" +checksum = "355bf68a433e0fd7f7d33d5a9fc2583fde70bf5c530f63b80845f8da5505cf28" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", "derive_more 2.0.1", - "foldhash", - "hashbrown 0.15.5", - "indexmap 2.11.0", + "foldhash 0.2.0", + "hashbrown 0.16.0", + "indexmap 2.12.0", "itoa", "k256 0.13.4", "keccak-asm", @@ -442,7 +453,7 @@ dependencies = [ "proptest", "rand 0.9.2", "ruint", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "sha3", "tiny-keccak", @@ -450,9 +461,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7283b81b6f136100b152e699171bc7ed8184a58802accbc91a7df4ebb944445" +checksum = "55c1313a527a2e464d067c031f3c2ec073754ef615cc0eabca702fd0fe35729c" dependencies = [ "alloy-chains", "alloy-consensus", @@ -461,7 +472,7 @@ dependencies = [ "alloy-network", "alloy-network-primitives", "alloy-node-bindings", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-pubsub", "alloy-rpc-client", "alloy-rpc-types-anvil", @@ -483,12 +494,12 @@ dependencies = [ "futures", "futures-utils-wasm", "lru 0.13.0", - "parking_lot 0.12.4", + "parking_lot 0.12.5", "pin-project", "reqwest", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", "url", @@ -497,17 +508,17 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee7e3d343814ec0dfea69bd1820042a133a9d0b9ac5faf1e6eb133b43366315" +checksum = "810766eeed6b10ffa11815682b3f37afc5019809e3b470b23555297d5770ce63" dependencies = [ "alloy-json-rpc", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-transport", "auto_impl", "bimap", "futures", - "parking_lot 0.12.4", + "parking_lot 0.12.5", "serde", "serde_json", "tokio", @@ -536,17 +547,17 @@ checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "alloy-rpc-client" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1154b12d470bef59951c62676e106f4ce5de73b987d86b9faa935acebb138ded" +checksum = "45f802228273056528dfd6cc8845cc91a7c7e0c6fc1a66d19e8673743dacdc7e" dependencies = [ "alloy-json-rpc", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-pubsub", "alloy-transport", "alloy-transport-http", @@ -567,11 +578,11 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47ab76bf97648a1c6ad8fb00f0d594618942b5a9e008afbfb5c8a8fca800d574" +checksum = "33ff3df608dcabd6bdd197827ff2b8faaa6cefe0c462f7dc5e74108666a01f56" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rpc-types-anvil", "alloy-rpc-types-debug", "alloy-rpc-types-engine", @@ -584,11 +595,11 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456cfc2c1677260edbd7ce3eddb7de419cb46de0e9826c43401f42b0286a779a" +checksum = "ac2bc988d7455e02dfb53460e1caa61f932b3f8452e12424e68ba8dcf60bba90" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rpc-types-eth", "alloy-serde", "serde", @@ -596,9 +607,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cc57ee0c1ac9fb14854195fc249494da7416591dc4a4d981ddfd5dd93b9bce" +checksum = "cdbf6d1766ca41e90ac21c4bc5cbc5e9e965978a25873c3f90b3992d905db4cb" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -607,11 +618,11 @@ dependencies = [ [[package]] name = "alloy-rpc-types-debug" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ac29dd005c33e3f7e09087accc80843315303685c3f7a1b888002cd27785b" +checksum = "977698b458738369ba5ca645d2cdb4d51ba07a81db37306ff85322853161ea3a" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "derive_more 2.0.1", "serde", "serde_with", @@ -619,13 +630,13 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9d173854879bcf26c7d71c1c3911972a3314df526f4349ffe488e676af577d" +checksum = "07da696cc7fbfead4b1dda8afe408685cae80975cbb024f843ba74d9639cd0d3" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", "alloy-serde", "derive_more 2.0.1", @@ -637,15 +648,15 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7d47bca1a2a1541e4404aa38b7e262bb4dffd9ac23b4f178729a4ddc5a5caa" +checksum = "a15e4831b71eea9d20126a411c1c09facf1d01d5cac84fd51d532d3c429cfc26" dependencies = [ "alloy-consensus", "alloy-consensus-any", "alloy-eips", "alloy-network-primitives", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", "alloy-serde", "alloy-sol-types", @@ -653,30 +664,30 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-rpc-types-trace" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c331c8e48665607682e8a9549a2347c13674d4fbcbdc342e7032834eba2424f4" +checksum = "fb0c800e2ce80829fca1491b3f9063c29092850dc6cf19249d5f678f0ce71bb0" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rpc-types-eth", "alloy-serde", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-rpc-types-txpool" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2f66afe1e76ca4485e593980056f061b2bdae2055486a062fca050ff111a52" +checksum = "2f82e3068673a3cf93fbbc2f60a59059395cd54bbe39af895827faa5e641cc8f" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rpc-types-eth", "alloy-serde", "serde", @@ -684,84 +695,84 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8468f1a7f9ee3bae73c24eead0239abea720dbf7779384b9c7e20d51bfb6b0" +checksum = "751d1887f7d202514a82c5b3caf28ee8bd4a2ad9549e4f498b6f0bff99b52add" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "serde", "serde_json", ] [[package]] name = "alloy-signer" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33387c90b0a5021f45a5a77c2ce6c49b8f6980e66a318181468fb24cea771670" +checksum = "9cf0b42ffbf558badfecf1dde0c3c5ed91f29bb7e97876d0bed008c3d5d67171" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "async-trait", "auto_impl", "either", "elliptic-curve 0.13.8", "k256 0.13.4", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-signer-local" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55d9e795c85e36dcea08786d2e7ae9b73cb554b6bea6ac4c212def24e1b4d03" +checksum = "3e7d555ee5f27be29af4ae312be014b57c6cff9acb23fe2cf008500be6ca7e33" dependencies = [ "alloy-consensus", "alloy-network", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-signer", "async-trait", "k256 0.13.4", "rand 0.8.5", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-sol-macro" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20d867dcf42019d4779519a1ceb55eba8d7f3d0e4f0a89bcba82b8f9eb01e48" +checksum = "f3ce480400051b5217f19d6e9a82d9010cdde20f1ae9c00d53591e4a1afbb312" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "alloy-sol-macro-expander" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b74e91b0b553c115d14bd0ed41898309356dc85d0e3d4b9014c4e7715e48c8ad" +checksum = "6d792e205ed3b72f795a8044c52877d2e6b6e9b1d13f431478121d8d4eaa9028" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", "const-hex", "heck 0.5.0", - "indexmap 2.11.0", + "indexmap 2.12.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84194d31220803f5f62d0a00f583fd3a062b36382e2bea446f1af96727754565" +checksum = "0bd1247a8f90b465ef3f1207627547ec16940c35597875cdc09c49d58b19693c" dependencies = [ "alloy-json-abi", "const-hex", @@ -771,15 +782,15 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.106", + "syn 2.0.110", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe8c27b3cf6b2bb8361904732f955bc7c05e00be5f469cec7e2280b6167f3ff0" +checksum = "954d1b2533b9b2c7959652df3076954ecb1122a28cc740aa84e7b0a49f6ac0a9" dependencies = [ "serde", "winnow", @@ -787,33 +798,32 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5383d34ea00079e6dd89c652bcbdb764db160cef84e6250926961a0b2295d04" +checksum = "70319350969a3af119da6fb3e9bddb1bce66c9ea933600cb297c8b1850ad2a3c" dependencies = [ "alloy-json-abi", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-sol-macro", "serde", ] [[package]] name = "alloy-transport" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702002659778d89a94cd4ff2044f6b505460df6c162e2f47d1857573845b0ace" +checksum = "71b3deee699d6f271eab587624a9fa84d02d0755db7a95a043d52a6488d16ebe" dependencies = [ "alloy-json-rpc", - "alloy-primitives 1.3.1", "auto_impl", "base64 0.22.1", "derive_more 2.0.1", "futures", "futures-utils-wasm", - "parking_lot 0.12.4", + "parking_lot 0.12.5", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tower 0.5.2", "tracing", @@ -823,9 +833,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6bdc0830e5e8f08a4c70a4c791d400a86679c694a3b4b986caf26fad680438" +checksum = "1720bd2ba8fe7e65138aca43bb0f680e4e0bcbd3ca39bf9d3035c9d7d2757f24" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -838,9 +848,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ce41d99a32346f354725fe62eadd271cdbae45fe6b3cc40cb054e0bf763112" +checksum = "ea89c214c7ddd2bcad100da929d6b642bbfed85788caf3b1be473abacd3111f9" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -858,15 +868,15 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686219dcef201655763bd3d4eabe42388d9368bfbf6f1c8016d14e739ec53aac" +checksum = "571aadf0afce0d515a28b2c6352662a39cb9f48b4eeff9a5c34557d6ea126730" dependencies = [ "alloy-pubsub", "alloy-transport", "futures", "http 1.3.1", - "rustls 0.23.31", + "rustls 0.23.35", "serde_json", "tokio", "tokio-tungstenite 0.26.2", @@ -880,7 +890,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "983d99aa81f586cef9dae38443245e585840fcf0fc58b09aee0b1f27aed1d500" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", "arrayvec", "derive_more 2.0.1", @@ -896,11 +906,11 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3412d52bb97c6c6cc27ccc28d4e6e8cf605469101193b50b0bd5813b1f990b5" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", "arrayvec", "derive_more 2.0.1", - "nybbles 0.4.3", + "nybbles 0.4.6", "serde", "smallvec", "tracing", @@ -908,23 +918,16 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.38" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bf39928a5e70c9755d6811a2928131b53ba785ad37c8bf85c90175b5d43b818" +checksum = "cd7ce8ed34106acd6e21942022b6a15be6454c2c3ead4d76811d3bdcd63cf771" dependencies = [ - "alloy-primitives 1.3.1", "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -936,9 +939,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -951,9 +954,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -986,9 +989,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" dependencies = [ "backtrace", ] @@ -1065,7 +1068,7 @@ checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -1174,7 +1177,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -1212,7 +1215,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -1316,7 +1319,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -1432,6 +1435,22 @@ dependencies = [ "tempfile", ] +[[package]] +name = "astral-tokio-tar" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec179a06c1769b1e42e1e2cbe74c7dcdb3d6383c838454d063eaac5bbb7ebbe5" +dependencies = [ + "filetime", + "futures-core", + "libc", + "portable-atomic", + "rustc-hash", + "tokio", + "tokio-stream", + "xattr", +] + [[package]] name = "async-attributes" version = "1.1.2" @@ -1465,6 +1484,19 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-compression" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e86f6d3dc9dc4352edeea6b8e499e13e3f5dc3b964d7ca5fd411415a3498473" +dependencies = [ + "compression-codecs", + "compression-core", + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-executor" version = "1.13.3" @@ -1496,20 +1528,20 @@ dependencies = [ [[package]] name = "async-io" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "async-lock", + "autocfg", "cfg-if", "concurrent-queue", "futures-io", "futures-lite", "parking", "polling", - "rustix 1.0.8", + "rustix 1.1.2", "slab", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1534,9 +1566,9 @@ dependencies = [ [[package]] name = "async-process" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ "async-channel 2.5.0", "async-io", @@ -1547,14 +1579,14 @@ dependencies = [ "cfg-if", "event-listener 5.4.1", "futures-lite", - "rustix 1.0.8", + "rustix 1.1.2", ] [[package]] name = "async-signal" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ "async-io", "async-lock", @@ -1562,10 +1594,10 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 1.0.8", + "rustix 1.1.2", "signal-hook-registry", "slab", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1615,7 +1647,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -1632,7 +1664,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -1699,7 +1731,7 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -1710,9 +1742,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.8.6" +version = "1.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bc1b40fb26027769f16960d2f4a6bc20c4bb755d403e552c8c1a73af433c246" +checksum = "1856b1b48b65f71a4dd940b1c0931f9a7b646d4a924b9828ffefc1454714668a" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1740,9 +1772,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.6" +version = "1.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d025db5d9f52cbc413b167136afb3d8aeea708c0d8884783cf6253be5e22f6f2" +checksum = "86590e57ea40121d47d3f2e131bfd873dea15d78dc2f4604f4734537ad9e56c4" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -1752,9 +1784,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.13.3" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" +checksum = "879b6c89592deb404ba4dc0ae6b58ffd1795c78991cbb5b8bc441c48a070440d" dependencies = [ "aws-lc-sys", "zeroize", @@ -1762,11 +1794,11 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.30.0" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" +checksum = "107a4e9d9cab9963e04e84bb8dee0e25f2a987f9a8bad5ed054abd439caa8f8c" dependencies = [ - "bindgen 0.69.5", + "bindgen", "cc", "cmake", "dunce", @@ -1775,9 +1807,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.10" +version = "1.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c034a1bc1d70e16e7f4e4caf7e9f7693e4c9c24cd91cf17c2a0b21abaebc7c8b" +checksum = "8fe0fd441565b0b318c76e7206c8d1d0b0166b3e986cf30e890b61feb6192045" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -1800,9 +1832,9 @@ dependencies = [ [[package]] name = "aws-sdk-cloudwatch" -version = "1.89.0" +version = "1.97.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82bb07ec590346dd4cb09ae7f634d20cdca59d5a0443f2f2750c15ea5e98b2f4" +checksum = "7e87388c13664e4e17a924d7971f3cfd98bcf2cdec22069c04d48e150878b71b" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1826,9 +1858,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.104.0" +version = "1.112.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c488cd6abb0ec9811c401894191932e941c5f91dc226043edacd0afa1634bc" +checksum = "eee73a27721035c46da0572b390a69fbdb333d0177c24f3d8f7ff952eeb96690" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1860,9 +1892,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.83.0" +version = "1.89.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cd43af212d2a1c4dedff6f044d7e1961e5d9e7cfe773d70f31d9842413886" +checksum = "a9c1b1af02288f729e95b72bd17988c009aa72e26dcb59b3200f86d7aea726c9" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1882,9 +1914,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.84.0" +version = "1.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20ec4a95bd48e0db7a424356a161f8d87bd6a4f0af37204775f0da03d9e39fc3" +checksum = "4e8122301558dc7c6c68e878af918880b82ff41897a60c8c4e18e4dc4d93e9f1" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1904,9 +1936,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.85.0" +version = "1.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "410309ad0df4606bc721aff0d89c3407682845453247213a0ccc5ff8801ee107" +checksum = "8f8090151d4d1e971269957b10dbf287bba551ab812e591ce0516b1c73b75d27" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1927,9 +1959,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.3.4" +version = "1.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084c34162187d39e3740cb635acd73c4e3a551a36146ad6fe8883c929c9f876c" +checksum = "c35452ec3f001e1f2f6db107b6373f1f48f05ec63ba2c5c9fa91f07dad32af11" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", @@ -1955,9 +1987,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.5" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c" +checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" dependencies = [ "futures-util", "pin-project-lite", @@ -1966,9 +1998,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.63.8" +version = "0.63.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d2df0314b8e307995a3b86d44565dfe9de41f876901a7d71886c756a25979f" +checksum = "95bd108f7b3563598e4dc7b62e1388c9982324a2abd622442167012690184591" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -1986,9 +2018,9 @@ dependencies = [ [[package]] name = "aws-smithy-compression" -version = "0.0.4" +version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceb9b25cf3a8b10ae5c3cf6490488c092871b120a01256af387c51c2eeace313" +checksum = "f29ef43748637ea19e0d264ad38da275af1aa28a14aa5f7e9ed29c790473768f" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", @@ -2003,9 +2035,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.11" +version = "0.60.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "182b03393e8c677347fb5705a04a9392695d47d20ef0a2f8cfe28c8e6b9b9778" +checksum = "e29a304f8319781a39808847efb39561351b1bb76e933da7aa90232673638658" dependencies = [ "aws-smithy-types", "bytes", @@ -2014,9 +2046,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.3" +version = "0.62.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c4dacf2d38996cf729f55e7a762b30918229917eca115de45dfa8dfb97796c9" +checksum = "445d5d720c99eed0b4aa674ed00d835d9b1427dd73e04adaf2f94c6b2d6f9fca" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -2024,6 +2056,7 @@ dependencies = [ "bytes", "bytes-utils", "futures-core", + "futures-util", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", @@ -2035,9 +2068,9 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.1.1" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147e8eea63a40315d704b97bf9bc9b8c1402ae94f89d5ad6f7550d963309da1b" +checksum = "623254723e8dfd535f566ee7b2381645f8981da086b5c4aa26c0c41582bb1d2c" dependencies = [ "aws-smithy-async", "aws-smithy-protocol-test", @@ -2055,43 +2088,43 @@ dependencies = [ "hyper-rustls 0.24.2", "hyper-rustls 0.27.7", "hyper-util", - "indexmap 2.11.0", + "indexmap 2.12.0", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.31", - "rustls-native-certs 0.8.1", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", "rustls-pki-types", "serde", "serde_json", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tower 0.5.2", "tracing", ] [[package]] name = "aws-smithy-json" -version = "0.61.5" +version = "0.61.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa31b350998e703e9826b2104dd6f63be0508666e1aba88137af060e8944047" +checksum = "2db31f727935fc63c6eeae8b37b438847639ec330a9161ece694efba257e0c54" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9364d5989ac4dd918e5cc4c4bdcc61c9be17dcd2586ea7f69e348fc7c6cab393" +checksum = "2d1881b1ea6d313f9890710d65c158bdab6fb08c91ea825f74c1c8c357baf4cc" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-protocol-test" -version = "0.63.4" +version = "0.63.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2116be0e3a8e18771b126f8eb69901b2780fbe12b1890370cb1c462337d13b" +checksum = "fa808d23a8edf0da73f6812d06d8c0a48d70f05d2d3696362982aad11ee475b7" dependencies = [ "assert-json-diff", "aws-smithy-runtime-api", @@ -2103,14 +2136,14 @@ dependencies = [ "regex-lite", "roxmltree", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "aws-smithy-query" -version = "0.60.7" +version = "0.60.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fbd61ceb3fe8a1cb7352e42689cec5335833cd9f94103a61e98f9bb61c64bb" +checksum = "d28a63441360c477465f80c7abac3b9c4d075ca638f982e605b7dc2a2c7156c9" dependencies = [ "aws-smithy-types", "urlencoding", @@ -2118,9 +2151,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.9.1" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3946acbe1ead1301ba6862e712c7903ca9bb230bdf1fbd1b5ac54158ef2ab1f" +checksum = "0bbe9d018d646b96c7be063dd07987849862b0e6d07c778aad7d93d1be6c1ef0" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -2142,9 +2175,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.9.0" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07f5e0fc8a6b3f2303f331b94504bbf754d85488f402d6f1dd7a6080f99afe56" +checksum = "ec7204f9fd94749a7c53b26da1b961b4ac36bf070ef1e0b94bb09f79d4f6c193" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -2159,9 +2192,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.2" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d498595448e43de7f4296b7b7a18a8a02c61ec9349128c80a368f7c3b4ab11a8" +checksum = "25f535879a207fce0db74b679cfc3e91a3159c8144d717d55f5832aea9eef46e" dependencies = [ "base64-simd", "bytes", @@ -2185,18 +2218,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.10" +version = "0.60.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db87b96cb1b16c024980f133968d52882ca0daaee3a086c6decc500f6c99728" +checksum = "eab77cdd036b11056d2a30a7af7b775789fb024bf216acc13884c6c97752ae56" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.8" +version = "1.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b069d19bf01e46298eaedd7c6f283fe565a59263e53eebec945f3e6398f42390" +checksum = "d79fb68e3d7fe5d4833ea34dc87d2e97d26d3086cb3da660bb6b1f76d98680b6" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -2259,11 +2292,11 @@ dependencies = [ [[package]] name = "axum" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" +checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871" dependencies = [ - "axum-core 0.5.2", + "axum-core 0.5.5", "base64 0.22.1", "bytes", "form_urlencoded", @@ -2279,15 +2312,14 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rustversion", - "serde", + "serde_core", "serde_json", "serde_path_to_error", "serde_urlencoded", "sha1", "sync_wrapper", "tokio", - "tokio-tungstenite 0.26.2", + "tokio-tungstenite 0.28.0", "tower 0.5.2", "tower-layer", "tower-service", @@ -2317,9 +2349,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" dependencies = [ "bytes", "futures-core", @@ -2328,7 +2360,6 @@ dependencies = [ "http-body-util", "mime", "pin-project-lite", - "rustversion", "sync_wrapper", "tower-layer", "tower-service", @@ -2343,7 +2374,7 @@ checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2354,17 +2385,17 @@ checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ - "addr2line", + "addr2line 0.25.1", "cfg-if", "libc", "miniz_oxide", - "object", + "object 0.37.3", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -2439,36 +2470,13 @@ dependencies = [ "serde", ] -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags 2.9.4", - "cexpr", - "clang-sys", - "itertools 0.11.0", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.106", - "which", -] - [[package]] name = "bindgen" version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -2477,9 +2485,9 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash 2.1.1", + "rustc-hash", "shlex", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2536,11 +2544,11 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -2565,6 +2573,50 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "blake3_groth16" +version = "1.2.0" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ff 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "bincode", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", + "borsh", + "boundless-market", + "circom-witnesscalc", + "guest-util", + "hex", + "num-bigint 0.4.6", + "num-traits", + "risc0-groth16", + "risc0-groth16-sys", + "risc0-zkp", + "risc0-zkvm", + "serde", + "serde_json", + "tempfile", + "test-log", + "tokio", + "tracing", + "wtns-file", +] + [[package]] name = "block" version = "0.1.6" @@ -2604,9 +2656,9 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" +checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" dependencies = [ "cc", "glob", @@ -2624,7 +2676,19 @@ dependencies = [ "maybe-async", "reqwest", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", +] + +[[package]] +name = "bonsai-sdk" +version = "1.4.1" +source = "git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2#6ed3f0321638ae7eb9c097b8aa8becba3f4b1350" +dependencies = [ + "duplicate", + "maybe-async", + "reqwest", + "serde", + "thiserror 2.0.17", "tokio", ] @@ -2645,10 +2709,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" dependencies = [ "once_cell", - "proc-macro-crate 3.3.0", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -2656,7 +2720,7 @@ name = "boundless-assessor" version = "1.2.0" dependencies = [ "alloy", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-sol-types", "boundless-market", "guest-assessor", @@ -2665,7 +2729,7 @@ dependencies = [ "risc0-zkvm", "serde", "test-log", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", ] @@ -2708,7 +2772,8 @@ dependencies = [ "assert_fs", "atomicwrites", "bincode", - "bonsai-sdk", + "blake3_groth16", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", "boundless-assessor", "boundless-market", "boundless-povw", @@ -2746,7 +2811,7 @@ dependencies = [ "tokio", "tokio-test", "toml 0.8.23", - "toml_edit", + "toml_edit 0.22.27", "tracing", "tracing-subscriber 0.3.20", "tracing-test", @@ -2805,7 +2870,7 @@ dependencies = [ "sqlx", "tempfile", "test-log", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", "tracing-subscriber 0.3.20", @@ -2819,12 +2884,14 @@ version = "1.2.0" dependencies = [ "alloy", "alloy-chains", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-sol-types", "anyhow", "async-stream", "async-trait", "aws-sdk-s3", + "blake3", + "borsh", "boundless-test-utils", "bytemuck", "chrono", @@ -2838,6 +2905,7 @@ dependencies = [ "rand 0.9.2", "reqwest", "risc0-aggregation", + "risc0-binfmt", "risc0-circuit-recursion", "risc0-ethereum-contracts", "risc0-zkvm", @@ -2847,7 +2915,7 @@ dependencies = [ "sha2 0.10.9", "siwe", "tempfile", - "thiserror 2.0.16", + "thiserror 2.0.17", "time", "tokio", "tokio-tungstenite 0.24.0", @@ -2886,7 +2954,7 @@ dependencies = [ "alloy", "alloy-chains", "alloy-contract", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-provider", "alloy-signer", "alloy-sol-types", @@ -2944,7 +3012,7 @@ dependencies = [ "risc0-ethereum-contracts", "risc0-zkvm", "sqlx", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", "tracing-subscriber 0.3.20", @@ -2957,10 +3025,11 @@ name = "boundless-test-utils" version = "1.2.0" dependencies = [ "alloy", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-sol-types", "anyhow", "bincode", + "blake3_groth16", "boundless-market", "boundless-povw", "boundless-zkc", @@ -3020,7 +3089,8 @@ dependencies = [ "aws-sdk-s3", "aws-smithy-http-client", "bincode", - "bonsai-sdk", + "blake3_groth16", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", "boundless-assessor", "boundless-market", "boundless-test-utils", @@ -3037,6 +3107,8 @@ dependencies = [ "httpmock", "moka", "notify", + "num-bigint 0.4.6", + "num-traits", "proptest", "proptest-derive", "rand 0.9.2", @@ -3046,6 +3118,7 @@ dependencies = [ "reqwest-retry", "risc0-aggregation", "risc0-ethereum-contracts", + "risc0-groth16", "risc0-zkvm", "serde", "serde_json", @@ -3054,7 +3127,8 @@ dependencies = [ "sqlx", "temp-env", "tempfile", - "thiserror 2.0.16", + "test-log", + "thiserror 2.0.17", "tokio", "tokio-util", "toml 0.8.23", @@ -3072,7 +3146,7 @@ version = "1.2.0" dependencies = [ "alloy", "anyhow", - "axum 0.8.4", + "axum 0.8.6", "boundless-market", "boundless-test-utils", "broker", @@ -3105,9 +3179,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" dependencies = [ "memchr", "regex-automata", @@ -3134,22 +3208,22 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "bytemuck" -version = "1.23.2" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.10.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -3179,9 +3253,9 @@ dependencies = [ [[package]] name = "c-kzg" -version = "2.1.1" +version = "2.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" +checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" dependencies = [ "blst", "cc", @@ -3221,11 +3295,11 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.12" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0b03af37dad7a14518b7691d81acb0f8222604ad3d1b02f6b4bed5188c0cd5" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -3245,10 +3319,10 @@ checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" dependencies = [ "camino", "cargo-platform", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -3272,9 +3346,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.35" +version = "1.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "590f9024a68a8c40351881787f1934dc11afd69090f5edb6831464694d836ea3" +checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" dependencies = [ "find-msvc-tools", "jobserver", @@ -3293,9 +3367,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -3305,17 +3379,16 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -3355,11 +3428,11 @@ dependencies = [ "ark-bn254", "ark-ff 0.5.0", "ark-serialize 0.5.0", - "bindgen 0.72.1", + "bindgen", "byteorder", "indicatif", "libc", - "memmap2 0.9.8", + "memmap2 0.9.9", "num-bigint 0.4.6", "num-traits", "prost", @@ -3369,7 +3442,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "thiserror 2.0.16", + "thiserror 2.0.17", "winnow", "wtns-file", ] @@ -3387,9 +3460,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.47" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" +checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" dependencies = [ "clap_builder", "clap_derive", @@ -3397,9 +3470,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.47" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" +checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" dependencies = [ "anstream", "anstyle", @@ -3409,30 +3482,30 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.57" +version = "4.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d9501bd3f5f09f7bbee01da9a511073ed30a80cd7a509f1214bb74eadea71ad" +checksum = "8e602857739c5a4291dfa33b5a298aeac9006185229a700e5810a3ef7272d971" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.5.47" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "clap_lex" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "cmake" @@ -3449,7 +3522,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -3468,6 +3541,22 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "compression-codecs" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302266479cb963552d11bd042013a58ef1adc56768016c8b82b4199488f2d4ad" +dependencies = [ + "compression-core", + "liblzma", +] + +[[package]] +name = "compression-core" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -3486,21 +3575,20 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width 0.2.1", + "unicode-width 0.2.2", "windows-sys 0.59.0", ] [[package]] name = "const-hex" -version = "1.15.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dccd746bf9b1038c0507b7cec21eb2b11222db96a2902c96e8c185d6d20fb9c4" +checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" dependencies = [ "cfg-if", "cpufeatures", - "hex", "proptest", - "serde", + "serde_core", ] [[package]] @@ -3511,9 +3599,9 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_format" -version = "0.2.34" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" dependencies = [ "const_format_proc_macros", ] @@ -3529,6 +3617,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "convert_case" version = "0.4.0" @@ -3592,9 +3686,9 @@ dependencies = [ [[package]] name = "cpp_demangle" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" +checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" dependencies = [ "cfg-if", ] @@ -3625,15 +3719,15 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc-fast" -version = "1.3.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf62af4cc77d8fe1c22dde4e721d87f2f54056139d8c412e1366b740305f56f" +checksum = "6ddc2d09feefeee8bd78101665bd8645637828fa9317f9f292496dbbd8c65ff3" dependencies = [ "crc", "digest 0.10.7", - "libc", "rand 0.9.2", "regex", + "rustversion", ] [[package]] @@ -3704,7 +3798,7 @@ dependencies = [ "crossterm_winapi", "libc", "mio 0.8.11", - "parking_lot 0.12.4", + "parking_lot 0.12.5", "signal-hook", "signal-hook-mio", "winapi", @@ -3761,21 +3855,21 @@ dependencies = [ [[package]] name = "csv" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" dependencies = [ "csv-core", "itoa", "ryu", - "serde", + "serde_core", ] [[package]] name = "csv-core" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" dependencies = [ "memchr", ] @@ -3857,7 +3951,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -3872,7 +3966,7 @@ dependencies = [ "quote", "serde", "strsim", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -3883,7 +3977,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -3894,7 +3988,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -3908,7 +4002,7 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.11", + "parking_lot_core 0.9.12", ] [[package]] @@ -3958,12 +4052,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -3985,7 +4079,7 @@ checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -3996,7 +4090,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -4017,7 +4111,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -4027,7 +4121,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -4040,7 +4134,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -4061,7 +4155,7 @@ dependencies = [ "convert_case 0.7.1", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", "unicode-xid", ] @@ -4156,7 +4250,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -4178,14 +4272,14 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "doc-comment" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" [[package]] name = "docker-generate" @@ -4233,9 +4327,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "duplicate" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97af9b5f014e228b33e77d75ee0e6e87960124f0f4b16337b586a6bec91867b1" +checksum = "8e92f10a49176cbffacaedabfaa11d51db1ea0f80a83c26e1873b43cd1742c24" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -4284,7 +4378,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -4423,27 +4517,27 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "enum-ordinalize" -version = "4.3.0" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" dependencies = [ "enum-ordinalize-derive", ] [[package]] name = "enum-ordinalize-derive" -version = "4.3.1" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -4454,14 +4548,14 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "env_filter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" dependencies = [ "log", ] @@ -4486,22 +4580,23 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.6" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" dependencies = [ "serde", + "serde_core", "typeid", ] [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -4652,9 +4747,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.0" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e178e4fba8a2726903f6ba98a6d221e76f9c12c650d5dc0e6afdc50677b49650" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" [[package]] name = "find_cuda_helper" @@ -4683,11 +4778,17 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "libz-rs-sys", @@ -4726,6 +4827,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "foreign-types" version = "0.3.2" @@ -4753,7 +4860,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -4848,7 +4955,7 @@ checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" dependencies = [ "futures-core", "lock_api", - "parking_lot 0.12.4", + "parking_lot 0.12.5", ] [[package]] @@ -4878,7 +4985,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -4937,11 +5044,11 @@ dependencies = [ [[package]] name = "gdbstub" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b686b198dfaa4109ebd0443d2841bc521e4b4b2915f1d84b3bb50332a8cdc1ae" +checksum = "72742d2b395902caf8a5d520d0dd3334ba6d1138938429200e58d5174e275f3f" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "log", "managed", @@ -4959,25 +5066,11 @@ dependencies = [ "num-traits", ] -[[package]] -name = "generator" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" -dependencies = [ - "cc", - "cfg-if", - "libc", - "log", - "rustversion", - "windows", -] - [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -4993,21 +5086,21 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.3+wasi-0.2.4", + "wasip2", "wasm-bindgen", ] @@ -5018,17 +5111,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" dependencies = [ "fallible-iterator", - "indexmap 2.11.0", + "indexmap 2.12.0", "stable_deref_trait", ] +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + [[package]] name = "git2" version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libc", "libgit2-sys", "log", @@ -5052,9 +5151,9 @@ checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "globset" -version = "0.4.16" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" dependencies = [ "aho-corasick", "bstr", @@ -5069,7 +5168,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "ignore", "walkdir", ] @@ -5088,9 +5187,9 @@ dependencies = [ [[package]] name = "gmp-mpfr-sys" -version = "1.6.7" +version = "1.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a636fb6a653382a379ee1e5593dacdc628667994167024c143214cafd40c1a86" +checksum = "60f8970a75c006bb2f8ae79c6768a116dd215fa8346a87aed99bf9d82ca43394" dependencies = [ "libc", "windows-sys 0.60.2", @@ -5157,7 +5256,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.11.0", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -5176,7 +5275,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.11.0", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -5185,12 +5284,13 @@ dependencies = [ [[package]] name = "half" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", + "zerocopy", ] [[package]] @@ -5225,7 +5325,16 @@ checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +dependencies = [ + "foldhash 0.2.0", "serde", ] @@ -5275,9 +5384,6 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] [[package]] name = "hex-conservative" @@ -5314,11 +5420,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5554,13 +5660,13 @@ dependencies = [ "http 1.3.1", "hyper 1.7.0", "hyper-util", - "rustls 0.23.31", - "rustls-native-certs 0.8.1", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 1.0.2", + "webpki-roots 1.0.4", ] [[package]] @@ -5581,9 +5687,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "base64 0.22.1", "bytes", @@ -5597,7 +5703,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.0", + "socket2 0.6.1", "system-configuration", "tokio", "tower-service", @@ -5607,9 +5713,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -5631,9 +5737,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", @@ -5644,9 +5750,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -5657,11 +5763,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -5672,42 +5777,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -5744,9 +5845,9 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.23" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" dependencies = [ "crossbeam-deque", "globset", @@ -5775,7 +5876,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -5849,13 +5950,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown 0.15.5", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] @@ -5867,7 +5969,7 @@ dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width 0.2.1", + "unicode-width 0.2.2", "web-time", ] @@ -5897,7 +5999,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fddf93031af70e75410a2511ec04d49e758ed2f26dad3404a934e0fb45cc12a" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "crossterm", "dyn-clone", "fuzzy-matcher", @@ -5953,17 +6055,6 @@ dependencies = [ "rustversion", ] -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "libc", -] - [[package]] name = "ipnet" version = "2.11.0" @@ -5972,9 +6063,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" dependencies = [ "memchr", "serde", @@ -5988,9 +6079,9 @@ checksum = "1fe266d2e243c931d8190177f20bf7f24eed45e96f39e87dc49a27b32d12d407" [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -6040,15 +6131,15 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -6154,7 +6245,7 @@ dependencies = [ "ena", "itertools 0.11.0", "lalrpop-util", - "petgraph", + "petgraph 0.6.5", "pico-args", "regex", "regex-syntax", @@ -6252,9 +6343,9 @@ dependencies = [ [[package]] name = "lazy-regex" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" +checksum = "191898e17ddee19e60bccb3945aa02339e81edd4a8c50e21fd4d48cdecda7b29" dependencies = [ "lazy-regex-proc_macros", "once_cell", @@ -6263,14 +6354,14 @@ dependencies = [ [[package]] name = "lazy-regex-proc_macros" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" +checksum = "c35dc8b0da83d1a9507e12122c80dea71a9c7c613014347392483a83ea593e04" dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -6282,12 +6373,6 @@ dependencies = [ "spin", ] -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "levenshtein" version = "1.0.5" @@ -6296,9 +6381,9 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libgit2-sys" @@ -6314,19 +6399,19 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.53.3", + "windows-link 0.2.1", ] [[package]] name = "liblzma" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10bf66f4598dc77ff96677c8e763655494f00ff9c1cf79e2eb5bb07bc31f807d" +checksum = "73c36d08cad03a3fbe2c4e7bb3a9e84c57e4ee4135ed0b065cade3d98480c648" dependencies = [ "liblzma-sys", ] @@ -6350,13 +6435,13 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libc", - "redox_syscall 0.5.17", + "redox_syscall 0.5.18", ] [[package]] @@ -6451,48 +6536,34 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" dependencies = [ "value-bag", ] -[[package]] -name = "loom" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber 0.3.20", -] - [[package]] name = "lru" version = "0.12.5" @@ -6525,7 +6596,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -6640,7 +6711,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -6655,9 +6726,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memmap2" @@ -6670,9 +6741,9 @@ dependencies = [ [[package]] name = "memmap2" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" dependencies = [ "libc", ] @@ -6695,7 +6766,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -6724,7 +6795,7 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -6756,6 +6827,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -6772,40 +6844,39 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "windows-sys 0.48.0", ] [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] name = "moka" -version = "0.12.10" +version = "0.12.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" +checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" dependencies = [ "async-lock", "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", + "equivalent", "event-listener 5.4.1", "futures-util", - "loom", - "parking_lot 0.12.4", + "parking_lot 0.12.5", "portable-atomic", "rustc_version 0.4.1", "smallvec", "tagptr", - "thiserror 1.0.69", "uuid", ] @@ -6936,7 +7007,7 @@ version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "crossbeam-channel", "filetime", "fsevent-sys", @@ -6951,11 +7022,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.50.1" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -6995,11 +7066,10 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "82c79c15c05d4bf82b6f5ef163104cc81a760d8e874d38ac50ab67c8877b647b" dependencies = [ - "byteorder", "lazy_static", "libm", "num-integer", @@ -7033,7 +7103,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7089,9 +7159,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", "rustversion", @@ -7099,14 +7169,14 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ - "proc-macro-crate 3.3.0", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7148,9 +7218,9 @@ dependencies = [ [[package]] name = "nybbles" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63cb50036b1ad148038105af40aaa70ff24d8a14fbc44ae5c914e1348533d12e" +checksum = "2c4b5ecbd0beec843101bffe848217f770e8b8da81d8355b7d6e226f2199b3dc" dependencies = [ "alloy-rlp", "cfg-if", @@ -7180,6 +7250,15 @@ dependencies = [ "ruzstd", ] +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -7188,9 +7267,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "op-alloy-consensus" @@ -7200,17 +7279,17 @@ checksum = "d9ade20c592484ba1ea538006e0454284174447a3adf9bb59fa99ed512f95493" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", "derive_more 2.0.1", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "op-revm" -version = "10.0.0" +version = "10.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ba21d705bbbfc947a423cba466d75e4af0c7d43ee89ba0a0f1cfa04963cede9" +checksum = "826f43a5b1613c224f561847c152bfbaefcb593a9ae2c612ff4dc4661c6e625f" dependencies = [ "auto_impl", "revm", @@ -7225,11 +7304,11 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.73" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -7246,7 +7325,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7257,18 +7336,18 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.5.3+3.5.4" +version = "300.5.4+3.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6bad8cd0233b63971e232cc9c5e83039375b8586d2312f31fda85db8f888c2" +checksum = "a507b3792995dae9b0df8a1c1e3771e8418b7c2d9f0baeba32e6fe8b06c7cb72" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.109" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", @@ -7290,7 +7369,7 @@ dependencies = [ "alloy", "anyhow", "async-stream", - "axum 0.8.4", + "axum 0.8.6", "base64 0.22.1", "boundless-market", "boundless-test-utils", @@ -7303,7 +7382,7 @@ dependencies = [ "serde", "serde_json", "sqlx", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tokio-util", "tower-http 0.5.2", @@ -7376,10 +7455,10 @@ version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" dependencies = [ - "proc-macro-crate 3.3.0", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7401,12 +7480,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", - "parking_lot_core 0.9.11", + "parking_lot_core 0.9.12", ] [[package]] @@ -7425,15 +7504,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.17", + "redox_syscall 0.5.18", "smallvec", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -7444,12 +7523,12 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pem" -version = "3.0.5" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" dependencies = [ "base64 0.22.1", - "serde", + "serde_core", ] [[package]] @@ -7469,12 +7548,11 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.1" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" dependencies = [ "memchr", - "thiserror 2.0.16", "ucd-trie", ] @@ -7484,8 +7562,18 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ - "fixedbitset", - "indexmap 2.11.0", + "fixedbitset 0.4.2", + "indexmap 2.12.0", +] + +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset 0.5.7", + "indexmap 2.12.0", ] [[package]] @@ -7529,7 +7617,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7564,7 +7652,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7629,16 +7717,16 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "polling" -version = "3.10.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 1.0.8", - "windows-sys 0.60.2", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] @@ -7671,9 +7759,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] @@ -7746,7 +7834,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7781,11 +7869,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit", + "toml_edit 0.23.7", ] [[package]] @@ -7831,14 +7919,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -7851,21 +7939,19 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", "version_check", - "yansi", ] [[package]] name = "proptest" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" +checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" dependencies = [ "bit-set 0.8.0", "bit-vec 0.8.0", - "bitflags 2.9.4", - "lazy_static", + "bitflags 2.10.0", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", @@ -7884,7 +7970,7 @@ checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7908,12 +7994,12 @@ dependencies = [ "log", "multimap", "once_cell", - "petgraph", + "petgraph 0.7.1", "prettyplease", "prost", "prost-types", "regex", - "syn 2.0.106", + "syn 2.0.110", "tempfile", ] @@ -7927,7 +8013,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -7950,7 +8036,7 @@ dependencies = [ "cfg-if", "itertools 0.10.5", "once_cell", - "parking_lot 0.12.4", + "parking_lot 0.12.5", ] [[package]] @@ -7981,10 +8067,10 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.1", - "rustls 0.23.31", - "socket2 0.6.0", - "thiserror 2.0.16", + "rustc-hash", + "rustls 0.23.35", + "socket2 0.6.1", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -7997,15 +8083,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.3.3", + "getrandom 0.3.4", "lru-slab", "rand 0.9.2", "ring", - "rustc-hash 2.1.1", - "rustls 0.23.31", + "rustc-hash", + "rustls 0.23.35", "rustls-pki-types", "slab", - "thiserror 2.0.16", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -8020,16 +8106,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.0", + "socket2 0.6.1", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -8104,7 +8190,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "serde", ] @@ -8160,11 +8246,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", ] [[package]] @@ -8186,46 +8272,46 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "reflink-copy" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c81d000a2c524133cc00d2f92f019d399e57906c3b7119271a2495354fe895" +checksum = "23bbed272e39c47a095a5242218a67412a220006842558b03fe2935e8f3d7b92" dependencies = [ "cfg-if", "libc", - "rustix 1.0.8", + "rustix 1.1.2", "windows", ] [[package]] name = "regex" -version = "1.11.2" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -8235,9 +8321,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -8246,15 +8332,15 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" +checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "requestor-lists" @@ -8264,15 +8350,15 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", "url", ] [[package]] name = "reqwest" -version = "0.12.23" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "base64 0.22.1", "bytes", @@ -8296,7 +8382,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.31", + "rustls 0.23.35", "rustls-pki-types", "serde", "serde_json", @@ -8304,7 +8390,7 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-native-tls", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tokio-util", "tower 0.5.2", "tower-http 0.6.6", @@ -8314,7 +8400,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 1.0.2", + "webpki-roots 1.0.4", ] [[package]] @@ -8365,9 +8451,9 @@ dependencies = [ [[package]] name = "revm" -version = "29.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c278b6ee9bba9e25043e3fae648fdce632d1944d3ba16f5203069b43bddd57f" +checksum = "718d90dce5f07e115d0e66450b1b8aa29694c1cf3f89ebddaddccc2ccbd2f13e" dependencies = [ "revm-bytecode", "revm-context", @@ -8396,9 +8482,9 @@ dependencies = [ [[package]] name = "revm-context" -version = "9.0.2" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fb02c5dab3b535aa5b18277b1d21c5117a25d42af717e6ce133df0ea56663e1" +checksum = "5a20c98e7008591a6f012550c2a00aa36cba8c14cc88eb88dec32eb9102554b4" dependencies = [ "bitvec", "cfg-if", @@ -8413,9 +8499,9 @@ dependencies = [ [[package]] name = "revm-context-interface" -version = "10.1.0" +version = "10.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b8e9311d27cf75fbf819e7ba4ca05abee1ae02e44ff6a17301c7ab41091b259" +checksum = "b50d241ed1ce647b94caf174fcd0239b7651318b2c4c06b825b59b973dfb8495" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -8456,9 +8542,9 @@ dependencies = [ [[package]] name = "revm-handler" -version = "10.0.0" +version = "10.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528d2d81cc918d311b8231c35330fac5fba8b69766ddc538833e2b5593ee016e" +checksum = "550331ea85c1d257686e672081576172fe3d5a10526248b663bbf54f1bef226a" dependencies = [ "auto_impl", "derive-where", @@ -8475,9 +8561,9 @@ dependencies = [ [[package]] name = "revm-inspector" -version = "10.0.0" +version = "10.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf443b664075999a14916b50c5ae9e35a7d71186873b8f8302943d50a672e5e0" +checksum = "7c0a6e9ccc2ae006f5bed8bd80cd6f8d3832cd55c5e861b9402fdd556098512f" dependencies = [ "auto_impl", "either", @@ -8493,9 +8579,9 @@ dependencies = [ [[package]] name = "revm-interpreter" -version = "25.0.2" +version = "25.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d6406b711fac73b4f13120f359ed8e65964380dd6182bd12c4c09ad0d4641f" +checksum = "06575dc51b1d8f5091daa12a435733a90b4a132dca7ccee0666c7db3851bc30c" dependencies = [ "revm-bytecode", "revm-context-interface", @@ -8534,7 +8620,7 @@ version = "20.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aa29d9da06fe03b249b6419b33968ecdf92ad6428e2f012dc57bcd619b5d94e" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "num_enum", "once_cell", "serde", @@ -8546,7 +8632,7 @@ version = "7.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f64fbacb86008394aaebd3454f9643b7d5a782bd251135e17c5b33da592d84d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "revm-bytecode", "revm-primitives", "serde", @@ -8608,7 +8694,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b37f9050c74d66eb953591e88a60f2d347e99b121e7330eabb0f29c4053d2a36" dependencies = [ - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-sol-types", "bytemuck", "hex", @@ -8616,7 +8702,7 @@ dependencies = [ "risc0-zkp", "risc0-zkvm", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -8636,7 +8722,7 @@ dependencies = [ "risc0-zkp", "risc0-zkvm-platform", "ruint", - "semver 1.0.26", + "semver 1.0.27", "serde", "tracing", ] @@ -8658,7 +8744,7 @@ dependencies = [ "risc0-zkp", "risc0-zkvm-platform", "rzup", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "stability", @@ -8844,7 +8930,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a604f09f459f456fd9ef4919c6efcaa6a787a6f9ffcd76cfc81eae1860584a1" dependencies = [ "alloy", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-sol-types", "anyhow", "cfg-if", @@ -8852,7 +8938,7 @@ dependencies = [ "risc0-aggregation", "risc0-zkvm", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", ] @@ -8918,14 +9004,14 @@ dependencies = [ [[package]] name = "risc0-steel" -version = "2.4.0" -source = "git+https://github.com/boundless-xyz/steel?branch=release-2.4#3731e48e9a7ba4bb0c6ef800b635d95f4114ca85" +version = "2.4.1" +source = "git+https://github.com/boundless-xyz/steel?branch=release-2.4#6160a2f6689178561338dbfb4c9ddf490572157b" dependencies = [ "alloy", "alloy-consensus", "alloy-eips", "alloy-evm", - "alloy-primitives 1.3.1", + "alloy-primitives 1.4.1", "alloy-rlp", "alloy-rpc-types", "alloy-sol-types", @@ -8939,7 +9025,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.9", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "url", ] @@ -8986,7 +9072,7 @@ dependencies = [ "hex-literal", "metal", "ndarray", - "parking_lot 0.12.4", + "parking_lot 0.12.5", "paste", "rand 0.9.2", "rand_core 0.9.3", @@ -9006,10 +9092,10 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c39d9943fe71decea1e8b6a99480cefa33799ab08b5abfccd7e2a18fb07121c1" dependencies = [ - "addr2line", + "addr2line 0.24.2", "anyhow", "bincode", - "bonsai-sdk", + "bonsai-sdk 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "borsh", "bytemuck", "bytes", @@ -9018,13 +9104,13 @@ dependencies = [ "enum-map", "gdbstub", "gdbstub_arch", - "gimli", + "gimli 0.31.1", "hex", "keccak", "lazy-regex", "num-bigint 0.4.6", "num-traits", - "object", + "object 0.36.7", "prost", "rand 0.9.2", "rayon", @@ -9041,7 +9127,7 @@ dependencies = [ "rrs-lib", "rustc-demangle", "rzup", - "semver 1.0.26", + "semver 1.0.27", "serde", "sha2 0.10.9", "stability", @@ -9059,13 +9145,22 @@ dependencies = [ "bytemuck", "cfg-if", "getrandom 0.2.16", - "getrandom 0.3.3", + "getrandom 0.3.4", "libm", "num_enum", "paste", "stability", ] +[[package]] +name = "rlimit" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7043b63bd0cd1aaa628e476b80e6d4023a3b50eb32789f2728908107bd0c793a" +dependencies = [ + "libc", +] + [[package]] name = "rlp" version = "0.5.2" @@ -9151,13 +9246,14 @@ dependencies = [ [[package]] name = "ruint" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecb38f82477f20c5c3d62ef52d7c4e536e38ea9b73fb570a20c5cae0e14bcf6" +checksum = "a68df0380e5c9d20ce49534f292a36a7514ae21350726efe1865bdb1fa91d278" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", "ark-ff 0.4.2", + "ark-ff 0.5.0", "borsh", "bytes", "fastrlp 0.3.1", @@ -9172,7 +9268,7 @@ dependencies = [ "rand 0.9.2", "rlp", "ruint-macro", - "serde", + "serde_core", "valuable", "zeroize", ] @@ -9185,9 +9281,9 @@ checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rust-embed" -version = "8.7.2" +version = "8.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a" +checksum = "947d7f3fad52b283d261c4c99a084937e2fe492248cb9a68a8435a861b8798ca" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -9196,22 +9292,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.7.2" +version = "8.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c" +checksum = "5fa2c8c9e8711e10f9c4fd2d64317ef13feaab820a4c51541f1a8c8e2e851ab2" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.106", + "syn 2.0.110", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.7.2" +version = "8.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594" +checksum = "60b161f275cb337fe0a44d924a5f4df0ed69c2c39519858f931ce61c779d3475" dependencies = [ "sha2 0.10.9", "walkdir", @@ -9223,12 +9319,6 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -9256,7 +9346,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.26", + "semver 1.0.27", ] [[package]] @@ -9265,7 +9355,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -9274,15 +9364,15 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.8" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", ] [[package]] @@ -9299,15 +9389,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.31" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "aws-lc-rs", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.4", + "rustls-webpki 0.103.8", "subtle", "zeroize", ] @@ -9326,14 +9416,14 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.3.0", + "security-framework 3.5.1", ] [[package]] @@ -9347,9 +9437,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" dependencies = [ "web-time", "zeroize", @@ -9367,9 +9457,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.4" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "aws-lc-rs", "ring", @@ -9385,9 +9475,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rusty-fork" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" dependencies = [ "fnv", "quick-error", @@ -9418,13 +9508,13 @@ checksum = "5d2aed296f203fa64bcb4b52069356dd86d6ec578593985b919b6995bee1f0ae" dependencies = [ "hex", "rsa", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_with", "sha2 0.10.9", "strum", "tempfile", - "thiserror 2.0.16", + "thiserror 2.0.17", "toml 0.8.23", "yaml-rust2", ] @@ -9458,11 +9548,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -9479,9 +9569,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" dependencies = [ "dyn-clone", "ref-cast", @@ -9489,12 +9579,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" @@ -9593,7 +9677,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -9602,11 +9686,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.3.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -9615,9 +9699,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -9634,11 +9718,12 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -9689,30 +9774,32 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "serde_json" -version = "1.0.143" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.11.0", + "indexmap 2.12.0", "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_path_to_error" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -9748,19 +9835,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" +checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.0", + "indexmap 2.12.0", "schemars 0.9.0", - "schemars 1.0.4", - "serde", - "serde_derive", + "schemars 1.1.0", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -9768,14 +9854,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.14.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" +checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" dependencies = [ - "darling 0.20.11", + "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -9796,7 +9882,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.11.0", + "indexmap 2.12.0", "itoa", "ryu", "serde", @@ -9822,7 +9908,7 @@ dependencies = [ "futures", "log", "once_cell", - "parking_lot 0.12.4", + "parking_lot 0.12.5", "scc", "serial_test_derive", ] @@ -9835,7 +9921,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -9906,9 +9992,9 @@ dependencies = [ [[package]] name = "shadow-rs" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8aa5c0570cd9654158bd39f0f8caba24edbc058313946e89f4648b1de1ecf49" +checksum = "72d18183cef626bce22836103349c7050d73db799be0171386b80947d157ae32" dependencies = [ "const_format", "git2", @@ -9944,9 +10030,9 @@ dependencies = [ [[package]] name = "signal-hook-mio" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" dependencies = [ "libc", "mio 0.8.11", @@ -10002,7 +10088,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint 0.4.6", "num-traits", - "thiserror 2.0.16", + "thiserror 2.0.17", "time", ] @@ -10056,12 +10142,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -10095,9 +10181,9 @@ dependencies = [ [[package]] name = "sppark" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdc4f02f557e3037bbe2a379cac8be6e014a67beb7bf0996b536979392f6361" +checksum = "d9c900139f3f6fdc8db217881a946adf00e935102fdd82b0e1bc19bacbffa311" dependencies = [ "cc", "which", @@ -10135,17 +10221,17 @@ dependencies = [ "futures-util", "hashbrown 0.15.5", "hashlink", - "indexmap 2.11.0", + "indexmap 2.12.0", "log", "memchr", "once_cell", "percent-encoding", - "rustls 0.23.31", + "rustls 0.23.35", "serde", "serde_json", "sha2 0.10.9", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tokio-stream", "tracing", @@ -10163,7 +10249,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10186,7 +10272,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.106", + "syn 2.0.110", "tokio", "url", ] @@ -10199,7 +10285,7 @@ checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.9.4", + "bitflags 2.10.0", "byteorder", "bytes", "chrono", @@ -10229,7 +10315,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", "whoami", ] @@ -10242,7 +10328,7 @@ checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.9.4", + "bitflags 2.10.0", "byteorder", "chrono", "crc", @@ -10267,7 +10353,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", "whoami", ] @@ -10292,7 +10378,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", "url", ] @@ -10343,14 +10429,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -10365,7 +10451,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", - "parking_lot 0.12.4", + "parking_lot 0.12.5", "phf_shared", "precomputed-hash", ] @@ -10405,7 +10491,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10427,9 +10513,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -10438,14 +10524,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b198d366dbec045acfcd97295eb653a7a2b40e4dc764ef1e79aafcad439d3c" +checksum = "ff790eb176cc81bb8936aed0f7b9f14fc4670069a2d371b3e3b0ecce908b2cb3" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10477,7 +10563,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10486,7 +10572,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -10544,20 +10630,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96374855068f47402c3121c6eed88d29cb1de8f3ab27090e273e420bdabcf050" dependencies = [ "futures", - "parking_lot 0.12.4", + "parking_lot 0.12.5", ] [[package]] name = "tempfile" -version = "3.21.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", - "rustix 1.0.8", - "windows-sys 0.60.2", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] @@ -10596,7 +10682,7 @@ checksum = "451b374529930d7601b1eef8d32bc79ae870b6079b069401709c2a8bf9e75f36" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10610,11 +10696,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.16", + "thiserror-impl 2.0.17", ] [[package]] @@ -10625,18 +10711,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10659,11 +10745,12 @@ dependencies = [ [[package]] name = "time" -version = "0.3.43" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", + "itoa", "libc", "num-conv", "num_threads", @@ -10700,9 +10787,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -10725,33 +10812,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", - "mio 1.0.4", - "parking_lot 0.12.4", + "mio 1.1.0", + "parking_lot 0.12.5", "pin-project-lite", "signal-hook-registry", - "slab", - "socket2 0.6.0", + "socket2 0.6.1", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -10776,11 +10860,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.31", + "rustls 0.23.35", "tokio", ] @@ -10831,19 +10915,31 @@ checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" dependencies = [ "futures-util", "log", - "rustls 0.23.31", + "rustls 0.23.35", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tungstenite 0.26.2", "webpki-roots 0.26.11", ] +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite 0.28.0", +] + [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", @@ -10870,8 +10966,8 @@ checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", - "toml_datetime", - "toml_edit", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", ] [[package]] @@ -10883,20 +10979,50 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.11.0", + "indexmap 2.12.0", "serde", "serde_spanned", - "toml_datetime", + "toml_datetime 0.6.11", "toml_write", "winnow", ] +[[package]] +name = "toml_edit" +version = "0.23.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +dependencies = [ + "indexmap 2.12.0", + "toml_datetime 0.7.3", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow", +] + [[package]] name = "toml_write" version = "0.1.2" @@ -10940,7 +11066,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bytes", "http 1.3.1", "http-body 1.0.1", @@ -10958,7 +11084,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bytes", "futures-util", "http 1.3.1", @@ -11002,7 +11128,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -11084,7 +11210,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -11124,10 +11250,27 @@ dependencies = [ "httparse", "log", "rand 0.9.2", - "rustls 0.23.31", + "rustls 0.23.35", "rustls-pki-types", "sha1", - "thiserror 2.0.16", + "thiserror 2.0.17", + "utf-8", +] + +[[package]] +name = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http 1.3.1", + "httparse", + "log", + "rand 0.9.2", + "sha1", + "thiserror 2.0.17", "utf-8", ] @@ -11155,15 +11298,15 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "typetag" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f22b40dd7bfe8c14230cf9702081366421890435b2d625fa92b4acc4c3de6f" +checksum = "be2212c8a9b9bcfca32024de14998494cf9a5dfa59ea1b829de98bac374b86bf" dependencies = [ "erased-serde", "inventory", @@ -11174,20 +11317,20 @@ dependencies = [ [[package]] name = "typetag-impl" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35f5380909ffc31b4de4f4bdf96b877175a016aa2ca98cee39fcfd8c4d53d952" +checksum = "27a7a9b72ba121f6f1f6c3632b85604cac41aedb5ddc70accbebb6cac83de846" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "tz-rs" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1450bf2b99397e72070e7935c89facaa80092ac812502200375f1f7d33c71a1" +checksum = "14eff19b8dc1ace5bf7e4d920b2628ae3837f422ff42210cb1567cbf68b5accf" [[package]] name = "tzdb" @@ -11247,24 +11390,24 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-normalization" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-segmentation" @@ -11280,9 +11423,9 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode-xid" @@ -11350,7 +11493,7 @@ version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" dependencies = [ - "indexmap 2.11.0", + "indexmap 2.12.0", "serde", "serde_json", "utoipa-gen", @@ -11378,7 +11521,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -11405,7 +11548,7 @@ version = "9.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d047458f1b5b65237c2f6dc6db136945667f40a7668627b3490b9513a3d43a55" dependencies = [ - "axum 0.8.4", + "axum 0.8.6", "base64 0.22.1", "mime_guess", "regex", @@ -11423,7 +11566,7 @@ version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "js-sys", "wasm-bindgen", ] @@ -11505,10 +11648,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.3+wasi-0.2.4" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ "wit-bindgen", ] @@ -11521,35 +11664,22 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.106", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", @@ -11560,9 +11690,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -11570,22 +11700,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.106", - "wasm-bindgen-backend", + "syn 2.0.110", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] @@ -11626,7 +11756,7 @@ checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" dependencies = [ "futures", "js-sys", - "parking_lot 0.12.4", + "parking_lot 0.12.5", "pin-utils", "slab", "wasm-bindgen", @@ -11634,9 +11764,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -11658,14 +11788,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.2", + "webpki-roots 1.0.4", ] [[package]] name = "webpki-roots" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" dependencies = [ "rustls-pki-types", ] @@ -11704,9 +11834,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" [[package]] name = "winapi" @@ -11726,11 +11856,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -11741,70 +11871,69 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" -version = "0.61.3" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" dependencies = [ "windows-collections", "windows-core", "windows-future", - "windows-link", "windows-numerics", ] [[package]] name = "windows-collections" -version = "0.2.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" dependencies = [ "windows-core", ] [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link", - "windows-result", - "windows-strings", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] name = "windows-future" -version = "0.2.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" dependencies = [ "windows-core", - "windows-link", + "windows-link 0.2.1", "windows-threading", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -11813,14 +11942,20 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-numerics" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" dependencies = [ "windows-core", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -11829,9 +11964,9 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-link", - "windows-result", - "windows-strings", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -11840,7 +11975,16 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -11849,7 +11993,16 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -11885,7 +12038,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -11921,28 +12083,28 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] name = "windows-threading" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -11959,9 +12121,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -11977,9 +12139,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -11995,9 +12157,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -12007,9 +12169,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -12025,9 +12187,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -12043,9 +12205,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -12061,9 +12223,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -12079,9 +12241,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -12117,15 +12279,15 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.45.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "ws_stream_wasm" @@ -12140,7 +12302,7 @@ dependencies = [ "pharos", "rustc_version 0.4.1", "send_wrapper", - "thiserror 2.0.16", + "thiserror 2.0.17", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -12164,12 +12326,66 @@ dependencies = [ "tap", ] +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix 1.1.2", +] + [[package]] name = "xmlparser" version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" +[[package]] +name = "xshell" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e7290c623014758632efe00737145b6867b66292c42167f2ec381eb566a373d" +dependencies = [ + "xshell-macros", +] + +[[package]] +name = "xshell-macros" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32ac00cd3f8ec9c1d33fb3e7958a82df6989c42d747bd326c822b1d625283547" + +[[package]] +name = "xtask" +version = "1.2.0" +dependencies = [ + "anyhow", + "astral-tokio-tar", + "async-compression", + "aws-config", + "aws-credential-types", + "aws-sdk-s3", + "blake3_groth16", + "boundless-market", + "clap", + "guest-util", + "hex", + "liblzma", + "memmap2 0.9.9", + "num_cpus", + "regex", + "risc0-circuit-recursion", + "risc0-groth16-sys", + "risc0-zkvm", + "rlimit", + "tokio", + "tracing", + "tracing-subscriber 0.3.20", + "xshell", +] + [[package]] name = "xxhash-rust" version = "0.8.15" @@ -12187,9 +12403,9 @@ dependencies = [ [[package]] name = "yaml-rust2" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ce2a4ff45552406d02501cea6c18d8a7e50228e7736a872951fe2fe75c91be7" +checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" dependencies = [ "arraydeque", "encoding_rs", @@ -12204,11 +12420,10 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -12216,34 +12431,34 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", "synstructure 0.13.2", ] [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -12263,15 +12478,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", "synstructure 0.13.2", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] @@ -12284,14 +12499,14 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -12300,9 +12515,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -12311,13 +12526,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.110", ] [[package]] @@ -12331,9 +12546,9 @@ dependencies = [ "crossbeam-utils", "displaydoc", "flate2", - "indexmap 2.11.0", + "indexmap 2.12.0", "memchr", - "thiserror 2.0.16", + "thiserror 2.0.17", "zopfli", ] @@ -12346,7 +12561,7 @@ dependencies = [ "arbitrary", "crc32fast", "flate2", - "indexmap 2.11.0", + "indexmap 2.12.0", "memchr", "zopfli", ] @@ -12359,9 +12574,9 @@ checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" [[package]] name = "zopfli" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" dependencies = [ "bumpalo", "crc32fast", diff --git a/Cargo.toml b/Cargo.toml index 8ce1066e4..64930432f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [workspace] resolver = "2" members = [ + "blake3_groth16", "crates/assessor", "crates/bench", "crates/boundless-cli", @@ -21,6 +22,7 @@ members = [ "crates/slasher", "crates/test-utils", "crates/zkc", + "xtask", ] [workspace.package] @@ -30,18 +32,6 @@ homepage = "https://boundless.network/" repository = "https://github.com/boundless-xyz/boundless/" [workspace.dependencies] -boundless-assessor = { version = "1.2.0", path = "crates/assessor" } -boundless-cli = { path = "crates/boundless-cli" } -boundless-market = { version = "1.2.0", path = "crates/boundless-market" } -boundless-rewards = { path = "crates/rewards" } -boundless-test-utils = { path = "crates/test-utils" } -boundless-zkc = { path = "crates/zkc" } -boundless-povw = { path = "crates/povw" } -distributor = { path = "crates/distributor" } -guest-assessor = { path = "crates/guest/assessor" } -guest-util = { path = "crates/guest/util" } -order-stream = { path = "crates/order-stream" } -requestor-lists = { path = "crates/requestor-lists" } alloy = { version = "1.0", default-features = false } alloy-chains = "0.2.0" @@ -53,28 +43,48 @@ anyhow = { version = "1.0" } async-stream = "0.3" async-trait = "0.1" aws-config = { version = "1.6", features = ["behavior-version-latest"] } -aws-sdk-s3 = "1.34" # used for minio for max compatibility +aws-sdk-s3 = "1.34" # used for minio for max compatibility axum = "0.8" axum-extra = { version = "0.10" } bincode = "1.3" -bonsai-sdk = { version = "1.4", features = ["non_blocking"] } +blake3_groth16 = { path = "blake3_groth16", default-features = false } +bonsai-sdk = { git = "https://github.com/risc0/risc0", branch = "flaub/shrink-bitvm2", features = [ + "non_blocking", + "shrink_bitvm2", +] } +borsh = "1.5" +boundless-assessor = { version = "1.2.0", path = "crates/assessor" } +boundless-cli = { path = "crates/boundless-cli" } +boundless-market = { version = "1.2.0", path = "crates/boundless-market" } +boundless-povw = { path = "crates/povw" } +boundless-rewards = { path = "crates/rewards" } +boundless-test-utils = { path = "crates/test-utils" } +boundless-zkc = { path = "crates/zkc" } broker = { path = "crates/broker" } bs58 = "0.5" bytemuck = "1.16" chrono = { version = "0.4", features = ["serde"] } clap = { version = "4.5", features = ["derive", "env"] } clap_complete = "4.5" +distributor = { path = "crates/distributor" } futures-util = "0.3" +guest-assessor = { path = "crates/guest/assessor" } guest-set-builder = { git = "https://github.com/risc0/risc0-ethereum", tag = "aggregation-v0.8.1" } +guest-util = { path = "crates/guest/util" } hex = { version = "0.4", default-features = false, features = ["alloc"] } +order-stream = { path = "crates/order-stream" } postcard = { version = "1.0" } rand = { version = "0.9" } +requestor-lists = { path = "crates/requestor-lists" } reqwest = "0.12" risc0-aggregation = { version = "0.9.0" } +risc0-binfmt = { version = "3.0.3", default-features = false } risc0-build = { version = "3.0.4", features = ["docker", "unstable"] } risc0-build-ethereum = { version = "3.0.1" } risc0-circuit-recursion = { version = "4.0.3" } risc0-ethereum-contracts = { version = "3.0.1" } +risc0-groth16 = { version = "3.0.3", default-features = false } +risc0-groth16-sys = { version = "0.1.0" } risc0-povw = { version = "0.4.1", default-features = false } risc0-zkp = { version = "3.0.3" } risc0-zkvm = { version = "3.0.4", default-features = false } diff --git a/bento/Cargo.lock b/bento/Cargo.lock index aef20ac38..a97f20ee3 100644 --- a/bento/Cargo.lock +++ b/bento/Cargo.lock @@ -62,14 +62,654 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "alloy" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e15860af634cad451f598712c24ca7fd9b45d84fff68ab8d4967567fa996c64" +dependencies = [ + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-network", + "alloy-node-bindings", + "alloy-provider", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-serde", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", + "alloy-trie", +] + +[[package]] +name = "alloy-chains" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bc32535569185cbcb6ad5fa64d989a47bccb9a08e27284b1f2a3ccf16e6d010" +dependencies = [ + "alloy-primitives", + "num_enum", + "serde", + "strum", +] + +[[package]] +name = "alloy-consensus" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6440213a22df93a87ed512d2f668e7dc1d62a05642d107f82d61edc9e12370" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "alloy-tx-macros", + "auto_impl", + "borsh", + "c-kzg", + "derive_more", + "either", + "k256", + "once_cell", + "rand 0.8.5", + "secp256k1", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-consensus-any" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15d0bea09287942405c4f9d2a4f22d1e07611c2dbd9d5bf94b75366340f9e6e0" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69af404f1d00ddb42f2419788fa87746a4cd13bab271916d7726fda6c792d94" +dependencies = [ + "alloy-consensus", + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "serde_json", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-core" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca96214615ec8cf3fa2a54b32f486eb49100ca7fe7eb0b8c1137cd316e7250a" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdff496dd4e98a81f4861e66f7eaf5f2488971848bb42d9c892f871730245c8" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "itoa", + "serde", + "serde_json", + "winnow", +] + +[[package]] +name = "alloy-eip2124" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "crc", + "serde", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-eip2930" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-eips" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd2c7ae05abcab4483ce821f12f285e01c0b33804e6883dd9ca1569a87ee2be" +dependencies = [ + "alloy-eip2124", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "borsh", + "c-kzg", + "derive_more", + "either", + "serde", + "serde_with", + "sha2", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-genesis" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc47eaae86488b07ea8e20236184944072a78784a1f4993f8ec17b3aa5d08c21" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", +] + +[[package]] +name = "alloy-hardforks" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165210652f71dfc094b051602bafd691f506c54050a174b1cba18fb5ef706a3" +dependencies = [ + "alloy-chains", + "alloy-eip2124", + "alloy-primitives", + "auto_impl", + "dyn-clone", +] + +[[package]] +name = "alloy-json-abi" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5513d5e6bd1cba6bdcf5373470f559f320c05c8c59493b6e98912fbe6733943f" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003f46c54f22854a32b9cc7972660a476968008ad505427eabab49225309ec40" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "http 1.3.1", + "serde", + "serde_json", + "thiserror 2.0.16", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4029954d9406a40979f3a3b46950928a0fdcfe3ea8a9b0c17490d57e8aa0e3" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "derive_more", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-network-primitives" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7805124ad69e57bbae7731c9c344571700b2a18d351bda9e0eba521c991d1bcb" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-node-bindings" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b03d35475a02d2a8b76209cb4a1336cb7d85331d10a0f6ec329ee42151695c19" +dependencies = [ + "alloy-genesis", + "alloy-hardforks", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "alloy-signer-local", + "k256", + "rand 0.8.5", + "serde_json", + "tempfile", + "thiserror 2.0.16", + "tracing", + "url", +] + +[[package]] +name = "alloy-primitives" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "355bf68a433e0fd7f7d33d5a9fc2583fde70bf5c530f63b80845f8da5505cf28" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "foldhash 0.2.0", + "hashbrown 0.16.1", + "indexmap 2.11.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.9.2", + "ruint", + "rustc-hash 2.1.1", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d369e12c92870d069e0c9dc5350377067af8a056e29e3badf8446099d7e00889" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-node-bindings", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-anvil", + "alloy-rpc-types-eth", + "alloy-signer", + "alloy-sol-types", + "alloy-transport", + "alloy-transport-http", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "either", + "futures", + "futures-utils-wasm", + "lru 0.13.0", + "parking_lot", + "pin-project", + "reqwest", + "serde", + "serde_json", + "thiserror 2.0.16", + "tokio", + "tracing", + "url", + "wasmtimer", +] + [[package]] name = "alloy-rlp" version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "alloy-rpc-client" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c89883fe6b7381744cbe80fef638ac488ead4f1956a4278956a1362c71cd2e" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "alloy-transport-http", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e279e6d40ee40fe8f76753b678d8d5d260cb276dc6c8a8026099b16d2b43f4" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-anvil" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e176c26fdd87893b6afeb5d92099d8f7e7a1fe11d6f4fe0883d6e33ac5f31ba" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b43c1622aac2508d528743fd4cfdac1dea92d5a8fa894038488ff7edd0af0b32" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5fafb741c19b3cca4cdd04fa215c89413491f9695a3e928dee2ae5657f607e" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.14.0", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-serde" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6f180c399ca7c1e2fe17ea58343910cad0090878a696ff5a50241aee12fc529" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc39ad2c0a3d2da8891f4081565780703a593f090f768f884049aa3aa929cbc" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "either", + "elliptic-curve 0.13.8", + "k256", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-signer-local" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "930e17cb1e46446a193a593a3bfff8d0ecee4e510b802575ebe300ae2e43ef75" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand 0.8.5", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-sol-macro" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3ce480400051b5217f19d6e9a82d9010cdde20f1ae9c00d53591e4a1afbb312" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d792e205ed3b72f795a8044c52877d2e6b6e9b1d13f431478121d8d4eaa9028" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap 2.11.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.106", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bd1247a8f90b465ef3f1207627547ec16940c35597875cdc09c49d58b19693c" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck", + "macro-string", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.106", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "954d1b2533b9b2c7959652df3076954ecb1122a28cc740aa84e7b0a49f6ac0a9" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70319350969a3af119da6fb3e9bddb1bce66c9ea933600cb297c8b1850ad2a3c" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cae82426d98f8bc18f53c5223862907cac30ab8fc5e4cd2bb50808e6d3ab43d8" +dependencies = [ + "alloy-json-rpc", + "auto_impl", + "base64 0.22.1", + "derive_more", + "futures", + "futures-utils-wasm", + "parking_lot", + "serde", + "serde_json", + "thiserror 2.0.16", + "tokio", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90aa6825760905898c106aba9c804b131816a15041523e80b6d4fe7af6380ada" dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-trie" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3412d52bb97c6c6cc27ccc28d4e6e8cf605469101193b50b0bd5813b1f990b5" +dependencies = [ + "alloy-primitives", + "alloy-rlp", "arrayvec", - "bytes", + "derive_more", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[package]] +name = "alloy-tx-macros" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae109e33814b49fc0a62f2528993aa8a2dd346c26959b151f05441dc0b9da292" +dependencies = [ + "darling 0.21.3", + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] @@ -158,7 +798,7 @@ version = "0.1.0" dependencies = [ "anyhow", "axum", - "bonsai-sdk", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", "clap", "risc0-zkvm", "serde", @@ -436,116 +1076,336 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" dependencies = [ - "ark-ff 0.5.0", - "ark-std 0.5.0", - "tracing", - "tracing-subscriber 0.2.25", + "ark-ff 0.5.0", + "ark-std 0.5.0", + "tracing", + "tracing-subscriber 0.2.25", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "ark-snark" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" +dependencies = [ + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "ascii" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "assert-json-diff" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", ] [[package]] -name = "ark-serialize" -version = "0.3.0" +name = "async-executor" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", ] [[package]] -name = "ark-serialize" -version = "0.4.2" +name = "async-global-executor" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint 0.4.6", + "async-channel 2.5.0", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", ] [[package]] -name = "ark-serialize" -version = "0.5.0" +name = "async-io" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "ark-serialize-derive", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "num-bigint 0.4.6", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.0.8", + "slab", + "windows-sys 0.61.2", ] [[package]] -name = "ark-serialize-derive" -version = "0.5.0" +name = "async-lock" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "event-listener 5.4.1", + "event-listener-strategy", + "pin-project-lite", ] [[package]] -name = "ark-snark" -version = "0.5.1" +name = "async-object-pool" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" +checksum = "333c456b97c3f2d50604e8b2624253b7f787208cb72eb75e64b0ad11b221652c" dependencies = [ - "ark-ff 0.5.0", - "ark-relations", - "ark-serialize 0.5.0", - "ark-std 0.5.0", + "async-std", ] [[package]] -name = "ark-std" -version = "0.3.0" +name = "async-process" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ - "num-traits", - "rand 0.8.5", + "async-channel 2.5.0", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.1", + "futures-lite", + "rustix 1.0.8", ] [[package]] -name = "ark-std" -version = "0.4.0" +name = "async-signal" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ - "num-traits", - "rand 0.8.5", + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.0.8", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", ] [[package]] -name = "ark-std" -version = "0.5.0" +name = "async-std" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" dependencies = [ - "num-traits", - "rand 0.8.5", + "async-attributes", + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "async-process", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", ] [[package]] -name = "arraydeque" -version = "0.5.1" +name = "async-stream" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] [[package]] -name = "arrayvec" -version = "0.7.6" +name = "async-stream-impl" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] [[package]] -name = "ascii" -version = "1.1.0" +name = "async-task" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" @@ -685,7 +1545,7 @@ dependencies = [ "http 0.2.12", "http 1.3.1", "http-body 0.4.6", - "lru", + "lru 0.12.5", "percent-encoding", "regex-lite", "sha2", @@ -998,6 +1858,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.21.7" @@ -1026,13 +1892,24 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +[[package]] +name = "basic-cookies" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67bd8fd42c16bdb08688243dc5f0cc117a3ca9efeeaba3a345a18a6159ad96f7" +dependencies = [ + "lalrpop", + "lalrpop-util", + "regex", +] + [[package]] name = "bento-client" version = "0.1.0" dependencies = [ "anyhow", "bincode", - "bonsai-sdk", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", "bytemuck", "clap", "risc0-zkvm", @@ -1109,12 +1986,52 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bit-vec" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -1151,6 +2068,47 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "blake3_groth16" +version = "1.2.0" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ff 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "bincode", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", + "borsh", + "boundless-market", + "circom-witnesscalc", + "hex", + "num-bigint 0.4.6", + "num-traits", + "risc0-groth16", + "risc0-groth16-sys", + "risc0-zkvm", + "serde", + "serde_json", + "tempfile", + "tokio", + "tracing", + "wtns-file", +] + [[package]] name = "block" version = "0.1.6" @@ -1166,6 +2124,19 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel 2.5.0", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "blst" version = "0.3.15" @@ -1183,6 +2154,18 @@ name = "bonsai-sdk" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21055e2f49cbbdbfe9f8f96d597c5527b0c6ab7933341fdc2f147180e48a988e" +dependencies = [ + "duplicate", + "maybe-async", + "reqwest", + "serde", + "thiserror 2.0.16", +] + +[[package]] +name = "bonsai-sdk" +version = "1.4.1" +source = "git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2#6ed3f0321638ae7eb9c097b8aa8becba3f4b1350" dependencies = [ "duplicate", "maybe-async", @@ -1215,6 +2198,53 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "boundless-market" +version = "1.2.0" +dependencies = [ + "alloy", + "alloy-chains", + "alloy-primitives", + "alloy-sol-types", + "anyhow", + "async-stream", + "async-trait", + "aws-sdk-s3", + "blake3", + "borsh", + "bytemuck", + "chrono", + "clap", + "dashmap", + "derive_builder", + "futures", + "futures-util", + "hex", + "httpmock", + "rand 0.9.2", + "reqwest", + "risc0-aggregation", + "risc0-binfmt", + "risc0-circuit-recursion", + "risc0-ethereum-contracts", + "risc0-zkvm", + "rmp-serde", + "serde", + "serde_json", + "sha2", + "siwe", + "tempfile", + "thiserror 2.0.16", + "time", + "tokio", + "tokio-tungstenite", + "tower", + "tracing", + "tracing-subscriber 0.3.20", + "url", + "utoipa", +] + [[package]] name = "bumpalo" version = "3.19.0" @@ -1272,6 +2302,21 @@ dependencies = [ "either", ] +[[package]] +name = "c-kzg" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + [[package]] name = "camino" version = "1.1.12" @@ -1351,9 +2396,11 @@ checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", "serde", - "windows-link", + "wasm-bindgen", + "windows-link 0.1.3", ] [[package]] @@ -1522,11 +2569,23 @@ version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "unicode-width", - "windows-sys 0.59.0", + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", +] + +[[package]] +name = "const-hex" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" +dependencies = [ + "cfg-if", + "cpufeatures", + "proptest", + "serde_core", ] [[package]] @@ -1555,6 +2614,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "core-foundation" version = "0.9.4" @@ -1749,8 +2814,10 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ + "generic-array", "rand_core 0.6.4", "subtle", + "zeroize", ] [[package]] @@ -1815,8 +2882,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] @@ -1833,17 +2910,63 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "serde", + "strsim", + "syn 2.0.106", +] + [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", "quote", "syn 2.0.106", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + [[package]] name = "deadpool" version = "0.12.3" @@ -1943,7 +3066,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ - "darling", + "darling 0.20.11", "proc-macro2", "quote", "syn 2.0.106", @@ -2019,6 +3142,16 @@ dependencies = [ "dirs-sys", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + [[package]] name = "dirs-sys" version = "0.5.0" @@ -2027,10 +3160,21 @@ checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", - "redox_users", + "redox_users 0.5.2", "windows-sys 0.60.2", ] +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users 0.4.6", + "winapi", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -2104,11 +3248,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" dependencies = [ "der 0.6.1", - "elliptic-curve", - "rfc6979", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", "signature 1.6.4", ] +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der 0.7.10", + "digest 0.10.7", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "serdect", + "signature 2.2.0", + "spki 0.7.3", +] + [[package]] name = "educe" version = "0.6.0" @@ -2142,16 +3301,36 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" dependencies = [ - "base16ct", + "base16ct 0.1.1", "crypto-bigint 0.4.9", "der 0.6.1", "digest 0.10.7", "ff 0.12.1", "generic-array", - "group", + "group 0.12.1", "pkcs8 0.9.0", "rand_core 0.6.4", - "sec1", + "sec1 0.3.0", + "subtle", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct 0.2.0", + "crypto-bigint 0.5.5", + "digest 0.10.7", + "ff 0.13.1", + "generic-array", + "group 0.13.0", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sec1 0.7.3", + "serdect", "subtle", "zeroize", ] @@ -2168,6 +3347,15 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" +[[package]] +name = "ena" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + [[package]] name = "encode_unicode" version = "1.0.0" @@ -2260,6 +3448,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "event-listener" version = "5.4.1" @@ -2271,6 +3465,16 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.1", + "pin-project-lite", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -2370,6 +3574,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "fixedbitset" version = "0.5.7" @@ -2409,6 +3619,21 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -2416,7 +3641,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -2430,6 +3655,12 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "foreign-types-shared" version = "0.3.1" @@ -2516,6 +3747,19 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.31" @@ -2557,6 +3801,12 @@ dependencies = [ "slab", ] +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + [[package]] name = "gdbstub" version = "0.7.7" @@ -2589,6 +3839,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -2644,6 +3895,18 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "group" version = "0.12.1" @@ -2655,6 +3918,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.1", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "h2" version = "0.3.27" @@ -2735,7 +4009,18 @@ checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", + "serde", + "serde_core", ] [[package]] @@ -2779,6 +4064,15 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + [[package]] name = "hex-literal" version = "0.4.1" @@ -2880,6 +4174,34 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "httpmock" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08ec9586ee0910472dec1a1f0f8acf52f0fdde93aea74d70d4a3107b4be0fd5b" +dependencies = [ + "assert-json-diff", + "async-object-pool", + "async-std", + "async-trait", + "base64 0.21.7", + "basic-cookies", + "crossbeam-utils", + "form_urlencoded", + "futures-util", + "hyper 0.14.32", + "lazy_static", + "levenshtein", + "log", + "regex", + "serde", + "serde_json", + "serde_regex", + "similar", + "tokio", + "url", +] + [[package]] name = "hyper" version = "0.14.32" @@ -2961,6 +4283,22 @@ dependencies = [ "webpki-roots 1.0.2", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.7.0", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + [[package]] name = "hyper-util" version = "0.1.16" @@ -2980,9 +4318,11 @@ dependencies = [ "percent-encoding", "pin-project-lite", "socket2 0.6.0", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] @@ -3285,35 +4625,99 @@ dependencies = [ name = "itoa" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", + "once_cell", + "serdect", + "sha2", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] [[package]] -name = "jobserver" -version = "0.1.34" +name = "kv-log-macro" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" dependencies = [ - "getrandom 0.3.3", - "libc", + "log", ] [[package]] -name = "js-sys" -version = "0.3.77" +name = "lalrpop" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" dependencies = [ - "once_cell", - "wasm-bindgen", + "ascii-canvas", + "bit-set 0.5.3", + "ena", + "itertools 0.11.0", + "lalrpop-util", + "petgraph 0.6.5", + "pico-args", + "regex", + "regex-syntax", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", + "walkdir", ] [[package]] -name = "keccak" -version = "0.1.5" +name = "lalrpop-util" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "cpufeatures", + "regex-automata", ] [[package]] @@ -3354,6 +4758,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "levenshtein" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" + [[package]] name = "libc" version = "0.2.175" @@ -3450,6 +4860,9 @@ name = "log" version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +dependencies = [ + "value-bag", +] [[package]] name = "lru" @@ -3460,12 +4873,32 @@ dependencies = [ "hashbrown 0.15.5", ] +[[package]] +name = "lru" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "lru-slab" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "malachite" version = "0.4.22" @@ -3621,7 +5054,7 @@ dependencies = [ "bitflags 2.9.4", "block", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "log", "objc", "paste", @@ -3633,6 +5066,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3671,6 +5114,23 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndarray" version = "0.16.1" @@ -3687,6 +5147,12 @@ dependencies = [ "rayon", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.29.0" @@ -3864,6 +5330,20 @@ dependencies = [ "cc", ] +[[package]] +name = "nybbles" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa11e84403164a9f12982ab728f3c67c6fd4ab5b5f0254ffc217bdbd3b28ab0" +dependencies = [ + "alloy-rlp", + "cfg-if", + "proptest", + "ruint", + "serde", + "smallvec", +] + [[package]] name = "objc" version = "0.2.7" @@ -3902,12 +5382,50 @@ version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "openssl-probe" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "openssl-sys" +version = "0.9.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -3926,8 +5444,8 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" dependencies = [ - "ecdsa", - "elliptic-curve", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", "sha2", ] @@ -4020,16 +5538,61 @@ dependencies = [ "ucd-trie", ] +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset 0.4.2", + "indexmap 2.11.0", +] + [[package]] name = "petgraph" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ - "fixedbitset", + "fixedbitset 0.5.7", "indexmap 2.11.0", ] +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -4042,6 +5605,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkcs1" version = "0.7.5" @@ -4107,6 +5681,20 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.0.8", + "windows-sys 0.61.2", +] + [[package]] name = "portable-atomic" version = "1.11.1" @@ -4159,6 +5747,12 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "prettyplease" version = "0.2.37" @@ -4189,6 +5783,28 @@ dependencies = [ "toml_edit", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "proc-macro2" version = "1.0.101" @@ -4246,6 +5862,8 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" dependencies = [ + "bit-set 0.8.0", + "bit-vec 0.8.0", "bitflags 2.9.4", "lazy_static", "num-traits", @@ -4253,6 +5871,8 @@ dependencies = [ "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", + "rusty-fork", + "tempfile", "unarray", ] @@ -4277,7 +5897,7 @@ dependencies = [ "log", "multimap", "once_cell", - "petgraph", + "petgraph 0.7.1", "prettyplease", "prost", "prost-types", @@ -4328,6 +5948,12 @@ dependencies = [ "parking_lot", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quinn" version = "0.11.9" @@ -4413,6 +6039,7 @@ dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.4", + "serde", ] [[package]] @@ -4423,6 +6050,7 @@ checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", + "serde", ] [[package]] @@ -4461,6 +6089,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.3", + "serde", ] [[package]] @@ -4533,6 +6162,17 @@ dependencies = [ "bitflags 2.9.4", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + [[package]] name = "redox_users" version = "0.5.2" @@ -4607,17 +6247,23 @@ checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64 0.22.1", "bytes", + "encoding_rs", "futures-channel", "futures-core", "futures-util", + "h2 0.4.12", "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.7.0", "hyper-rustls 0.27.7", + "hyper-tls", "hyper-util", "js-sys", "log", + "mime", + "mime_guess", + "native-tls", "percent-encoding", "pin-project-lite", "quinn", @@ -4628,6 +6274,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", + "tokio-native-tls", "tokio-rustls 0.26.2", "tokio-util", "tower", @@ -4652,6 +6299,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + [[package]] name = "ring" version = "0.17.14" @@ -4672,6 +6329,23 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3df6368f71f205ff9c33c076d170dd56ebf68e8161c733c0caa07a7a5509ed53" +[[package]] +name = "risc0-aggregation" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b37f9050c74d66eb953591e88a60f2d347e99b121e7330eabb0f29c4053d2a36" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "bytemuck", + "hex", + "risc0-binfmt", + "risc0-zkp", + "risc0-zkvm", + "serde", + "thiserror 2.0.16", +] + [[package]] name = "risc0-binfmt" version = "3.0.3" @@ -4816,7 +6490,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7ecd73a71ddce62eab8a28552ee182dc2ea08cdce2a3474a616a80bf2d6e9be" dependencies = [ "anyhow", - "bit-vec", + "bit-vec 0.8.0", "bytemuck", "byteorder", "cfg-if", @@ -4871,6 +6545,25 @@ dependencies = [ "rand_core 0.9.3", ] +[[package]] +name = "risc0-ethereum-contracts" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a604f09f459f456fd9ef4919c6efcaa6a787a6f9ffcd76cfc81eae1860584a1" +dependencies = [ + "alloy", + "alloy-primitives", + "alloy-sol-types", + "anyhow", + "cfg-if", + "hex", + "risc0-aggregation", + "risc0-zkvm", + "serde", + "thiserror 2.0.16", + "tracing", +] + [[package]] name = "risc0-groth16" version = "3.0.3" @@ -4978,6 +6671,7 @@ dependencies = [ "addr2line", "anyhow", "bincode", + "bonsai-sdk 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "borsh", "bytemuck", "bytes", @@ -5031,17 +6725,39 @@ dependencies = [ "libm", "num_enum", "paste", - "stability", + "stability", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", ] [[package]] -name = "rlp" -version = "0.5.2" +name = "rmp-serde" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" dependencies = [ - "bytes", - "rustc-hex", + "byteorder", + "rmp", + "serde", ] [[package]] @@ -5321,6 +7037,18 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +[[package]] +name = "rusty-fork" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ruzstd" version = "0.7.3" @@ -5443,7 +7171,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" dependencies = [ - "base16ct", + "base16ct 0.1.1", "der 0.6.1", "generic-array", "pkcs8 0.9.0", @@ -5451,6 +7179,42 @@ dependencies = [ "zeroize", ] +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct 0.2.0", + "der 0.7.10", + "generic-array", + "pkcs8 0.10.2", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.5", + "secp256k1-sys", + "serde", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -5516,18 +7280,28 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -5556,6 +7330,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_regex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8136f1a4ea815d7eac4101cfd0b16dc0cb5e1fe1b8609dfd728058656b7badf" +dependencies = [ + "regex", + "serde", +] + [[package]] name = "serde_spanned" version = "0.6.9" @@ -5603,12 +7387,22 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" dependencies = [ - "darling", + "darling 0.20.11", "proc-macro2", "quote", "syn 2.0.106", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct 0.2.0", + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -5637,6 +7431,26 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -5697,6 +7511,35 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "siwe" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95bdefc0eedf06440b27092fbfe33f2cb493ad6a3423aa12cfe7f2aac44bd618" +dependencies = [ + "hex", + "http 1.3.1", + "iri-string", + "k256", + "rand 0.8.5", + "serde", + "sha3", + "thiserror 1.0.69", + "time", +] + [[package]] name = "slab" version = "0.4.11" @@ -5797,7 +7640,7 @@ dependencies = [ "crc", "crossbeam-queue", "either", - "event-listener", + "event-listener 5.4.1", "futures-core", "futures-intrusive", "futures-io", @@ -5995,6 +7838,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + [[package]] name = "stringprep" version = "0.1.5" @@ -6061,6 +7916,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff790eb176cc81bb8936aed0f7b9f14fc4670069a2d371b3e3b0ecce908b2cb3" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "sync_wrapper" version = "1.0.2" @@ -6081,6 +7948,27 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.9.4", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tap" version = "1.0.1" @@ -6118,6 +8006,17 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -6206,6 +8105,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tiny_http" version = "0.10.0" @@ -6284,6 +8192,16 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.24.1" @@ -6324,6 +8242,21 @@ dependencies = [ "futures-core", "pin-project-lite", "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "native-tls", + "tokio", + "tokio-native-tls", + "tungstenite", ] [[package]] @@ -6503,6 +8436,25 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 1.3.1", + "httparse", + "log", + "native-tls", + "rand 0.8.5", + "sha1", + "thiserror 1.0.69", + "utf-8", +] + [[package]] name = "twox-hash" version = "1.6.3" @@ -6579,6 +8531,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-bidi" version = "0.3.18" @@ -6636,6 +8594,12 @@ dependencies = [ "serde", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -6648,6 +8612,29 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "utoipa" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" +dependencies = [ + "indexmap 2.11.0", + "serde", + "serde_json", + "utoipa-gen", +] + +[[package]] +name = "utoipa-gen" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "uuid" version = "1.18.1" @@ -6666,6 +8653,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "value-bag" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" + [[package]] name = "vcpkg" version = "0.2.15" @@ -6696,6 +8689,15 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -6820,6 +8822,20 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmtimer" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + [[package]] name = "web-sys" version = "0.3.77" @@ -6890,6 +8906,22 @@ dependencies = [ "safe_arch", ] +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + [[package]] name = "winapi-util" version = "0.1.10" @@ -6899,6 +8931,12 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-core" version = "0.61.2" @@ -6907,7 +8945,7 @@ checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement", "windows-interface", - "windows-link", + "windows-link 0.1.3", "windows-result", "windows-strings", ] @@ -6940,13 +8978,30 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result", + "windows-strings", +] + [[package]] name = "windows-result" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -6955,7 +9010,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -6994,6 +9049,15 @@ dependencies = [ "windows-targets 0.53.3", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -7031,7 +9095,7 @@ version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ - "windows-link", + "windows-link 0.1.3", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -7201,6 +9265,7 @@ version = "0.1.0" dependencies = [ "anyhow", "bincode", + "blake3_groth16", "bytemuck", "clap", "deadpool-redis", diff --git a/bento/Cargo.toml b/bento/Cargo.toml index 1764d9517..eb0960871 100644 --- a/bento/Cargo.toml +++ b/bento/Cargo.toml @@ -18,10 +18,14 @@ repository = "https://github.com/boundless-xyz/boundless" [workspace.dependencies] anyhow = "1.0.98" -aws-sdk-s3 = "1.34" # used for minio for max compatibility +aws-sdk-s3 = "1.34" # used for minio for max compatibility bento-client = { path = "crates/bento-client" } bincode = "1.3.3" -bonsai-sdk = { version = "1.4.1", features = ["non_blocking"] } +blake3_groth16 = { path = "../blake3_groth16", default-features = false } +bonsai-sdk = { git = "https://github.com/risc0/risc0", branch = "flaub/shrink-bitvm2", features = [ + "non_blocking", + "shrink_bitvm2", +] } bytemuck = "1.16" clap = { version = "4.5", features = ["derive", "env"] } deadpool-redis = "0.15" diff --git a/bento/crates/api/src/lib.rs b/bento/crates/api/src/lib.rs index 0f047dfaa..2ae0f0657 100644 --- a/bento/crates/api/src/lib.rs +++ b/bento/crates/api/src/lib.rs @@ -28,8 +28,9 @@ use workflow_common::{ CompressType, ExecutorReq, SNARK_RETRIES_DEFAULT, SNARK_TIMEOUT_DEFAULT, SnarkReq as WorkflowSnarkReq, TaskType, s3::{ - ELF_BUCKET_DIR, GROTH16_BUCKET_DIR, INPUT_BUCKET_DIR, PREFLIGHT_JOURNALS_BUCKET_DIR, - RECEIPT_BUCKET_DIR, S3Client, STARK_BUCKET_DIR, WORK_RECEIPTS_BUCKET_DIR, + BLAKE3_GROTH16_BUCKET_DIR, ELF_BUCKET_DIR, GROTH16_BUCKET_DIR, INPUT_BUCKET_DIR, + PREFLIGHT_JOURNALS_BUCKET_DIR, RECEIPT_BUCKET_DIR, S3Client, STARK_BUCKET_DIR, + WORK_RECEIPTS_BUCKET_DIR, }, }; @@ -621,6 +622,63 @@ async fn prove_groth16( Ok(Json(CreateSessRes { uuid: job_id.to_string() })) } +const BLAKE3_GROTH16_START_PATH: &str = "/shrink_bitvm2/create"; +async fn prove_blake3_groth16( + State(state): State>, + ExtractApiKey(api_key): ExtractApiKey, + Json(start_req): Json, +) -> Result, AppError> { + let (_aux_stream, _exec_stream, gpu_prove_stream, _gpu_coproc_stream, _gpu_join_stream) = + helpers::get_or_create_streams(&state.db_pool, &api_key) + .await + .context("Failed to get / create steams")?; + + let task_def = serde_json::to_value(TaskType::Snark(WorkflowSnarkReq { + receipt: start_req.session_id, + compress_type: CompressType::Blake3Groth16, + })) + .context("Failed to serialize ExecutorReq")?; + + let job_id = taskdb::create_job( + &state.db_pool, + &gpu_prove_stream, + &task_def, + state.snark_retries, + state.snark_timeout, + &api_key, + ) + .await + .context("Failed to create exec / init task")?; + Ok(Json(CreateSessRes { uuid: job_id.to_string() })) +} + +const BLAKE3_GROTH16_STATUS_PATH: &str = "/shrink_bitvm2/status/:job_id"; +async fn blake3_groth16_status( + State(state): State>, + ExtractApiKey(api_key): ExtractApiKey, + Path(job_id): Path, + Host(hostname): Host, +) -> Result, AppError> { + let job_state = taskdb::get_job_state(&state.db_pool, &job_id, &api_key) + .await + .context("Failed to get job state")?; + let (error_msg, output) = match job_state { + JobState::Running => (None, None), + JobState::Done => { + (None, Some(format!("http://{hostname}/receipts/shrink_bitvm2/receipt/{job_id}"))) + } + JobState::Failed => ( + Some( + taskdb::get_job_failure(&state.db_pool, &job_id) + .await + .context("Failed to get job error message")?, + ), + None, + ), + }; + Ok(Json(SnarkStatusRes { status: job_state.to_string(), error_msg, output })) +} + const SNARK_STATUS_PATH: &str = "/snark/status/:job_id"; async fn groth16_status( State(state): State>, @@ -691,6 +749,30 @@ async fn groth16_download( Ok(receipt) } +const GET_BLAKE3_GROTH16_PATH: &str = "/receipts/shrink_bitvm2/receipt/:job_id"; +async fn blake3_groth16_download( + State(state): State>, + Path(job_id): Path, +) -> Result, AppError> { + let receipt_key = format!("{RECEIPT_BUCKET_DIR}/{BLAKE3_GROTH16_BUCKET_DIR}/{job_id}.bincode"); + if !state + .s3_client + .object_exists(&receipt_key) + .await + .context("Failed to check if object exists")? + { + return Err(AppError::ReceiptMissing(job_id.to_string())); + } + + let receipt = state + .s3_client + .read_buf_from_s3(&receipt_key) + .await + .context("Failed to read from object store")?; + + Ok(receipt) +} + const GET_WORK_RECEIPT_PATH: &str = "/work-receipts/:receipt_id"; async fn get_work_receipt( State(state): State>, @@ -849,7 +931,10 @@ pub fn app(state: Arc) -> Router { .route(GET_JOURNAL_PATH, get(preflight_journal)) .route(SNARK_START_PATH, post(prove_groth16)) .route(SNARK_STATUS_PATH, get(groth16_status)) + .route(BLAKE3_GROTH16_START_PATH, post(prove_blake3_groth16)) + .route(BLAKE3_GROTH16_STATUS_PATH, get(blake3_groth16_status)) .route(GET_GROTH16_PATH, get(groth16_download)) + .route(GET_BLAKE3_GROTH16_PATH, get(blake3_groth16_download)) .route(GET_WORK_RECEIPT_PATH, get(get_work_receipt)) .route(LIST_WORK_RECEIPTS_PATH, get(list_work_receipts)) .with_state(state) diff --git a/bento/crates/workflow-common/src/lib.rs b/bento/crates/workflow-common/src/lib.rs index 8466f868b..933ab8a5a 100644 --- a/bento/crates/workflow-common/src/lib.rs +++ b/bento/crates/workflow-common/src/lib.rs @@ -34,6 +34,7 @@ pub const SNARK_TIMEOUT_DEFAULT: i32 = 60; pub enum CompressType { None, Groth16, + Blake3Groth16, } impl Default for CompressType { diff --git a/bento/crates/workflow-common/src/s3.rs b/bento/crates/workflow-common/src/s3.rs index 91d3de0ae..a8539ab6d 100644 --- a/bento/crates/workflow-common/src/s3.rs +++ b/bento/crates/workflow-common/src/s3.rs @@ -32,9 +32,12 @@ pub const PREFLIGHT_JOURNALS_BUCKET_DIR: &str = "preflight_journals"; /// Object store stark receipt dir pub const STARK_BUCKET_DIR: &str = "stark"; -/// Object store receipts groth15 dir +/// Object store receipts groth16 dir pub const GROTH16_BUCKET_DIR: &str = "groth16"; +/// Object store receipts blake3_groth16 dir +pub const BLAKE3_GROTH16_BUCKET_DIR: &str = "blake3_groth16"; + /// Object store work receipts dir pub const WORK_RECEIPTS_BUCKET_DIR: &str = "work_receipts"; diff --git a/bento/crates/workflow/Cargo.toml b/bento/crates/workflow/Cargo.toml index cfe8f5231..864c245d5 100644 --- a/bento/crates/workflow/Cargo.toml +++ b/bento/crates/workflow/Cargo.toml @@ -16,11 +16,12 @@ path = "src/bin/agent.rs" [features] default = [] -cuda = ["risc0-zkvm/cuda"] +cuda = ["risc0-zkvm/cuda", "blake3_groth16/cuda"] [dependencies] anyhow = { workspace = true } bincode = { workspace = true } +blake3_groth16 = { workspace = true, features = ["prove"] } bytemuck = { workspace = true } clap = { workspace = true, features = ["env", "derive"] } deadpool-redis = { workspace = true } @@ -31,9 +32,7 @@ prometheus_exporter = { workspace = true } rand = { workspace = true } redis = { workspace = true, features = ["tokio-rustls-comp", "tokio-comp"] } risc0-binfmt = { workspace = true } -risc0-zkvm = { workspace = true, default-features = false, features = [ - "prove", -] } +risc0-zkvm = { workspace = true, default-features = false, features = ["prove"] } serde = { workspace = true } serde_json = { workspace = true } signal-hook = "0.3" diff --git a/bento/crates/workflow/src/tasks/snark.rs b/bento/crates/workflow/src/tasks/snark.rs index 72dd03204..9645552c8 100644 --- a/bento/crates/workflow/src/tasks/snark.rs +++ b/bento/crates/workflow/src/tasks/snark.rs @@ -8,9 +8,9 @@ use anyhow::{Context as _, Result, bail}; use risc0_zkvm::{InnerReceipt, ProverOpts, Receipt}; use std::time::Instant; use workflow_common::{ - SnarkReq, SnarkResp, + CompressType, SnarkReq, SnarkResp, metrics::helpers, - s3::{GROTH16_BUCKET_DIR, RECEIPT_BUCKET_DIR, STARK_BUCKET_DIR}, + s3::{BLAKE3_GROTH16_BUCKET_DIR, GROTH16_BUCKET_DIR, RECEIPT_BUCKET_DIR, STARK_BUCKET_DIR}, }; /// Converts a stark, stored in s3 to a snark @@ -33,26 +33,54 @@ pub async fn stark2snark(agent: &Agent, job_id: &str, req: &SnarkReq) -> Result< tracing::debug!("performing identity predicate on receipt, {job_id}"); - let opts = ProverOpts::groth16(); - let snark_receipt = match agent - .prover - .as_ref() - .context("[BENTO-SNARK-002] Missing prover from resolve task")? - .compress(&opts, &receipt) - { - Ok(receipt) => { - helpers::record_task_operation("snark", "compress", "success", 0.0); - receipt + let (snark_receipt_bytes, bucket_dir) = match req.compress_type { + CompressType::None => bail!("Cannot convert to snark with no compression"), + CompressType::Groth16 => { + let groth16_receipt = match agent + .prover + .as_ref() + .context("[BENTO-SNARK-002] Missing prover from resolve task")? + .compress(&ProverOpts::groth16(), &receipt) + { + Ok(receipt) => { + helpers::record_task_operation("snark", "compress", "success", 0.0); + receipt + } + Err(e) => { + helpers::record_task_operation("snark", "compress", "error", 0.0); + return Err(e.context("groth16 compress failed")); + } + }; + if !matches!(groth16_receipt.inner, InnerReceipt::Groth16(_)) { + bail!("[BENTO-SNARK-004] failed to create groth16 receipt"); + } + groth16_receipt + .verify_integrity_with_context(&agent.verifier_ctx) + .context("[BENTO-SNARK-005] Failed to verify compressed snark receipt")?; + (bincode::serialize(&groth16_receipt)?, GROTH16_BUCKET_DIR) } - Err(e) => { - helpers::record_task_operation("snark", "compress", "error", 0.0); - return Err(e.context("groth16 compress failed")); + CompressType::Blake3Groth16 => { + let blake3_receipt = match blake3_groth16::compress_blake3_groth16(&receipt) + .await + .context("[BENTO-SNARK-007] blake3 groth16 compress failed") + { + Ok(blake3_receipt) => { + helpers::record_task_operation("snark", "compress", "success", 0.0); + blake3_receipt + } + Err(e) => { + helpers::record_task_operation("snark", "compress", "error", 0.0); + return Err(e.context("blake3 groth16 compress failed")); + } + }; + blake3_receipt + .verify_integrity() + .context("[BENTO-SNARK-008] Failed to verify blake3 snark receipt")?; + (bincode::serialize(&blake3_receipt)?, BLAKE3_GROTH16_BUCKET_DIR) } }; - if !matches!(snark_receipt.inner, InnerReceipt::Groth16(_)) { - bail!("[BENTO-SNARK-004] failed to create groth16 receipt"); - } + let key = &format!("{RECEIPT_BUCKET_DIR}/{bucket_dir}/{job_id}.bincode"); receipt .verify_integrity_with_context(&agent.verifier_ctx) @@ -62,7 +90,7 @@ pub async fn stark2snark(agent: &Agent, job_id: &str, req: &SnarkReq) -> Result< tracing::info!("Uploading snark receipt to S3: {key}"); let s3_write_start = Instant::now(); - match agent.s3_client.write_to_s3(key, snark_receipt).await { + match agent.s3_client.write_buf_to_s3(key, snark_receipt_bytes).await { Ok(()) => { helpers::record_s3_operation( "write", diff --git a/blake3_groth16/Cargo.toml b/blake3_groth16/Cargo.toml new file mode 100644 index 000000000..4f7ec8378 --- /dev/null +++ b/blake3_groth16/Cargo.toml @@ -0,0 +1,62 @@ +[package] +name = "blake3_groth16" +version = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +repository = { workspace = true } + +[features] +default = ["std"] +std = [ + "ark-bn254/std", + "ark-groth16/std", + "ark-serialize/std", + "hex/std", + "num-bigint/std", + "num-traits/std", + "risc0-groth16/std", + "serde/std", +] +prove = [ + "std", + "risc0-zkvm/prove", + "dep:circom-witnesscalc", + "dep:num-bigint", + "dep:num-traits", + "dep:tempfile", + "dep:wtns-file", +] +cuda = ["prove", "risc0-zkvm/cuda", "risc0-groth16/cuda", "dep:risc0-groth16-sys"] + +[dependencies] +anyhow = { workspace = true } +ark-bn254 = { version = "0.5.0", default-features = false } +ark-ff = { version = "0.5.0", default-features = false } +ark-groth16 = { version = "0.5.0", default-features = false } +ark-serialize = { version = "0.5.0", default-features = false } +borsh = { workspace = true, features = ["derive"] } +boundless-market = { workspace = true } +risc0-groth16 = { workspace = true, default-features = false } +risc0-zkvm = { workspace = true, default-features = false } +serde = { workspace = true, features = ["alloc", "derive"] } +serde_json = { workspace = true } + +# Host dependencies +[target.'cfg(not(target_os = "zkvm"))'.dependencies] +bincode = { workspace = true } +bonsai-sdk = { workspace = true, features = ["non_blocking", "shrink_bitvm2"] } +circom-witnesscalc = { version = "0.2.1", optional = true } +hex = { workspace = true } +num-bigint = { version = "0.4", features = ["std"], optional = true } +num-traits = { version = "0.2.19", optional = true } +risc0-groth16-sys = { workspace = true, optional = true } +risc0-zkp = { workspace = true } +risc0-zkvm = { workspace = true, default-features = false, features = ["bonsai"] } +tempfile = { workspace = true, optional = true } +tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } +tracing = { workspace = true } +wtns-file = { version = "0.1.5", optional = true } + +[target.'cfg(not(target_os = "zkvm"))'.dev-dependencies] +guest-util = { workspace = true } +test-log = { workspace = true } diff --git a/blake3_groth16/README.md b/blake3_groth16/README.md new file mode 100644 index 000000000..8ca78dff3 --- /dev/null +++ b/blake3_groth16/README.md @@ -0,0 +1,30 @@ +# Boundless BLAKE3 Groth16 + +Boundless and Risc0 supports the standard Risc0 Groth16 compression which outputs the ReceiptClaim which can be hashed using SHA2 to get the claim digest. This is not ideal for environments which SHA2 hashing may be costly or impossible. + +The Chainway Labs team has written a new Groth16 circuit which has a single public output which is the BLAKE3 claim digest of a Risc0 execution. + +This repo contains components for creating such proofs and is used in Boundless to enable this type of compression. + +We use circom-witnesscalc to do witness generation and either rapidsnark or Risc0's cuda enabled Groth16 prover to generate proofs. + +## Setup + +Setting up involves downloading `circomlib`, `circom-witnesscalc`, the SRS file, and the circuits which live in a [separate repo](https://github.com/chainwayxyz/risc0-to-bitvm2) maintained by Chainway Labs. +Because we are using circom-witnesscalc, we need to perform a setup to generate the witness graph as well. All of this can be done by running + +``` +cargo xtask-blake3-groth16 +``` + +### Building Rapidsnark + +If using rapidsnark for CPU proving instead of CUDA, you will need to need to manually build rapidsnark. This is all packaged in a dockerfile. To build the rapidsnark dockerfile, run the `scripts/build-docker.sh` from this directory. + +## Proving + +The prover looks for an environment variable `BLAKE3_GROTH16_SETUP_DIR` which is the directory in which we output the artifacts from the setup step. The Bento docker container will also look for this env variable, so before running a prover, make sure to set that environment variable. + +## Proving with Bento + +If Bento is used, all of these steps will be handled for you. diff --git a/blake3_groth16/dockerfiles/rapidsnark.dockerfile b/blake3_groth16/dockerfiles/rapidsnark.dockerfile new file mode 100644 index 000000000..bd96b42d9 --- /dev/null +++ b/blake3_groth16/dockerfiles/rapidsnark.dockerfile @@ -0,0 +1,52 @@ +# syntax=docker/dockerfile:1.4 +FROM rust:1.89.0-bookworm AS dependencies +WORKDIR /src/ + +# APT deps +RUN apt -qq update && \ + apt install -y -q build-essential cmake libgmp-dev libsodium-dev nasm curl m4 git protobuf-compiler clang + +WORKDIR /src/ + +# Build rapidsnark +RUN git clone https://github.com/iden3/rapidsnark.git && \ + cd rapidsnark && \ + git checkout 808462cdcfdea6112269a4652d23999c8e4bc6d6 + +WORKDIR /src/rapidsnark/ + +RUN git submodule init && \ + git submodule update && \ + ./build_gmp.sh host && \ + make host && \ + cp ./package/bin/prover /usr/local/sbin/rapidsnark + +# Build circom-witnesscalc +RUN git clone https://github.com/iden3/circom-witnesscalc.git && \ + cd circom-witnesscalc && \ + git checkout b7ff0ffd9c72c8f60896ce131ee98a35aba96009 && \ + cargo install --path . + +WORKDIR /setup/ +# Download prover files +ADD https://staging-signal-artifacts.beboundless.xyz/v3/proving/blake3_groth16_artifacts.tar.xz blake3_groth16_artifacts.tar.xz +RUN tar -xvf blake3_groth16_artifacts.tar.xz && \ + rm blake3_groth16_artifacts.tar.xz + +# Create a final clean image with all the dependencies to perform stark->snark +FROM debian:bookworm-slim AS prover +RUN apt -qq update && \ + apt install -y -q build-essential cmake libgmp-dev libsodium-dev nasm curl m4 + +COPY --from=dependencies /usr/local/sbin/rapidsnark /usr/local/sbin/rapidsnark +COPY --from=dependencies /usr/local/cargo/bin/calc-witness /usr/local/sbin/calc-witness + +WORKDIR /setup/ +COPY --from=dependencies /setup/blake3_groth16_artifacts/verify_for_guest_graph.bin . +COPY --from=dependencies /setup/blake3_groth16_artifacts/verify_for_guest_final.zkey . + +WORKDIR /app/ +COPY scripts/prove.sh prove.sh +RUN chmod +x /app/prove.sh + +ENTRYPOINT ["/app/prove.sh"] \ No newline at end of file diff --git a/blake3_groth16/scripts/build-docker.sh b/blake3_groth16/scripts/build-docker.sh new file mode 100755 index 000000000..38be790ef --- /dev/null +++ b/blake3_groth16/scripts/build-docker.sh @@ -0,0 +1 @@ +docker build -t boundless-blake3-g16:latest -f dockerfiles/rapidsnark.dockerfile . \ No newline at end of file diff --git a/blake3_groth16/scripts/prove.sh b/blake3_groth16/scripts/prove.sh new file mode 100644 index 000000000..9630fc69f --- /dev/null +++ b/blake3_groth16/scripts/prove.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +set -eoux + +ulimit -s 16384 +calc-witness /setup/verify_for_guest_graph.bin /mnt/input.json output.wtns +rapidsnark /setup/verify_for_guest_final.zkey output.wtns /mnt/proof.json /mnt/public.json \ No newline at end of file diff --git a/blake3_groth16/src/lib.rs b/blake3_groth16/src/lib.rs new file mode 100644 index 000000000..496882ffc --- /dev/null +++ b/blake3_groth16/src/lib.rs @@ -0,0 +1,156 @@ +// Copyright 2025 Boundless Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#[cfg(not(target_os = "zkvm"))] +use anyhow::{Context, Result}; +pub use boundless_market::blake3_groth16::Blake3Groth16ReceiptClaim; +pub use receipt::*; +#[cfg(not(target_os = "zkvm"))] +pub use risc0_groth16::{ProofJson as Groth16ProofJson, Seal as Groth16Seal}; +#[cfg(not(target_os = "zkvm"))] +use risc0_zkvm::{default_prover, sha::Digestible, InnerReceipt, MaybePruned, Receipt}; + +#[cfg(all(feature = "prove", not(target_os = "zkvm")))] +use risc0_zkvm::ProverOpts; + +#[cfg(all(feature = "prove", not(target_os = "zkvm")))] +mod prove; +pub mod receipt; + +pub mod verify; + +#[cfg(not(target_os = "zkvm"))] +/// Compresses a Receipt into a BLAKE3 Groth16 Receipt. +pub async fn compress_blake3_groth16(receipt: &Receipt) -> Result { + tracing::debug!("Compressing receipt to blake3 groth16"); + if is_dev_mode() { + println!("RISC0_DEV_MODE is set, skipping actual blake3 groth16 compression and returning fake receipt"); + let mut receipt = receipt.clone(); + let blake3_claim_digest = Blake3Groth16ReceiptClaim::try_from( + receipt.claim()?.value().context("receipt claim must not be pruned")?, + )? + .digest(); + if let InnerReceipt::Fake(fake_receipt) = &mut receipt.inner { + fake_receipt.claim = MaybePruned::Pruned(blake3_claim_digest) + } else { + return Err(anyhow::anyhow!( + "RISC0_DEV_MODE blake3_groth16 compression can only be used on fake receipts" + )); + } + return receipt.try_into(); + } + if default_prover().get_name() == "bonsai" { + let client = bonsai_sdk::non_blocking::Client::from_env(risc0_zkvm::VERSION)?; + tracing::info!("Using bonsai to compress to blake3 groth16"); + return compress_blake3_groth16_bonsai(&client, receipt).await; + } + let _receipt = receipt.clone(); + + #[cfg(not(feature = "prove"))] + { + Err(anyhow::anyhow!( + "blake3_groth16 must be built with the 'prove' feature to compress receipts locally" + )) + } + + #[cfg(feature = "prove")] + tokio::task::spawn_blocking(move || { + let receipt = _receipt; + let succinct_receipt = default_prover().compress(&ProverOpts::succinct(), &receipt)?; + tracing::debug!("Succinct receipt created, proceeding to convert to blake3 groth16"); + let receipt = succinct_receipt.clone(); + let journal: [u8; 32] = receipt + .journal + .bytes + .as_slice() + .try_into() + .context("invalid journal length, expected 32 bytes for shrink blake3")?; + let seal = prove::succinct_to_blake3_groth16( + receipt + .inner + .succinct() + .context("compressing to blake3 groth16 requires a succinct receipt")?, + journal, + )?; + let seal: Groth16Seal = seal.try_into()?; + let blake3_receipt = Blake3Groth16Receipt::finalize(receipt.claim()?, seal.to_vec())?; + Ok(blake3_receipt) + }) + .await? +} + +#[cfg(not(target_os = "zkvm"))] +async fn compress_blake3_groth16_bonsai( + client: &bonsai_sdk::non_blocking::Client, + succinct_receipt: &Receipt, +) -> Result { + let encoded_receipt = bincode::serialize(succinct_receipt)?; + let receipt_id = client.upload_receipt(encoded_receipt).await?; + let snark_id = client.shrink_bitvm2(receipt_id).await?; + loop { + let status = snark_id.status(client).await?; + match status.status.as_ref() { + "RUNNING" => { + tokio::time::sleep(tokio::time::Duration::from_millis(500)).await; + continue; + } + "SUCCEEDED" => { + let receipt_buf = client.download(&status.output.unwrap()).await?; + let snark_receipt: Blake3Groth16Receipt = bincode::deserialize(&receipt_buf)?; + return Ok(snark_receipt); + } + status_code => { + let err_msg = status.error_msg.unwrap_or_default(); + return Err(anyhow::anyhow!( + "snark proving failed with status {status_code}: {err_msg}" + )); + } + } + } +} + +#[cfg(not(target_os = "zkvm"))] +fn is_dev_mode() -> bool { + std::env::var("RISC0_DEV_MODE") + .ok() + .map(|x| x.to_lowercase()) + .filter(|x| x == "1" || x == "true" || x == "yes") + .is_some() +} + +#[cfg(all(test, not(target_os = "zkvm")))] +mod tests { + use super::*; + use guest_util::ECHO_ELF; + use risc0_zkvm::{default_prover, sha::Digestible, ExecutorEnv, ProverOpts}; + + #[tokio::test] + #[test_log::test] + async fn test_succinct_to_blake3_groth16() { + use guest_util::ECHO_ID; + + let input = [3u8; 32]; + + let env = ExecutorEnv::builder().write_slice(&input).build().unwrap(); + tracing::info!("Proving echo program to get initial receipt"); + let prover = default_prover(); + // Produce a receipt by proving the specified ELF binary. + let receipt = + prover.prove_with_opts(env, ECHO_ELF, &ProverOpts::succinct()).unwrap().receipt; + tracing::info!("Initial receipt created, compressing to blake3_groth16"); + let blake3_receipt = compress_blake3_groth16(&receipt).await.unwrap(); + let blake3_claim_digest = Blake3Groth16ReceiptClaim::ok(ECHO_ID, input.to_vec()).digest(); + assert_eq!(blake3_receipt.claim_digest().unwrap(), blake3_claim_digest); + blake3_receipt.verify(ECHO_ID).expect("verification failed"); + } +} diff --git a/blake3_groth16/src/prove.rs b/blake3_groth16/src/prove.rs new file mode 100644 index 000000000..eec2dce60 --- /dev/null +++ b/blake3_groth16/src/prove.rs @@ -0,0 +1,131 @@ +// Copyright 2025 Boundless Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::path::Path; + +use anyhow::{Context, Result}; +use num_bigint::BigUint; +use num_traits::Num; +use risc0_groth16::{prove::to_json as seal_to_json, ProofJson as Groth16ProofJson}; +use risc0_zkvm::sha::Digestible; +use risc0_zkvm::{ProverOpts, ReceiptClaim, SuccinctReceipt}; +use tempfile::tempdir; + +#[cfg(feature = "cuda")] +pub(crate) mod cuda; +#[cfg(not(feature = "cuda"))] +pub(crate) mod docker; + +/// Creates a BLAKE3 Groth16 proof from a Risc0 SuccinctReceipt. +/// It will first run the identity_p254 program to convert the STARK to BN254, +/// which is more efficient to verify. +pub(crate) fn succinct_to_blake3_groth16( + succinct_receipt: &SuccinctReceipt, + journal: [u8; 32], +) -> Result { + let p254_receipt = risc0_zkvm::get_prover_server(&ProverOpts::default())? + .identity_p254(succinct_receipt) + .context("failed to create p254 receipt")?; + shrink_wrap(&p254_receipt, journal) +} + +/// Creates a BLAKE3 Groth16 proof from a identity p254 Risc0 SuccinctReceipt. +pub(crate) fn shrink_wrap( + p254_receipt: &SuccinctReceipt, + journal: [u8; 32], +) -> Result { + let seal_json = identity_seal_json(journal, p254_receipt)?; + + let tmp_dir = tempdir().context("failed to create temporary directory")?; + let work_dir = std::env::var("BLAKE3_GROTH16_WORK_DIR"); + let work_dir: &Path = work_dir.as_ref().map(Path::new).unwrap_or(tmp_dir.path()); + + #[cfg(feature = "cuda")] + let proof_json = cuda::shrink_wrap(work_dir, seal_json)?; + #[cfg(not(feature = "cuda"))] + let proof_json = docker::shrink_wrap(work_dir, seal_json)?; + + Ok(proof_json) +} + +pub(crate) fn identity_seal_json( + journal_bytes: [u8; 32], + p254_receipt: &SuccinctReceipt, +) -> Result { + let seal_bytes = p254_receipt.get_seal_bytes(); + let seal_json = seal_to_json(seal_bytes.as_slice())?; + let mut seal_json: serde_json::Value = serde_json::from_str(&seal_json)?; + + let mut journal_bits = Vec::new(); + for byte in journal_bytes { + for i in 0..8 { + journal_bits.push((byte >> (7 - i)) & 1); + } + } + let receipt_claim = p254_receipt.claim.as_value().unwrap(); + let pre_state_digest_bits: Vec<_> = receipt_claim + .pre + .digest() + .as_bytes() + .iter() + .flat_map(|&byte| (0..8).rev().map(move |i| ((byte >> i) & 1).to_string())) + .collect(); + + let post_state_digest_bits: Vec<_> = receipt_claim + .post + .digest() + .as_bytes() + .iter() + .flat_map(|&byte| (0..8).rev().map(move |i| ((byte >> i) & 1).to_string())) + .collect(); + + let mut id_bn254_fr_bits: Vec = p254_receipt + .control_id + .as_bytes() + .iter() + .flat_map(|&byte| (0..8).rev().map(move |i| ((byte >> i) & 1).to_string())) + .collect(); + // remove 248th and 249th bits + id_bn254_fr_bits.remove(248); + id_bn254_fr_bits.remove(248); + + let mut succinct_control_root_bytes: [u8; 32] = + risc0_zkvm::SuccinctReceiptVerifierParameters::default() + .control_root + .as_bytes() + .try_into()?; + + succinct_control_root_bytes.reverse(); + let succinct_control_root_hex = hex::encode(succinct_control_root_bytes); + + let a1_str = succinct_control_root_hex[0..32].to_string(); + let a0_str = succinct_control_root_hex[32..64].to_string(); + let a0_dec = to_decimal(&a0_str).context("a0_str returned None")?; + let a1_dec = to_decimal(&a1_str).context("a1_str returned None")?; + + let control_root = vec![a0_dec, a1_dec]; + + seal_json["journal_digest_bits"] = journal_bits.into(); + seal_json["pre_state_digest_bits"] = pre_state_digest_bits.into(); + seal_json["post_state_digest_bits"] = post_state_digest_bits.into(); + seal_json["id_bn254_fr_bits"] = id_bn254_fr_bits.into(); + seal_json["control_root"] = control_root.into(); + + Ok(seal_json) +} + +fn to_decimal(s: &str) -> Option { + let int = BigUint::from_str_radix(s, 16).ok(); + int.map(|n| n.to_str_radix(10)) +} diff --git a/blake3_groth16/src/prove/cuda.rs b/blake3_groth16/src/prove/cuda.rs new file mode 100644 index 000000000..80d80b733 --- /dev/null +++ b/blake3_groth16/src/prove/cuda.rs @@ -0,0 +1,70 @@ +// Copyright 2025 Boundless Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::{io::Cursor, path::Path}; + +use anyhow::{anyhow, Context as _, Result}; +use risc0_groth16::ProofJson as Groth16ProofJson; +use risc0_groth16_sys::{ProverParams, SetupParams, WitnessParams}; + +struct CalcWitness { + witness: Vec>, +} + +impl CalcWitness { + fn as_ptr(&self) -> *const u8 { + self.witness.as_ptr() as *const u8 + } +} + +fn calculate_witness(graph_path: &Path, inputs: &str) -> Result { + tracing::debug!("blake3 groth16 calculate_witness"); + let graph = std::fs::read(graph_path)?; + let witness_encoded = circom_witnesscalc::calc_witness(inputs, &graph) + .map_err(|err| anyhow!("witness failure: {err}"))?; + let wtns_f = wtns_file::WtnsFile::read(Cursor::new(witness_encoded))?; + Ok(CalcWitness { witness: wtns_f.witness.0 }) +} + +pub fn shrink_wrap( + work_dir: &Path, + identity_seal_json: serde_json::Value, +) -> Result { + tracing::info!("blake3 shrink_wrap with cuda"); + let root_dir = std::env::var("BLAKE3_GROTH16_SETUP_DIR"); + let root_dir = root_dir.as_ref().map(Path::new).expect("must provide BLAKE3_GROTH16_SETUP_DIR"); + + let mut setup_params = + SetupParams::new(root_dir).context("failed to create groth16 work directories")?; + setup_params.srs_path = root_dir.join("verify_for_guest_final.zkey").try_into()?; + + let mut witness_params = WitnessParams::new(root_dir); + witness_params.graph_path = root_dir.join("verify_for_guest_graph.bin"); + + let witness = + calculate_witness(&witness_params.graph_path, identity_seal_json.to_string().as_str())?; + + { + let _lock = risc0_zkp::hal::cuda::singleton().lock(); + + let prover_params = ProverParams::new(work_dir, witness.as_ptr()) + .context("failed to create groth16 prover parameters")?; + risc0_groth16_sys::prove(&prover_params, &setup_params) + .context("failed to run groth16 prove operation")?; + + let contents = std::fs::read_to_string(prover_params.proof_path.as_path()) + .context("failed to read groth16 prove output file")?; + serde_json::from_str(&contents).context("failed to decode groth16 prove output file JSON") + } +} diff --git a/blake3_groth16/src/prove/docker.rs b/blake3_groth16/src/prove/docker.rs new file mode 100644 index 000000000..c335fbfdc --- /dev/null +++ b/blake3_groth16/src/prove/docker.rs @@ -0,0 +1,68 @@ +// Copyright 2025 Boundless Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::{path::Path, process::ExitStatus}; + +use anyhow::{anyhow, bail, Result}; +use risc0_groth16::ProofJson as Groth16ProofJson; +use std::process::Command; + +pub fn shrink_wrap( + work_dir: &Path, + identity_seal_json: serde_json::Value, +) -> Result { + tracing::debug!("blake3 shrink_wrap with docker rapidsnark"); + if !is_docker_installed() { + bail!("Please install docker first.") + } + + let proof_path = work_dir.join("proof.json"); + let input_path = work_dir.join("input.json"); + std::fs::write(&input_path, identity_seal_json.to_string())?; + + let output = Command::new("docker") + .arg("run") + .arg("--rm") + .arg("-v") + .arg(format!("{}:/mnt", work_dir.display())) + .arg("boundless-blake3-g16:latest") + .output()?; + if !output.status.success() { + return Err(error_from_status(output.status)); + } + + let proof_content = std::fs::read_to_string(&proof_path)?; + + let proof_json: Groth16ProofJson = + serde_json::from_str(proof_content.trim_matches(char::from(0)))?; + + Ok(proof_json) +} + +fn is_docker_installed() -> bool { + Command::new("docker") + .arg("--version") + .output() + .map(|output| output.status.success()) + .unwrap_or(false) +} + +fn error_from_status(status: ExitStatus) -> anyhow::Error { + let err = anyhow!("docker returned failure exit code: {:?}", status.code()); + // Add a hint to the error context for certain error codes. + match status.code() { + Some(126) => err.context("This process may not have permission to run containers."), + _ => err, + } +} diff --git a/blake3_groth16/src/receipt.rs b/blake3_groth16/src/receipt.rs new file mode 100644 index 000000000..5c84caccc --- /dev/null +++ b/blake3_groth16/src/receipt.rs @@ -0,0 +1,213 @@ +// Copyright 2025 Boundless Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate alloc; + +use alloc::vec::Vec; +use anyhow::{bail, Context, Result}; +use borsh::{BorshDeserialize, BorshSerialize}; +pub use risc0_groth16::{ProofJson as Groth16ProofJson, Seal as Groth16Seal}; +use risc0_zkvm::{ + sha::Digestible, Digest, Groth16Receipt, InnerReceipt, MaybePruned, Receipt, ReceiptClaim, +}; +use serde::{Deserialize, Serialize}; + +use crate::{is_dev_mode, Blake3Groth16ReceiptClaim}; + +#[derive(Clone, Debug, Deserialize, Serialize, BorshSerialize, BorshDeserialize)] +pub struct Blake3Groth16Receipt { + journal: [u8; 32], + claim: MaybePruned, + inner: InnerReceipt, +} + +impl Blake3Groth16Receipt { + /// Verify that this receipt proves a successful execution of the zkVM from + /// the given `image_id`. + pub fn verify(&self, image_id: impl Into) -> Result<()> { + self.verify_with_context(&crate::verify::verifier_parameters(), image_id) + } + + /// Verify that this receipt proves a successful execution of the zkVM from the given + /// `image_id`. + pub fn verify_with_context( + &self, + params: &risc0_zkvm::Groth16ReceiptVerifierParameters, + image_id: impl Into, + ) -> Result<()> { + self.verify_integrity_with_context(params)?; + + let expected_claim = Blake3Groth16ReceiptClaim::ok(image_id, self.journal.to_vec()); + if self.claim_digest()? != expected_claim.digest() { + tracing::debug!("blake3 receipt claim does not match expected claim:\nreceipt: {:#?}\nexpected: {:#?}", expected_claim.digest(), self.claim.digest()); + return Err(anyhow::anyhow!( + "blake3 groth16 claim digest mismatch: + expected: {}, + received: {}, + ", + expected_claim.digest(), + self.claim_digest()? + )); + } + + Ok(()) + } + + /// Verify the integrity of this receipt, ensuring the claim and journal + /// are attested to by the seal. + pub fn verify_integrity(&self) -> Result<()> { + let params = crate::verify::verifier_parameters(); + self.verify_integrity_with_context(¶ms) + } + + /// Verify the integrity of this receipt, ensuring the claim and journal + /// are attested to by the seal. + pub fn verify_integrity_with_context( + &self, + params: &risc0_zkvm::Groth16ReceiptVerifierParameters, + ) -> Result<()> { + if is_dev_mode() { + return Ok(()); + } + if params.digest() != self.inner.verifier_parameters() { + return Err(anyhow::anyhow!( + "verifier parameters digest mismatch: + expected: {}, + received: {}, + ", + params.digest(), + self.inner.verifier_parameters() + )); + } + if self.journal.as_slice() + != self.claim.as_value().context("blake3 claim must not be pruned")?.journal.as_slice() + { + return Err(anyhow::anyhow!("journal in receipt does not match journal in claim")); + } + crate::verify::verify_seal(self.seal()?, self.claim.digest())?; + Ok(()) + } + + /// Verifies the BLAKE3 Groth16Seal against the BLAKE3 claim digest and wraps it in a Receipt. + #[cfg(feature = "prove")] + pub(crate) fn finalize( + receipt_claim: MaybePruned, + seal: Vec, + ) -> Result { + let receipt_claim_value = + receipt_claim.as_value().context("receipt claim must not be pruned")?.clone(); + + let blake3_claim = Blake3Groth16ReceiptClaim::try_from(receipt_claim_value)?; + let journal: [u8; 32] = blake3_claim + .journal + .as_slice() + .try_into() + .context("invalid journal length, expected 32 bytes for blake3 groth16")?; + + let blake3_claim_digest = blake3_claim.digest(); + crate::verify::verify_seal(&seal, blake3_claim_digest)?; + + let verifier_parameters = crate::verify::verifier_parameters(); + let groth16_receipt = + Groth16Receipt::new(seal.to_vec(), receipt_claim, verifier_parameters.digest()); + let inner = InnerReceipt::Groth16(groth16_receipt); + let receipt = Blake3Groth16Receipt { journal, claim: blake3_claim.into(), inner }; + Ok(receipt) + } + + pub fn claim_digest(&self) -> Result { + if is_dev_mode() { + if let InnerReceipt::Fake(fake_receipt) = &self.inner { + return Ok(fake_receipt.claim.digest()); + } else { + bail!( + "RISC0_DEV_MODE blake3_groth16 claim digest can only be used on fake receipts" + ); + } + } + Ok(self.claim.digest()) + } + + fn groth16(&self) -> Result<&Groth16Receipt> { + if let InnerReceipt::Groth16(groth16_receipt) = &self.inner { + Ok(groth16_receipt) + } else { + Err(anyhow::anyhow!("Expected Groth16 InnerReceipt, found different variant")) + } + } + + pub fn seal(&self) -> Result<&Vec> { + Ok(&self.groth16()?.seal) + } +} + +impl From for Receipt { + fn from(value: Blake3Groth16Receipt) -> Self { + if is_dev_mode() { + Receipt::new( + InnerReceipt::Fake(risc0_zkvm::FakeReceipt::new(MaybePruned::Pruned( + value.claim.digest(), + ))), + value.journal.to_vec(), + ) + } else { + Receipt::new(value.inner, value.journal.to_vec()) + } + } +} + +impl TryFrom for Blake3Groth16Receipt { + type Error = anyhow::Error; + + fn try_from(receipt: Receipt) -> Result { + let journal: [u8; 32] = receipt + .journal + .bytes + .as_slice() + .try_into() + .context("invalid journal length, expected 32 bytes for blake3 groth16")?; + + if is_dev_mode() { + println!("RISC0_DEV_MODE is set, skipping actual blake3 groth16 compression and returning fake receipt"); + if let InnerReceipt::Fake(fake_receipt) = &receipt.inner { + return Ok(Blake3Groth16Receipt { + journal, + claim: MaybePruned::Pruned(fake_receipt.claim.digest()), + inner: receipt.inner, + }); + } else { + return Err(anyhow::anyhow!( + "RISC0_DEV_MODE blake3_groth16 compression can only be used on fake receipts" + )); + } + } + if let InnerReceipt::Groth16(groth16_receipt) = receipt.inner { + let claim = Blake3Groth16ReceiptClaim::try_from( + groth16_receipt + .claim + .as_value() + .context("receipt claim must not be pruned")? + .clone(), + )? + .clone(); + Ok(Blake3Groth16Receipt { + journal, + claim: claim.into(), + inner: InnerReceipt::Groth16(groth16_receipt), + }) + } else { + Err(anyhow::anyhow!("Expected Groth16 InnerReceipt, found different variant")) + } + } +} diff --git a/blake3_groth16/src/verify.rs b/blake3_groth16/src/verify.rs new file mode 100644 index 000000000..c21761a8c --- /dev/null +++ b/blake3_groth16/src/verify.rs @@ -0,0 +1,161 @@ +// Copyright 2025 Boundless Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate alloc; + +use alloc::vec; +use anyhow::{ensure, Result}; +use ark_bn254::{Fq, Fq2, G1Affine, G2Affine}; +use ark_ff::PrimeField; +use ark_serialize::CanonicalSerialize; +use risc0_zkvm::Digest; +use std::str::FromStr; + +// Constants from: risc0-ethereum/contracts/src/blake3/Groth16Verifier.sol +// When running a new ceremony, update them by running cargo xtask bootstrap-blake3-groth16 +// after updating the new Groth16Verifier.sol on the risc0-ethereum repo. +const ALPHA_X: &str = + "16428432848801857252194528405604668803277877773566238944394625302971855135431"; +const ALPHA_Y: &str = + "16846502678714586896801519656441059708016666274385668027902869494772365009666"; +const BETA_X1: &str = + "3182164110458002340215786955198810119980427837186618912744689678939861918171"; +const BETA_X2: &str = + "16348171800823588416173124589066524623406261996681292662100840445103873053252"; +const BETA_Y1: &str = + "4920802715848186258981584729175884379674325733638798907835771393452862684714"; +const BETA_Y2: &str = + "19687132236965066906216944365591810874384658708175106803089633851114028275753"; +const GAMMA_X1: &str = + "11559732032986387107991004021392285783925812861821192530917403151452391805634"; +const GAMMA_X2: &str = + "10857046999023057135944570762232829481370756359578518086990519993285655852781"; +const GAMMA_Y1: &str = + "4082367875863433681332203403145435568316851327593401208105741076214120093531"; +const GAMMA_Y2: &str = + "8495653923123431417604973247489272438418190587263600148770280649306958101930"; +const DELTA_X1: &str = + "18786665442134809547367793008388252094276956707083189371748822844215202271178"; +const DELTA_X2: &str = + "17296777349791701671871010047490559682924748762983962242018229225890177681165"; +const DELTA_Y1: &str = + "21546884238630900902634517213362010321565339505810557359182294051078510536811"; +const DELTA_Y2: &str = + "7214627676570978956115414107903354102221009447018809863680303520130992055423"; + +const IC0_X: &str = "1396989810128049774239906514097458055670219613079348950494410066757721605523"; +const IC0_Y: &str = "20069629286434534534516684991063672335613842540347999544849171590987775766961"; +const IC1_X: &str = "19282603452922066135228857769519044667044696173320493211119861249451600114594"; +const IC1_Y: &str = "11966256187809052800087108088094647243345273965264062329687482664981607072161"; + +/// Verifies the soundness of a Groth16Seal against the BLAKE3 claim digest. +pub fn verify_seal(seal_bytes: &[u8], blake3_claim_digest: impl Into) -> Result<()> { + let ark_proof = from_seal(seal_bytes); + let public_input_scalar = + ark_bn254::Fr::from_be_bytes_mod_order(blake3_claim_digest.into().as_ref()); + let ark_vk = get_ark_verifying_key(); + let ark_pvk = ark_groth16::prepare_verifying_key(&ark_vk); + let res = ark_groth16::Groth16::::verify_proof( + &ark_pvk, + &ark_proof, + &[public_input_scalar], + ) + .unwrap(); + ensure!(res, "proof verification failed"); + Ok(()) +} + +fn get_r0_verifying_key() -> risc0_groth16::VerifyingKey { + let ark_key = get_ark_verifying_key(); + let mut b = vec![]; + ark_key.serialize_uncompressed(&mut b).unwrap(); + let j = serde_json::to_string(&b).expect("Failed to serialize verification key to JSON"); + let vk: risc0_groth16::VerifyingKey = + serde_json::from_str(j.as_str()).expect("failed to parse JSON"); + vk +} + +pub fn verifier_parameters() -> risc0_zkvm::Groth16ReceiptVerifierParameters { + let vk: risc0_groth16::VerifyingKey = get_r0_verifying_key(); + risc0_zkvm::Groth16ReceiptVerifierParameters { verifying_key: vk, ..Default::default() } +} + +fn from_seal(seal_bytes: &[u8]) -> ark_groth16::Proof { + use ark_bn254::{Fq, Fq2, G1Affine, G2Affine}; + use ark_ff::{Field, PrimeField}; + + let a = G1Affine::new( + Fq::from_be_bytes_mod_order(&seal_bytes[0..32]), + Fq::from_be_bytes_mod_order(&seal_bytes[32..64]), + ); + + let b = G2Affine::new( + Fq2::from_base_prime_field_elems([ + Fq::from_be_bytes_mod_order(&seal_bytes[96..128]), + Fq::from_be_bytes_mod_order(&seal_bytes[64..96]), + ]) + .unwrap(), + Fq2::from_base_prime_field_elems([ + Fq::from_be_bytes_mod_order(&seal_bytes[160..192]), + Fq::from_be_bytes_mod_order(&seal_bytes[128..160]), + ]) + .unwrap(), + ); + + let c = G1Affine::new( + Fq::from_be_bytes_mod_order(&seal_bytes[192..224]), + Fq::from_be_bytes_mod_order(&seal_bytes[224..256]), + ); + + ark_groth16::Proof { a, b, c } +} + +fn get_ark_verifying_key() -> ark_groth16::VerifyingKey { + let alpha_g1 = G1Affine::new(Fq::from_str(ALPHA_X).unwrap(), Fq::from_str(ALPHA_Y).unwrap()); + + let beta_g2 = G2Affine::new( + Fq2::new(Fq::from_str(BETA_X2).unwrap(), Fq::from_str(BETA_X1).unwrap()), + Fq2::new(Fq::from_str(BETA_Y2).unwrap(), Fq::from_str(BETA_Y1).unwrap()), + ); + + let gamma_g2 = G2Affine::new( + Fq2::new(Fq::from_str(GAMMA_X2).unwrap(), Fq::from_str(GAMMA_X1).unwrap()), + Fq2::new(Fq::from_str(GAMMA_Y2).unwrap(), Fq::from_str(GAMMA_Y1).unwrap()), + ); + + let delta_g2 = G2Affine::new( + Fq2::new(Fq::from_str(DELTA_X2).unwrap(), Fq::from_str(DELTA_X1).unwrap()), + Fq2::new(Fq::from_str(DELTA_Y2).unwrap(), Fq::from_str(DELTA_Y1).unwrap()), + ); + + let gamma_abc_g1 = vec![ + G1Affine::new(Fq::from_str(IC0_X).unwrap(), Fq::from_str(IC0_Y).unwrap()), + G1Affine::new(Fq::from_str(IC1_X).unwrap(), Fq::from_str(IC1_Y).unwrap()), + ]; + + ark_groth16::VerifyingKey { alpha_g1, beta_g2, gamma_g2, delta_g2, gamma_abc_g1 } +} + +#[cfg(test)] +mod test { + use risc0_zkvm::sha::Digestible; + + use super::*; + + #[test] + fn print_verifier_params_digest() { + let digest = verifier_parameters().digest(); + println!("Blake3 Groth16 verifier parameters digest: {}", digest); + } +} diff --git a/compose.yml b/compose.yml index be50a9bd1..d34f08b41 100644 --- a/compose.yml +++ b/compose.yml @@ -18,6 +18,9 @@ x-agent-common: &agent-common dockerfile: ${AGENT_DOCKERFILE:-dockerfiles/agent.prebuilt.dockerfile} args: BINARY_URL: ${BENTO_BINARY_URL:-https://github.com/boundless-xyz/boundless/releases/download/bento-v1.1.1/bento-bundle-linux-amd64.tar.gz} + BLAKE3_GROTH16_ARTIFACTS_URL: ${BLAKE3_GROTH16_ARTIFACTS_URL:-https://staging-signal-artifacts.beboundless.xyz/v3/proving/blake3_groth16_artifacts.tar.xz} + # If set to 1, yes, or true, the agent will expect local mounting of BLAKE3 Groth16 setup files instead of downloading + USE_LOCAL_BLAKE3_GROTH16_SETUP: ${USE_LOCAL_BLAKE3_GROTH16_SETUP:-0} restart: always depends_on: postgres: @@ -193,7 +196,12 @@ services: mem_limit: 4G cpus: 4 entrypoint: /app/agent -t prove --redis-ttl ${REDIS_TTL:-57600} - + # # Uncomment to mount local BLAKE3 Groth16 setup files instead of downloading and set USE_LOCAL_BLAKE3_GROTH16_SETUP to 1, yes, or true. + # volumes: + # - type: bind + # source: ${BLAKE3_GROTH16_SETUP_DIR} + # target: /.blake3_groth16_artifacts/ + # read_only: true # comment-out if running in CPU proving mode deploy: resources: diff --git a/contracts/scripts/Deploy.s.sol b/contracts/scripts/Deploy.s.sol index a6a6145b1..b9a165d82 100644 --- a/contracts/scripts/Deploy.s.sol +++ b/contracts/scripts/Deploy.s.sol @@ -5,13 +5,16 @@ pragma solidity ^0.8.26; -import {Script, console2} from "forge-std/Script.sol"; +import {console2} from "forge-std/Script.sol"; import {Strings} from "openzeppelin/contracts/utils/Strings.sol"; import {IRiscZeroSelectable} from "risc0/IRiscZeroSelectable.sol"; import {IRiscZeroVerifier} from "risc0/IRiscZeroVerifier.sol"; import {RiscZeroSetVerifier} from "risc0/RiscZeroSetVerifier.sol"; import {RiscZeroVerifierRouter} from "risc0/RiscZeroVerifierRouter.sol"; import {RiscZeroCheats} from "risc0/test/RiscZeroCheats.sol"; +import {RiscZeroMockVerifier} from "risc0/test/RiscZeroMockVerifier.sol"; +import {Blake3Groth16Verifier} from "../src/blake3-groth16/Blake3Groth16Verifier.sol"; +import {ControlID} from "../src/blake3-groth16/ControlID.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import {ConfigLoader, DeploymentConfig} from "./Config.s.sol"; import {BoundlessMarket} from "../src/BoundlessMarket.sol"; @@ -68,7 +71,15 @@ contract Deploy is BoundlessScriptBase, RiscZeroCheats { IRiscZeroSelectable selectable = IRiscZeroSelectable(address(_verifier)); bytes4 selector = selectable.SELECTOR(); verifierRouter.addVerifier(selector, _verifier); - + console2.log("Added Groth16 verifier to router with selector"); + console2.logBytes4(selector); + + IRiscZeroVerifier _blake3G16Verifier = deployBlake3Verifier(); + IRiscZeroSelectable blake3G16Selectable = IRiscZeroSelectable(address(_blake3G16Verifier)); + bytes4 blake3G16Selector = blake3G16Selectable.SELECTOR(); + verifierRouter.addVerifier(blake3G16Selector, _blake3G16Verifier); + console2.log("Added Blake3 Groth16 verifier to router with selector"); + console2.logBytes4(blake3G16Selector); // TODO: Create a more robust way of getting a URI for guests, and ensure that it is // in-sync with the configured image ID. string memory setBuilderPath = @@ -175,4 +186,18 @@ contract Deploy is BoundlessScriptBase, RiscZeroCheats { // Check for uncommitted changes warning checkUncommittedChangesWarning("Deployment"); } + + /// @notice Deploy either a test or fully verifying `Blake3Groth16Verifier` depending on `devMode()`. + function deployBlake3Verifier() internal returns (IRiscZeroVerifier) { + if (devMode()) { + // NOTE: Using a fixed selector of 0xFFFF0000 for the selector of the mock verifier. + IRiscZeroVerifier _verifier = new RiscZeroMockVerifier(bytes4(0xFFFF0000)); + console2.log("Deployed RiscZeroMockVerifier to", address(_verifier)); + return _verifier; + } else { + IRiscZeroVerifier _verifier = new Blake3Groth16Verifier(ControlID.CONTROL_ROOT, ControlID.BN254_CONTROL_ID); + console2.log("Deployed Blake3Groth16Verifier to", address(_verifier)); + return _verifier; + } + } } diff --git a/contracts/src/blake3-groth16/Groth16Verifier.sol b/contracts/src/blake3-groth16/Groth16Verifier.sol index 9baf9d805..093ad633d 100644 --- a/contracts/src/blake3-groth16/Groth16Verifier.sol +++ b/contracts/src/blake3-groth16/Groth16Verifier.sol @@ -165,4 +165,4 @@ contract Groth16Verifier { return(0, 0x20) } } -} \ No newline at end of file +} diff --git a/crates/boundless-cli/Cargo.toml b/crates/boundless-cli/Cargo.toml index edf5b888c..f9fe35f74 100644 --- a/crates/boundless-cli/Cargo.toml +++ b/crates/boundless-cli/Cargo.toml @@ -17,15 +17,16 @@ name = "boundless-ffi" [features] # Enables the prove feature on risc0-zkvm to build the prover directly into this CLI. -prove = ["risc0-zkvm/prove"] +prove = ["risc0-zkvm/prove", "blake3_groth16/prove"] # Enables the cuda feature on risc0-zkvm to build the prover directly into this CLI, with CUDA support. -cuda = ["prove", "risc0-zkvm/cuda"] +cuda = ["prove", "risc0-zkvm/cuda", "blake3_groth16/cuda"] [dependencies] alloy = { workspace = true, features = ["full"] } anyhow = { workspace = true } atomicwrites = "0.4.4" bincode = { workspace = true } +blake3_groth16 = { workspace = true } bonsai-sdk = { workspace = true } boundless-assessor = { workspace = true } boundless-market = { workspace = true } diff --git a/crates/boundless-cli/src/commands/requestor/submit_offer.rs b/crates/boundless-cli/src/commands/requestor/submit_offer.rs index e04fa4a5d..325086221 100644 --- a/crates/boundless-cli/src/commands/requestor/submit_offer.rs +++ b/crates/boundless-cli/src/commands/requestor/submit_offer.rs @@ -15,10 +15,9 @@ use alloy::primitives::{Address, U256}; use anyhow::{anyhow, bail, Context, Result}; use boundless_market::{ - contracts::Selector, input::GuestEnvBuilder, request_builder::{OfferParams as OfferParamsStruct, RequirementParams}, - selector::ProofType, + selector::{ProofType, SelectorExt}, storage::StorageProviderConfig, }; use clap::Args; @@ -170,8 +169,13 @@ impl RequestorSubmitOffer { } } match self.requirements.proof_type { - ProofType::Inclusion => requirements.selector(Selector::set_inclusion_latest() as u32), - ProofType::Groth16 => requirements.selector(Selector::groth16_latest() as u32), + ProofType::Inclusion => { + requirements.selector(SelectorExt::set_inclusion_latest() as u32) + } + ProofType::Groth16 => requirements.selector(SelectorExt::groth16_latest() as u32), + ProofType::Blake3Groth16 => { + requirements.selector(SelectorExt::blake3_groth16_latest() as u32) + } ProofType::Any => &mut requirements, ty => bail!("unsupported proof type provided in proof-type flag: {:?}", ty), }; diff --git a/crates/boundless-cli/src/lib.rs b/crates/boundless-cli/src/lib.rs index 9ee33eca0..474e453c5 100644 --- a/crates/boundless-cli/src/lib.rs +++ b/crates/boundless-cli/src/lib.rs @@ -34,6 +34,7 @@ use alloy::{ sol_types::{SolStruct, SolValue}, }; use anyhow::{bail, Context, Result}; +use blake3_groth16::Blake3Groth16Receipt; use boundless_assessor::{AssessorInput, Fulfillment}; use broker::{ provers::{Bonsai, DefaultProver as BrokerDefaultProver, Prover}, @@ -56,7 +57,7 @@ use boundless_market::{ Fulfillment as BoundlessFulfillment, FulfillmentData, PredicateType, RequestInputType, }, input::GuestEnv, - selector::{is_groth16_selector, SupportedSelectors}, + selector::{is_blake3_groth16_selector, is_groth16_selector, SupportedSelectors}, storage::fetch_url, ProofRequest, }; @@ -540,7 +541,6 @@ impl OrderFulfiller { ); let (req, _sig) = &orders[order_idx]; let order_seal = if is_groth16_selector(req.requirements.selector) { - // Compress the STARK proof to Groth16 let compressed_proof_id = self .prover .compress(&proof_ids[i]) @@ -559,6 +559,25 @@ impl OrderFulfiller { .context("Failed to deserialize compressed order receipt")?; encode_seal(&compressed_receipt)? + } else if is_blake3_groth16_selector(req.requirements.selector) { + let compressed_proof_id = self + .prover + .compress_blake3_groth16(&proof_ids[i]) + .await + .map_err(|e| anyhow::anyhow!("Failed to compress order proof: {}", e))?; + + let compressed_receipt_bytes = self + .prover + .get_blake3_groth16_receipt(&compressed_proof_id) + .await + .map_err(|e| anyhow::anyhow!("Failed to get compressed order receipt: {}", e))? + .ok_or_else(|| anyhow::anyhow!("Compressed order receipt not found"))?; + + let blake3_receipt: Blake3Groth16Receipt = + bincode::deserialize(&compressed_receipt_bytes) + .context("Failed to deserialize Blake3 Groth16 receipt")?; + + encode_seal(&blake3_receipt.into())? } else { order_inclusion_receipt.abi_encode_seal()? }; @@ -609,18 +628,21 @@ mod tests { primitives::{FixedBytes, Signature, U256}, signers::local::PrivateKeySigner, }; - use boundless_market::contracts::{ - eip712_domain, Offer, Predicate, ProofRequest, RequestId, RequestInput, Requirements, - UNSPECIFIED_SELECTOR, + use blake3_groth16::Blake3Groth16ReceiptClaim; + use boundless_market::{ + contracts::{ + eip712_domain, Offer, Predicate, ProofRequest, RequestId, RequestInput, Requirements, + UNSPECIFIED_SELECTOR, + }, + selector::SelectorExt, }; use boundless_test_utils::guests::{ECHO_ID, ECHO_PATH}; use boundless_test_utils::market::create_test_ctx; - use risc0_ethereum_contracts::selector::Selector; use std::sync::Arc; async fn setup_proving_request_and_signature( signer: &PrivateKeySigner, - selector: Option, + selector: Option, ) -> (ProofRequest, Signature) { let request = ProofRequest::new( RequestId::new(signer.address(), 0), @@ -651,7 +673,7 @@ mod tests { boundless_market::Client::new(ctx.customer_market.clone(), ctx.set_verifier.clone()); let signer = PrivateKeySigner::random(); let (request, signature) = - setup_proving_request_and_signature(&signer, Some(Selector::groth16_latest())).await; + setup_proving_request_and_signature(&signer, Some(SelectorExt::groth16_latest())).await; let prover: Arc = Arc::new(BrokerDefaultProver::default()); let mut fulfiller = OrderFulfiller::initialize(prover, &client).await.unwrap(); fulfiller.domain = eip712_domain(Address::ZERO, 1); @@ -674,4 +696,38 @@ mod tests { fulfiller.fulfill(&[(request, signature.as_bytes().into())]).await.unwrap(); } + + #[tokio::test] + #[ignore = "runs a proof; slow without RISC0_DEV_MODE=1"] + async fn test_fulfill_blake3_groth16_selector() { + let anvil = Anvil::new().spawn(); + let ctx = create_test_ctx(&anvil).await.unwrap(); + let client = + boundless_market::Client::new(ctx.customer_market.clone(), ctx.set_verifier.clone()); + + let input = [255u8; 32].to_vec(); // Example output data + let blake3_claim_digest = + Blake3Groth16ReceiptClaim::ok(Digest::from(ECHO_ID), input.clone()).digest(); + let signer = PrivateKeySigner::random(); + let request = ProofRequest::new( + RequestId::new(signer.address(), 0), + Requirements::new(Predicate::claim_digest_match(blake3_claim_digest)) + .with_selector(FixedBytes::from(SelectorExt::blake3_groth16_latest() as u32)), + format!("file://{ECHO_PATH}"), + RequestInput::builder().write_slice(&input).build_inline().unwrap(), + Offer::default() + .with_timeout(60) + .with_lock_timeout(30) + .with_max_price(U256::from(1000)) + .with_ramp_up_start(10), + ); + + let signature = request.sign_request(&signer, Address::ZERO, 1).await.unwrap(); + + let prover: Arc = Arc::new(BrokerDefaultProver::default()); + let mut fulfiller = OrderFulfiller::initialize(prover, &client).await.unwrap(); + fulfiller.domain = eip712_domain(Address::ZERO, 1); + + fulfiller.fulfill(&[(request, signature.as_bytes().into())]).await.unwrap(); + } } diff --git a/crates/boundless-market/Cargo.toml b/crates/boundless-market/Cargo.toml index a49ffef24..03fe74b53 100644 --- a/crates/boundless-market/Cargo.toml +++ b/crates/boundless-market/Cargo.toml @@ -14,7 +14,7 @@ rustdoc-args = ["--cfg", "docsrs"] [features] default = [] -test-utils = ["dep:risc0-circuit-recursion"] +test-utils = [] [dependencies] alloy-chains = { workspace = true } @@ -29,11 +29,24 @@ url = { workspace = true } # Host dependencies [target.'cfg(not(target_os = "zkvm"))'.dependencies] -alloy = { workspace = true, features = ["network", "node-bindings", "rpc-types", "providers", "transports", "sol-types", "contract", "signers", "signer-local", "rpc-client"] } +alloy = { workspace = true, features = [ + "network", + "node-bindings", + "rpc-types", + "providers", + "transports", + "sol-types", + "contract", + "signers", + "signer-local", + "rpc-client", +] } async-stream = { workspace = true } async-trait = "0.1" aws-sdk-s3 = "1.34" +blake3 = { version = "1.5.0" } +borsh = { workspace = true, features = ["derive"] } bytemuck = { workspace = true } chrono = { workspace = true } clap = { workspace = true } @@ -46,7 +59,8 @@ httpmock = "0.7" rand = { workspace = true } reqwest = { workspace = true, features = ["json", "multipart"] } risc0-aggregation = { workspace = true } -risc0-circuit-recursion = { workspace = true, optional = true } +risc0-binfmt = { workspace = true } +risc0-circuit-recursion = { workspace = true } risc0-ethereum-contracts = { workspace = true, features = ["unstable"] } risc0-zkvm = { workspace = true, features = ["std", "client"] } rmp-serde = { workspace = true } diff --git a/crates/boundless-market/build.rs b/crates/boundless-market/build.rs index 34d4e3b11..eba43e1f8 100644 --- a/crates/boundless-market/build.rs +++ b/crates/boundless-market/build.rs @@ -25,7 +25,7 @@ const EXCLUDE_CONTRACTS: [&str; 2] = [ ]; // Contracts to copy bytecode for. Used for deploying contracts in tests. -const ARTIFACT_TARGET_CONTRACTS: [&str; 8] = [ +const ARTIFACT_TARGET_CONTRACTS: [&str; 9] = [ "BoundlessMarket", "HitPoints", "RiscZeroMockVerifier", @@ -33,6 +33,7 @@ const ARTIFACT_TARGET_CONTRACTS: [&str; 8] = [ "ERC1967Proxy", "RiscZeroVerifierRouter", "RiscZeroGroth16Verifier", + "Blake3Groth16Verifier", "MockCallback", ]; @@ -266,6 +267,9 @@ fn get_interfaces(contract: &str) -> &str { "RiscZeroGroth16Verifier" => { r#"constructor(bytes32 control_root, bytes32 bn254_control_id) {}"# } + "Blake3Groth16Verifier" => { + r#"constructor(bytes32 control_root, bytes32 bn254_control_id) {}"# + } "MockCallback" => { r#"constructor(address verifier, address boundlessMarket, bytes32 imageId, uint256 _targetGas) {} function getCallCount() external view returns (uint256) {}"# diff --git a/crates/boundless-market/src/blake3_groth16.rs b/crates/boundless-market/src/blake3_groth16.rs new file mode 100644 index 000000000..8ceb50e2d --- /dev/null +++ b/crates/boundless-market/src/blake3_groth16.rs @@ -0,0 +1,134 @@ +// Copyright 2025 Boundless Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use anyhow::Context; +use borsh::{BorshDeserialize, BorshSerialize}; +use risc0_circuit_recursion::control_id::BN254_IDENTITY_CONTROL_ID; +use risc0_zkvm::{ + sha::{self, Digestible, Sha256, DIGEST_BYTES}, + Digest, MaybePruned, ReceiptClaim, SystemState, VerifierContext, +}; +use serde::{Deserialize, Serialize}; + +/// A claim about the guest program execution, such as the journal. +/// The digest of this is what the BLAKE3 Groth16 proof outputs. +#[derive(Clone, Debug, Serialize, Deserialize, BorshSerialize, BorshDeserialize)] +pub struct Blake3Groth16ReceiptClaim { + /// pre-state + pub pre: MaybePruned, + /// post-state + pub post: MaybePruned, + /// Note: This journal has to be exactly 32 bytes + pub journal: Vec, + /// control root + pub control_root: Digest, + /// control id + pub control_id: Digest, +} + +impl Blake3Groth16ReceiptClaim { + /// Returns the `Blake3Groth16ReceiptClaim` corresponding to the given image id and journal + pub fn ok(image_id: impl Into, journal: impl Into>) -> Self { + Self::ok_with_ctx(image_id, journal, VerifierContext::default()) + .expect("default verifier context is expected to supply succinct verifier parameters") + } + + fn ok_with_ctx( + image_id: impl Into, + journal: impl Into>, + ctx: VerifierContext, + ) -> anyhow::Result { + let verifier_params = ctx + .succinct_verifier_parameters + .as_ref() + .context("succinct verifier parameters is required but was not provided")?; + let control_root = verifier_params.control_root; + Ok(Self { + control_root, + pre: MaybePruned::Pruned(image_id.into()), + post: MaybePruned::Value(SystemState { pc: 0, merkle_root: Digest::ZERO }), + control_id: BN254_IDENTITY_CONTROL_ID, + journal: journal.into(), + }) + } + + /// Returns the digest of the claim. + pub fn claim_digest(&self) -> Digest { + self.claim_digest_inner::() + } + + // Implementation of the claim digest using the provided generic implementation of + // SHA-256. There is no known reason to use an implemention other than the one provided as + // risc0-zkvm::sha::Impl, so this method is not exported. + fn claim_digest_inner(&self) -> Digest { + // Byte-order of the control root is reversed for usage in the recursive verifier circuit. + // NOTE: In this case, the root is a Poseidon hash using BN-254 scalar field. + let mut control_root_bytes: [u8; 32] = self.control_root.as_bytes().try_into().unwrap(); + for byte in &mut control_root_bytes { + *byte = byte.reverse_bits(); + } + + let mut buffer = [0u8; DIGEST_BYTES * 4]; + let (buffer_chunks, &mut []) = buffer.as_chunks_mut::() else { + unreachable!() + }; + + buffer_chunks[0] = control_root_bytes; + buffer_chunks[1] = self.pre.digest().into(); + buffer_chunks[2] = self.post.digest().into(); + buffer_chunks[3] = self.control_id.into(); + + let output_prefix = S::hash_bytes(&buffer); + + // final blake3 hash + let mut hasher = blake3::Hasher::new(); + hasher.update(output_prefix.as_bytes()); + hasher.update(&self.journal); + + let mut digest_bytes: [u8; 32] = hasher.finalize().into(); + // trim to 31 bytes + digest_bytes[31] = 0; + // shift because of endianness + digest_bytes.rotate_right(1); + digest_bytes.into() + } +} + +impl risc0_binfmt::Digestible for Blake3Groth16ReceiptClaim { + fn digest(&self) -> Digest { + self.claim_digest_inner::() + } +} + +impl TryFrom for Blake3Groth16ReceiptClaim { + type Error = anyhow::Error; + + fn try_from(receipt_claim: ReceiptClaim) -> Result { + let image_id = receipt_claim.pre.digest(); + let output_value = receipt_claim + .output + .as_value() + .context("output should not be pruned")? + .as_ref() + .context("output should exist")?; + let journal: [u8; 32] = output_value + .journal + .as_value() + .context("journal should not be pruned")? + .as_slice() + .try_into() + .context("invalid journal length, expected 32 bytes for blake3 groth16")?; + Ok(Blake3Groth16ReceiptClaim::ok(image_id, journal.to_vec())) + } +} diff --git a/crates/boundless-market/src/contracts/bytecode.rs b/crates/boundless-market/src/contracts/bytecode.rs index a339e2c67..687126cde 100644 --- a/crates/boundless-market/src/contracts/bytecode.rs +++ b/crates/boundless-market/src/contracts/bytecode.rs @@ -51,6 +51,13 @@ alloy::sol! { } } +alloy::sol! { + #[sol(rpc, bytecode = "6101808060405234610a525760408161159380380380916100208285610a56565b833981010312610a5257805160209182015191600882811c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff169083901b7fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff001617601081811c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff1691901b7fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000161780821c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16911b7fffffffff00000000ffffffff00000000ffffffff00000000ffffffff000000001617604081811c77ffffffffffffffff0000000000000000ffffffffffffffff1691901b7fffffffffffffffff0000000000000000ffffffffffffffff00000000000000001617608081811c91901b176001600160801b031981811660a052608091821b16905260c08290526040517f72697363302e47726f74683136526563656970745665726966696572506172618152656d657465727360d01b602082810191909152905f9060269060025afa156108de575f5191600881811c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff1691901b7fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff001617601081811c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff1691901b7fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00001617602081811c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1691901b7fffffffff00000000ffffffff00000000ffffffff00000000ffffffff000000001617604081811c77ffffffffffffffff0000000000000000ffffffffffffffff1691901b7fffffffffffffffff0000000000000000ffffffffffffffff00000000000000001617608081811c91901b17915f610120526060610120526040516103106101205182610a56565b6002815261012051601f190161010081905236602083013760205f604051828101907f0316ab0ff634feed16a5261bda1f20694714b67d7d0c3fcf418b672c00e9459382527f2c5f01f3e99fbf359c38f24b9dc5762e32936a7ec54c5b9870168d1016ac71b160408201526040815261038c6101205182610a56565b604051918291518091835e8101838152039060025afa156108de575f516103b282610a8d565b5260205f604051828101907f2aa1911949d7e230c84f544300a5353a3c106d5f0c8deb452ace6fe7c3fbf3a282527f1a74a93686754fe6cc357bbdb43aa63587ddb811b64cf1cf1d76a2c12531c1a16040820152604081526104176101205182610a56565b604051918291518091835e8101838152039060025afa156108de575f5161043d82610a9a565b5260205f601a6040517f72697363305f67726f746831362e566572696679696e674b6579000000000000815260025afa156108de575f519260205f604051828101907f245229d9b076b3c0e8a4d70bde8c1cccffa08a9fae7557b165b3b0dbd653e2c782527f253ec85988dbb84e46e94b5efa3373b47a000b4ac6c86b2d4b798d274a1823026040820152604081526104d96101205182610a56565b604051918291518091835e8101838152039060025afa156108de575f519460205f604051828101907f07090a82e8fabbd39299be24705b92cf208ee8b3487f6f2b39ff27978a29a1db82527f2424bcc1f60a5472685fd50705b2809626e170120acaf441e133a2bd5e61d24460408201527f0ae1135cffdaf227c5dc266740607aa930bc3bd92ddc2b135086d9da2dfd3e2a610120518201527f2b86859fd3d55c9d150fb3f0aeba798826493dd73d357ab0f9fdaced9fc818296080820152608081526105a760a082610a56565b604051918291518091835e8101838152039060025afa156108de575f519360205f604051828101907f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c282527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60408201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b610120518201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60808201526080815261067560a082610a56565b604051918291518091835e8101838152039060025afa156108de575f519660205f604051828101907f2988e03616b72e0bb3e8f884fe55ec966c49beeb9e5abbdb17b015d8cfadcfca82527f263da10954454edd5cc89535bcbc26c9ab06ba5cfc65026f0316d37a1fa5070d60408201527f2fa31ab375f6b90e4a9938b0664db57a2c21e15a22099295659571fdb0e8e86b610120518201527f0ff355a5875037619a0318451398c44bc42f79fb95f1b1adc3561b9b6df6247f60808201526080815261074360a082610a56565b604051918291518091835e8101838152039060025afa156108de575f519660205f601d6040517f72697363305f67726f746831362e566572696679696e674b65792e4943000000815260025afa156108de575f80516101405260206101605297885b8751808b1015610947575f19810190808211610933578b90035f190190811161093357885181101561091f57610160519060051b89010151604051916107ee6101205184610a56565b60028352610160518301916101005136843761080984610a8d565b5261081383610a9a565b526040516108246101605182610a56565b5f8152601f196101605101366101605183013782519161ffff831161090757604080516101405161016051820152945185939291840191905f905b8082106108e95750505092816108ab94600294935180926101605101825e019061ffff60f01b9061ff0060ff8260081c169160081b161760f01b16815203601d19810184520182610a56565b5f60405191805180916101605101845e820191818352806101605193039060025afa156108de5760015f519901986107a5565b6040513d5f823e3d90fd5b8251845261016051889650938401939092019160019091019061085f565b826306dfcc6560e41b5f52601060045260245260445ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b505f92918b8a60405196610160518801958652604088015261012051870152608086015260a085015260c0840152600560f81b60e084015260c2835261098e60e284610a56565b60405192518091845e820191818352806101605193039060025afa156108de575f91825190604051946101605186019384526040860152610120518501526080840152600360f81b60a0840152608283526109ea60a284610a56565b60405192518091845e820191818352806101605193039060025afa156108de575f516001600160e01b03191660e052604051610ae89081610aab8239608051816106a6015260a05181610661015260c05181610290015260e05181818160ae01526101410152f35b5f80fd5b601f909101601f19168101906001600160401b03821190821017610a7957604052565b634e487b7160e01b5f52604160045260245ffd5b80511561091f5760200190565b80516001101561091f576040019056fe60806040526004361015610011575f80fd5b5f3560e01c8063053c238d146100945780631599ead51461008f578063258038e21461008a57806343753b4d146100855780638989fa2e146100805780639181e4b11461007b578063ab750e75146100765763ffa1ad7414610071575f80fd5b6107c1565b6106d6565b610691565b61064c565b6102ce565b610279565b6100db565b346100d7575f3660031901126100d75763ffffffff60e01b7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b5f80fd5b346100d75760203660031901126100d7576004356001600160401b0381116100d75780360360406003198201126100d757600482013590602219018112156100d75781016004810135906001600160401b0382116100d75760240181360381136100d7577f000000000000000000000000000000000000000000000000000000000000000061018361017661017085856108ba565b906108e5565b6001600160e01b03191690565b6001600160e01b031982160361024457506101a4826020936101ac936108c8565b810190610962565b80516101e66040848401519301519460246101c6866107b1565b91013581526040516343753b4d60e01b8152958694859460048601610a53565b0381305afa90811561023f575f91610210575b501561020157005b63439cc0cd60e01b5f5260045ffd5b610232915060203d602011610238575b61022a8183610790565b8101906109ed565b5f6101f9565b503d610220565b610ad0565b61025461017084610276946108ba565b632e2ce35360e21b5f526001600160e01b031990811660045216602452604490565b5ffd5b346100d7575f3660031901126100d75760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b906004916044116100d757565b9060c491610104116100d757565b346100d7576101203660031901126100d7576102e9366102b3565b3660c4116100d7576102fa366102c0565b36610124116100d75760405190610380820160405261010435917f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001831015610644576020610360927f0ff355a5875037619a0318451398c44bc42f79fb95f1b1adc3561b9b6df6247f947f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478360808601987f0316ab0ff634feed16a5261bda1f20694714b67d7d0c3fcf418b672c00e9459387526103de828801947f2c5f01f3e99fbf359c38f24b9dc5762e32936a7ec54c5b9870168d1016ac71b186528861082e565b80358a52013581030660a085015260443560c085015260643560e085015260843561010085015260a4356101208501527f245229d9b076b3c0e8a4d70bde8c1cccffa08a9fae7557b165b3b0dbd653e2c76101408501527f253ec85988dbb84e46e94b5efa3373b47a000b4ac6c86b2d4b798d274a1823026101608501527f07090a82e8fabbd39299be24705b92cf208ee8b3487f6f2b39ff27978a29a1db6101808501527f2424bcc1f60a5472685fd50705b2809626e170120acaf441e133a2bd5e61d2446101a08501527f0ae1135cffdaf227c5dc266740607aa930bc3bd92ddc2b135086d9da2dfd3e2a6101c08501527f2b86859fd3d55c9d150fb3f0aeba798826493dd73d357ab0f9fdaced9fc818296101e08501528351610200850152516102208401527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26102408401527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6102608401527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102808401527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6102a084015280356102c084015201356102e08201527f2988e03616b72e0bb3e8f884fe55ec966c49beeb9e5abbdb17b015d8cfadcfca6103008201527f263da10954454edd5cc89535bcbc26c9ab06ba5cfc65026f0316d37a1fa5070d6103208201527f2fa31ab375f6b90e4a9938b0664db57a2c21e15a22099295659571fdb0e8e86b61034082015201526020816103008160086107cf195a01fa9051165f5260205ff35b5f805260205ff35b346100d7575f3660031901126100d7576040517f00000000000000000000000000000000000000000000000000000000000000006001600160801b0319168152602090f35b346100d7575f3660031901126100d7576040517f00000000000000000000000000000000000000000000000000000000000000006001600160801b0319168152602090f35b346100d75760603660031901126100d7576004356001600160401b0381116100d757366023820112156100d75780600401356001600160401b0381116100d757369101602401116100d75760405162461bcd60e51b815260206004820152601360248201527255736520766572696679496e7465677269747960681b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b0382111761078b57604052565b61075c565b90601f801991011681019081106001600160401b0382111761078b57604052565b906107bf6040519283610790565b565b346100d7575f3660031901126100d757604051604081018181106001600160401b0382111761078b57604052600581526040602082019164302e302e3160d81b83528151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b604051917f2aa1911949d7e230c84f544300a5353a3c106d5f0c8deb452ace6fe7c3fbf3a283527f1a74a93686754fe6cc357bbdb43aa63587ddb811b64cf1cf1d76a2c12531c1a160208401526040830190815260408360608160076107cf195a01fa1561064457815190526020810151606083015260409160809060066107cf195a01fa1561064457565b906004116100d75790600490565b90929192836004116100d75783116100d757600401916003190190565b356001600160e01b0319811692919060048210610900575050565b6001600160e01b031960049290920360031b82901b16169150565b9080601f830112156100d75760405191610936604084610790565b8290604081019283116100d757905b8282106109525750505090565b8135815260209182019101610945565b610100818303126100d7576040519161097a83610770565b610984818361091b565b835280605f830112156100d75760409182516109a08482610790565b8060c08301928484116100d75785809101915b8483106109d35750505060208501526109cc919061091b565b9082015290565b6020906109e0878561091b565b81520191019085906109b3565b908160209103126100d7575180151581036100d75790565b905f905b60028210610a1657505050565b6020806001928551815201930191019091610a09565b905f905b60018210610a3d57505050565b6020806001928551815201930191019091610a30565b919493929094610a6883610120810197610a05565b5f604084015b60028210610a965750505081610a8f6101009260c06107bf96950190610a05565b0190610a2c565b82515f90825b60028310610aba575050506020604060019201930191019091610a6e565b6020806001928451815201920192019190610a9c565b6040513d5f823e3d90fdfea164736f6c634300081a000a")] + contract Blake3Groth16Verifier { + constructor(bytes32 control_root, bytes32 bn254_control_id) {} + } +} + alloy::sol! { #[sol(rpc, bytecode = "60e0346100bb57601f61087938819003918201601f19168301916001600160401b038311848410176100bf578084926080946040528339810103126100bb578051906001600160a01b03821682036100bb5760208101516001600160a01b03811681036100bb57606060408301519201519260805260a05260c0526001556040516107a590816100d4823960805181818161039301526106a3015260a05181818160800152610127015260c05181818161015701526106520152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816308c84e7014610691575080634b28f9a214610675578063549206ed1461063b5780636330d59d1461061e578063a12da43f146100cf578063a96b2dc0146100b25763c65c72911461006b575f80fd5b346100af57806003193601126100af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346100af57806003193601126100af5760209054604051908152f35b503461058457606036600319011261058457600435906024356001600160401b038111610584576101049036906004016106d2565b6044356001600160401b038111610584576101239036906004016106d2565b94907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036105e8577f000000000000000000000000000000000000000000000000000000000000000082036105b05760205f6040518587823780868101838152039060025afa15610579575f515f60806040516101a9816106ff565b8281528260208201526040516101be8161071a565b83815283602082015260408201528260608201520152604051906101e18261071a565b5f82525f6020830152604051906101f78261071a565b8152602081015f815260205f600c6040516b1c9a5cd8cc0b93dd5d1c1d5d60a21b815260025afa15610579576020915f918251915190516040519185830193845260408301526060820152600160f91b60808201526062815261025b608282610735565b604051918291518091835e8101838152039060025afa15610579575f5190604051610285816106ff565b84815260208101907fa3acc27117418996340b84e5a90f3ef4c49d22c79e44aad822ec9c313e1eb8e282526040810192835260608101915f83526080820194855260205f60126040517172697363302e52656365697074436c61696d60701b815260025afa15610579575f51925191519051945184515190600382101561059c57945160209081015160408051808401978852908101959095526060850193909352608084019690965260a08301949094526001600160f81b031960f894851b811660c0840152931b90921660c4830152600160fa1b60c883015260aa82525f9161037160ca82610735565b604051918291518091835e8101838152039060025afa15610579575f516040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316916103c58261071a565b6001600160401b038911610588576040516103ea601f8b01601f191660200182610735565b898152368a86011161058457898560208301375f60208b83010152825260208201908152823b15610584576020925f926084604051809681958294631599ead560e01b845282600485015251604060248501528051928391826064870152018585015e8282018401889052516044830152601f01601f191681010301915afa80156105795761053d575b506104c9907f47ed3f58af358c0ab2b6b2bf11812f81b240613fa30c7d845e1e4f41ce3a0f4e9495966104bb5a976040519687968752606060208801526060870191610756565b918483036040860152610756565b0390a16104d68254610776565b8255815b5a8203828111610529576001541115610525576105209060405160208101908282526020815261050b604082610735565b51902084526002602052806040852055610776565b6104da565b8280f35b634e487b7160e01b84526011600452602484fd5b7f47ed3f58af358c0ab2b6b2bf11812f81b240613fa30c7d845e1e4f41ce3a0f4e9495509061056f5f6104c993610735565b5f95945090610474565b6040513d5f823e3d90fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b60405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a5908125b5859d948125160821b6044820152606490fd5b60405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606490fd5b34610584575f366003190112610584576020600154604051908152f35b34610584575f3660031901126105845760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610584575f3660031901126105845760205f54604051908152f35b34610584575f366003190112610584577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f84011215610584578235916001600160401b038311610584576020838186019501011161058457565b60a081019081106001600160401b0382111761058857604052565b604081019081106001600160401b0382111761058857604052565b90601f801991011681019081106001600160401b0382111761058857604052565b908060209392818452848401375f828201840152601f01601f1916010190565b5f1981146107845760010190565b634e487b7160e01b5f52601160045260245ffdfea164736f6c634300081a000a")] contract MockCallback { diff --git a/crates/boundless-market/src/contracts/mod.rs b/crates/boundless-market/src/contracts/mod.rs index d1f60e88d..666414c84 100644 --- a/crates/boundless-market/src/contracts/mod.rs +++ b/crates/boundless-market/src/contracts/mod.rs @@ -566,9 +566,33 @@ impl Requirements { /// to the latest Groth16 selector. #[cfg(not(target_os = "zkvm"))] pub fn with_groth16_proof(self) -> Self { + use crate::selector::SelectorExt; + + match crate::util::is_dev_mode() { + true => Self { selector: FixedBytes::from(SelectorExt::FakeReceipt as u32), ..self }, + false => { + Self { selector: FixedBytes::from(SelectorExt::groth16_latest() as u32), ..self } + } + } + } + + /// Set the selector for a blake3 groth16 proof. + /// + /// This will set the selector to the appropriate value based on the current environment. + /// In dev mode, the selector will be set to `FakeBlake3Groth16`, otherwise it will be set + /// to the latest Blake3Groth16 selector. + #[cfg(not(target_os = "zkvm"))] + pub fn with_blake3_groth16_proof(self) -> Self { + use crate::selector::SelectorExt; + match crate::util::is_dev_mode() { - true => Self { selector: FixedBytes::from(Selector::FakeReceipt as u32), ..self }, - false => Self { selector: FixedBytes::from(Selector::groth16_latest() as u32), ..self }, + true => { + Self { selector: FixedBytes::from(SelectorExt::FakeBlake3Groth16 as u32), ..self } + } + false => Self { + selector: FixedBytes::from(SelectorExt::blake3_groth16_latest() as u32), + ..self + }, } } } diff --git a/crates/boundless-market/src/lib.rs b/crates/boundless-market/src/lib.rs index d795e73d9..f896b26ff 100644 --- a/crates/boundless-market/src/lib.rs +++ b/crates/boundless-market/src/lib.rs @@ -71,6 +71,10 @@ pub use order_stream_client::OrderStreamClient; #[cfg(not(target_os = "zkvm"))] pub mod request_builder; +/// Module providing blake3-groth16 related integrations. +#[cfg(not(target_os = "zkvm"))] +pub mod blake3_groth16; + /// Selector module implementing utility functions for supported selectors. #[cfg(not(target_os = "zkvm"))] pub mod selector; diff --git a/crates/boundless-market/src/request_builder/finalizer.rs b/crates/boundless-market/src/request_builder/finalizer.rs index 3f8aeaada..4b135c09a 100644 --- a/crates/boundless-market/src/request_builder/finalizer.rs +++ b/crates/boundless-market/src/request_builder/finalizer.rs @@ -15,8 +15,10 @@ use super::{Adapt, Layer, RequestParams}; use crate::{ contracts::{ - FulfillmentData, Offer, Predicate, ProofRequest, RequestId, RequestInput, Requirements, + FulfillmentData, Offer, Predicate, PredicateType, ProofRequest, RequestId, RequestInput, + Requirements, }, + selector::is_blake3_groth16_selector, util::now_timestamp, }; use anyhow::{bail, Context}; @@ -134,8 +136,21 @@ impl Adapt for RequestParams { let eval = match (&self.journal, self.image_id) { (Some(journal), Some(image_id)) => { tracing::debug!("Evaluating journal and image id against predicate "); - let eval_data = - FulfillmentData::from_image_id_and_journal(image_id, journal.bytes.clone()); + let eval_data = if is_blake3_groth16_selector(requirements.selector) { + if requirements.predicate.predicateType != PredicateType::ClaimDigestMatch { + bail!("Blake3Groth16 proofs require a ClaimDigestMatch predicate"); + } + if journal.bytes.len() != 32 { + bail!( + "Blake3Groth16 proofs require a 32-byte journal, got {} bytes", + journal.bytes.len() + ); + } + // It is not possible to fulfill a blake3 groth16 request with fulfillment data + FulfillmentData::None + } else { + FulfillmentData::from_image_id_and_journal(image_id, journal.bytes.clone()) + }; predicate.eval(&eval_data).is_some() } // Do not run the check. diff --git a/crates/boundless-market/src/request_builder/mod.rs b/crates/boundless-market/src/request_builder/mod.rs index 494a66019..9da7de30b 100644 --- a/crates/boundless-market/src/request_builder/mod.rs +++ b/crates/boundless-market/src/request_builder/mod.rs @@ -24,13 +24,13 @@ use alloy::{ providers::{DynProvider, Provider}, }; use derive_builder::Builder; -use risc0_ethereum_contracts::selector::Selector; use risc0_zkvm::{Digest, Journal}; use url::Url; use crate::{ contracts::{ProofRequest, RequestId, RequestInput}, input::GuestEnv, + selector::SelectorExt, storage::{StandardStorageProvider, StorageProvider}, util::NotProvided, }; @@ -547,11 +547,25 @@ impl RequestParams { pub fn with_groth16_proof(self) -> Self { let mut requirements = self.requirements; requirements.selector = match crate::util::is_dev_mode() { - true => Some((Selector::FakeReceipt as u32).into()), - false => Some((Selector::groth16_latest() as u32).into()), + true => Some((SelectorExt::FakeReceipt as u32).into()), + false => Some((SelectorExt::groth16_latest() as u32).into()), }; Self { requirements, ..self } } + + /// Request a stand-alone Blake3 Groth16 proof for this request. + /// + /// This is a convinience method to set the selector on the requirements. Note that calling + /// [RequestParams::with_requirements] after this function will overwrite the change. + pub fn with_blake3_groth16_proof(self) -> Self { + let mut requirements = self.requirements; + requirements.selector = match crate::util::is_dev_mode() { + true => Some((SelectorExt::FakeReceipt as u32).into()), + false => Some((SelectorExt::blake3_groth16_latest() as u32).into()), + }; + // TODO(ec2): should we automatically set the predicate type to claim digest match here? + Self { requirements, ..self } + } } impl Debug for RequestParams { diff --git a/crates/boundless-market/src/request_builder/requirements_layer.rs b/crates/boundless-market/src/request_builder/requirements_layer.rs index 5c396f108..b92c1c5fa 100644 --- a/crates/boundless-market/src/request_builder/requirements_layer.rs +++ b/crates/boundless-market/src/request_builder/requirements_layer.rs @@ -13,7 +13,9 @@ // limitations under the License. use super::{Adapt, Layer, MissingFieldError, RequestParams}; +use crate::blake3_groth16; use crate::contracts::{Callback, Predicate, Requirements}; +use crate::selector::is_blake3_groth16_selector; use alloy::primitives::{aliases::U96, Address, FixedBytes, B256}; use anyhow::{ensure, Context}; use clap::Args; @@ -155,10 +157,40 @@ impl Layer<(Digest, &Journal, &RequirementParams)> for RequirementsLayer { &self, (image_id, journal, params): (Digest, &Journal, &RequirementParams), ) -> Result { - let predicate = params - .predicate - .clone() - .unwrap_or_else(|| Predicate::digest_match(image_id, journal.digest())); + let mut predicate = params.predicate.clone(); + + if let Some(selector) = ¶ms.selector { + if is_blake3_groth16_selector(*selector) { + if journal.bytes.len() != 32 { + anyhow::bail!( + "Blake3Groth16 proofs require a 32-byte journal, got {} bytes", + journal.bytes.len() + ); + } + if let Some(pred) = &predicate { + matches!(pred, Predicate::ClaimDigestMatch(_)).then_some(()).ok_or_else( + || { + anyhow::anyhow!( + "Blake3Groth16 proofs require a ClaimDigestMatch predicate" + ) + }, + )?; + } else { + predicate = Some(params.predicate.clone().unwrap_or_else(|| { + let blake3_claim_digest = blake3_groth16::Blake3Groth16ReceiptClaim::ok( + image_id, + journal.bytes.clone(), + ) + .digest(); + Predicate::claim_digest_match(blake3_claim_digest) + })); + } + } + } + + let predicate = + predicate.unwrap_or_else(|| Predicate::digest_match(image_id, journal.digest())); + if let Some(params_image_id) = params.image_id { ensure!( image_id == Digest::from(<[u8; 32]>::from(params_image_id)), diff --git a/crates/boundless-market/src/selector.rs b/crates/boundless-market/src/selector.rs index 2a0327f04..5f6fe383d 100644 --- a/crates/boundless-market/src/selector.rs +++ b/crates/boundless-market/src/selector.rs @@ -15,16 +15,126 @@ //! Selector utility functions. use std::collections::HashMap; +use std::fmt::{self, Display, Formatter}; use alloy_primitives::FixedBytes; use clap::ValueEnum; use risc0_aggregation::SetInclusionReceiptVerifierParameters; -use risc0_ethereum_contracts::selector::{Selector, SelectorType}; +use risc0_ethereum_contracts::selector::Selector; use risc0_zkvm::sha::{Digest, Digestible}; +use thiserror::Error; use crate::contracts::UNSPECIFIED_SELECTOR; use crate::util::is_dev_mode; +#[derive(Debug, Error)] +#[non_exhaustive] +/// Errors related to extended selectors. +pub enum SelectorExtError { + /// Unsupported selector error. + #[error("Unsupported selector")] + UnsupportedSelector, + /// No verifier parameters error. + #[error("Selector {0} does not have verifier parameters")] + NoVerifierParameters(SelectorExt), +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[non_exhaustive] +/// Types of extended selectors. +pub enum SelectorExtType { + /// A fake receipt selector used for testing and development. + FakeReceipt, + /// Groth16 proof selector. + Groth16, + /// Set verifier selector. + SetVerifier, + /// Blake3 Groth16 selector. + Blake3Groth16, + /// Fake Blake3 Groth16 selector + FakeBlake3Groth16, +} + +#[repr(u32)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[non_exhaustive] +/// Extended selectors for various proof types. +pub enum SelectorExt { + /// A fake receipt selector used for testing and development. + FakeReceipt = 0xFFFFFFFF, + /// A fake Blake3 Groth16 proof selector. + FakeBlake3Groth16 = 0xFFFF0000, + /// Groth16 proof selector version 3.0. + Groth16V3_0 = Selector::Groth16V3_0 as u32, + /// Set verifier selector version 0.9. + SetVerifierV0_9 = Selector::SetVerifierV0_9 as u32, + /// Blake3 Groth16 selector version 0.1. + Blake3Groth16V0_1 = 0x62f049f6, +} + +impl Display for SelectorExt { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{:#010x}", *self as u32) + } +} + +impl TryFrom for SelectorExt { + type Error = SelectorExtError; + + fn try_from(value: u32) -> Result { + match value { + 0xFFFFFFFF => Ok(SelectorExt::FakeReceipt), + 0xFFFF0000 => Ok(SelectorExt::FakeBlake3Groth16), + 0x73c457ba => Ok(SelectorExt::Groth16V3_0), + 0x242f9d5b => Ok(SelectorExt::SetVerifierV0_9), + 0x62f049f6 => Ok(SelectorExt::Blake3Groth16V0_1), + _ => Err(SelectorExtError::UnsupportedSelector), + } + } +} + +impl TryFrom for SelectorExt { + type Error = SelectorExtError; + + fn try_from(value: Selector) -> Result { + Self::try_from(value as u32) + } +} + +impl SelectorExt { + /// Get the latest groth16 selector. + pub fn groth16_latest() -> SelectorExt { + SelectorExt::Groth16V3_0 + } + + /// Get the latest set verifier selector. + pub fn set_inclusion_latest() -> SelectorExt { + SelectorExt::SetVerifierV0_9 + } + + /// Get the latest blake3 groth16 selector. + pub fn blake3_groth16_latest() -> SelectorExt { + // Currently, we only have one blake3 groth16 selector. + SelectorExt::Blake3Groth16V0_1 + } + + /// Create a `SelectorExt` from a 4-byte array. + pub fn from_bytes(bytes: [u8; 4]) -> Option { + Self::try_from(u32::from_be_bytes(bytes)).ok() + } + + /// Returns the type of the selector. + pub fn get_type(self) -> SelectorExtType { + match self { + SelectorExt::FakeReceipt => SelectorExtType::FakeReceipt, + SelectorExt::FakeBlake3Groth16 => SelectorExtType::FakeBlake3Groth16, + SelectorExt::Groth16V3_0 => SelectorExtType::Groth16, + SelectorExt::SetVerifierV0_9 => SelectorExtType::SetVerifier, + SelectorExt::Blake3Groth16V0_1 => SelectorExtType::Blake3Groth16, + } + } +} + /// Define the selector types. /// /// This is used to indicate the type of proof that is being requested. @@ -38,6 +148,8 @@ pub enum ProofType { Groth16, /// Inclusion proof type. Inclusion, + /// BitVM compatible blake3 Groth16 proof type. + Blake3Groth16, } /// A struct to hold the supported selectors. @@ -51,10 +163,21 @@ impl Default for SupportedSelectors { fn default() -> Self { let mut supported_selectors = Self::new() .with_selector(UNSPECIFIED_SELECTOR, ProofType::Any) - .with_selector(FixedBytes::from(Selector::groth16_latest() as u32), ProofType::Groth16); + .with_selector( + FixedBytes::from(SelectorExt::groth16_latest() as u32), + ProofType::Groth16, + ) + .with_selector( + FixedBytes::from(SelectorExt::blake3_groth16_latest() as u32), + ProofType::Blake3Groth16, + ); if is_dev_mode() { supported_selectors = supported_selectors - .with_selector(FixedBytes::from(Selector::FakeReceipt as u32), ProofType::Any); + .with_selector(FixedBytes::from(SelectorExt::FakeReceipt as u32), ProofType::Any) + .with_selector( + FixedBytes::from(SelectorExt::FakeBlake3Groth16 as u32), + ProofType::Blake3Groth16, + ) } supported_selectors } @@ -114,11 +237,23 @@ impl SupportedSelectors { /// Check if a selector is a groth16 selector. pub fn is_groth16_selector(selector: FixedBytes<4>) -> bool { - let sel = Selector::from_bytes(selector.into()); + let sel = SelectorExt::from_bytes(selector.into()); match sel { Some(selector) => { - selector.get_type() == SelectorType::FakeReceipt - || selector.get_type() == SelectorType::Groth16 + selector.get_type() == SelectorExtType::FakeReceipt + || selector.get_type() == SelectorExtType::Groth16 + } + None => false, + } +} + +/// Check if a selector is a blake3 groth16 selector. +pub fn is_blake3_groth16_selector(selector: FixedBytes<4>) -> bool { + let sel = SelectorExt::from_bytes(selector.into()); + match sel { + Some(selector) => { + selector.get_type() == SelectorExtType::FakeBlake3Groth16 + || selector.get_type() == SelectorExtType::Blake3Groth16 } None => false, } @@ -131,7 +266,7 @@ mod tests { #[test] fn test_supported_selectors() { let mut supported_selectors = SupportedSelectors::new(); - let selector = FixedBytes::from(Selector::groth16_latest() as u32); + let selector = FixedBytes::from(SelectorExt::groth16_latest() as u32); supported_selectors = supported_selectors.with_selector(selector, ProofType::Groth16); assert!(supported_selectors.is_supported(selector)); supported_selectors.remove(selector); @@ -140,7 +275,17 @@ mod tests { #[test] fn test_is_groth16_selector() { - let selector = FixedBytes::from(Selector::groth16_latest() as u32); + let selector = FixedBytes::from(SelectorExt::groth16_latest() as u32); assert!(is_groth16_selector(selector)); + let fake_selector = FixedBytes::from(SelectorExt::FakeReceipt as u32); + assert!(is_groth16_selector(fake_selector)); + } + + #[test] + fn test_is_blake3_groth16_selector() { + let selector = FixedBytes::from(SelectorExt::blake3_groth16_latest() as u32); + assert!(is_blake3_groth16_selector(selector)); + let fake_selector = FixedBytes::from(SelectorExt::FakeBlake3Groth16 as u32); + assert!(is_blake3_groth16_selector(fake_selector)); } } diff --git a/crates/broker/Cargo.toml b/crates/broker/Cargo.toml index ea9e590a1..6457c3603 100644 --- a/crates/broker/Cargo.toml +++ b/crates/broker/Cargo.toml @@ -12,9 +12,21 @@ release = false [features] test-utils = ["dep:boundless-test-utils"] +prove = ["blake3_groth16/prove"] +cuda = ["blake3_groth16/cuda"] [dependencies] -alloy = { workspace = true, features = ["network", "providers", "transports", "sol-types", "contract", "signers", "signer-local", "rpc", "rpc-types"] } +alloy = { workspace = true, features = [ + "network", + "providers", + "transports", + "sol-types", + "contract", + "signers", + "signer-local", + "rpc", + "rpc-types", +] } alloy-chains = "0.2.0" anyhow = { workspace = true } async-channel = "2.3" @@ -23,6 +35,7 @@ async-trait = { workspace = true } aws-config = { workspace = true } aws-sdk-s3 = { workspace = true } bincode = { workspace = true } +blake3_groth16 = { workspace = true } bonsai-sdk = { workspace = true } boundless-assessor = { workspace = true } boundless-market = { workspace = true } @@ -36,6 +49,9 @@ hex = { workspace = true } http-cache-reqwest = "0.15.1" moka = { version = "0.12", features = ["future"] } notify = "6.1" + +num-bigint = { version = "0.4", features = ["std"] } +num-traits = "0.2.19" rand = { workspace = true } requestor-lists = { path = "../requestor-lists" } reqwest = { workspace = true } @@ -71,8 +87,11 @@ httpmock = "0.7" proptest = "1.4" proptest-derive = "0.5" rand = { workspace = true } + +risc0-groth16 = { workspace = true, features = ["prove"] } risc0-zkvm = { workspace = true, default-features = true } serial_test = "3.2" temp-env = { version = "0.3", features = ["async_closure"] } +test-log = { workspace = true } tokio = { workspace = true, features = ["full"] } tracing-test = { workspace = true } diff --git a/crates/broker/src/lib.rs b/crates/broker/src/lib.rs index 420c6d558..b0815972d 100644 --- a/crates/broker/src/lib.rs +++ b/crates/broker/src/lib.rs @@ -31,7 +31,7 @@ use boundless_market::{ dynamic_gas_filler::PriorityMode, order_stream_client::OrderStreamClient, override_gateway, - selector::is_groth16_selector, + selector::{is_blake3_groth16_selector, is_groth16_selector}, Deployment, }; use chrono::{serde::ts_seconds, DateTime, Utc}; @@ -406,6 +406,18 @@ impl Order { pub fn is_groth16(&self) -> bool { is_groth16_selector(self.request.requirements.selector) } + fn is_blake3_groth16(&self) -> bool { + is_blake3_groth16_selector(self.request.requirements.selector) + } + pub fn compression_type(&self) -> CompressionType { + if self.is_groth16() { + CompressionType::Groth16 + } else if self.is_blake3_groth16() { + CompressionType::Blake3Groth16 + } else { + CompressionType::None + } + } } impl std::fmt::Display for Order { @@ -419,6 +431,13 @@ impl std::fmt::Display for Order { } } +#[derive(Debug, PartialEq, Eq)] +enum CompressionType { + None, + Groth16, + Blake3Groth16, +} + #[derive(sqlx::Type, Default, Serialize, Deserialize, Debug, Clone, PartialEq)] enum BatchStatus { #[default] @@ -1221,6 +1240,15 @@ pub(crate) fn is_dev_mode() -> bool { .is_some() } +/// Returns `true` if the `ALLOW_LOCAL_FILE_STORAGE` environment variable is enabled. +pub(crate) fn allow_local_file_storage() -> bool { + std::env::var("ALLOW_LOCAL_FILE_STORAGE") + .ok() + .map(|x| x.to_lowercase()) + .filter(|x| x == "1" || x == "true" || x == "yes") + .is_some() +} + #[cfg(feature = "test-utils")] pub mod test_utils { use std::sync::Arc; diff --git a/crates/broker/src/order_picker.rs b/crates/broker/src/order_picker.rs index 9f45abe19..d9726b307 100644 --- a/crates/broker/src/order_picker.rs +++ b/crates/broker/src/order_picker.rs @@ -51,7 +51,7 @@ use boundless_market::{ boundless_market::BoundlessMarketService, FulfillmentData, Predicate, PredicateType, RequestError, RequestInputType, }, - selector::SupportedSelectors, + selector::{is_blake3_groth16_selector, SupportedSelectors}, }; use moka::future::Cache; use thiserror::Error; @@ -826,13 +826,25 @@ where }); } + // If the selector is a blake3 groth16 selector, ensure the journal is exactly 32 bytes + if is_blake3_groth16_selector(order.request.requirements.selector) && journal.len() != 32 { + tracing::info!( + "Order {order_id} journal is not 32 bytes for blake3 groth16 selector, skipping", + ); + return Ok(Skip { + reason: "blake3 groth16 selector requires 32 byte journal".to_string(), + }); + } + // Validate the predicates: let predicate = Predicate::try_from(order.request.requirements.predicate.clone()) .map_err(|e| OrderPickerErr::RequestError(Arc::new(e.into())))?; - let eval_data = FulfillmentData::from_image_id_and_journal( - Digest::from_hex(image_id).unwrap(), - journal, - ); + let eval_data = if is_blake3_groth16_selector(order.request.requirements.selector) { + // These proofs must have no journal delivery because they cannot be authenticated on chain. + FulfillmentData::None + } else { + FulfillmentData::from_image_id_and_journal(Digest::from_hex(image_id).unwrap(), journal) + }; if predicate.eval(&eval_data).is_none() { return Ok(Skip { reason: "order predicate check failed".to_string() }); } @@ -1549,10 +1561,13 @@ pub(crate) mod tests { signers::local::PrivateKeySigner, }; use async_trait::async_trait; - use boundless_market::contracts::{ - Callback, Offer, Predicate, ProofRequest, RequestId, RequestInput, Requirements, - }; use boundless_market::storage::{MockStorageProvider, StorageProvider}; + use boundless_market::{ + contracts::{ + Callback, Offer, Predicate, ProofRequest, RequestId, RequestInput, Requirements, + }, + selector::SelectorExt, + }; use boundless_test_utils::{ guests::{ASSESSOR_GUEST_ID, ASSESSOR_GUEST_PATH, ECHO_ELF, ECHO_ID, LOOP_ELF, LOOP_ID}, market::{deploy_boundless_market, deploy_hit_points}, @@ -1959,7 +1974,8 @@ pub(crate) mod tests { .await; // set a Groth16 selector - order.request.requirements.selector = FixedBytes::from(Selector::groth16_latest() as u32); + order.request.requirements.selector = + FixedBytes::from(SelectorExt::groth16_latest() as u32); let _request_id = ctx.boundless_market.submit_request(&order.request, &ctx.signer(0)).await.unwrap(); @@ -2960,6 +2976,16 @@ pub(crate) mod tests { ) -> Result>, ProverError> { self.default_prover.get_compressed_receipt(proof_id).await } + async fn compress_blake3_groth16(&self, proof_id: &str) -> Result { + self.default_prover.compress_blake3_groth16(proof_id).await + } + + async fn get_blake3_groth16_receipt( + &self, + proof_id: &str, + ) -> Result>, ProverError> { + self.default_prover.get_blake3_groth16_receipt(proof_id).await + } } #[tokio::test] diff --git a/crates/broker/src/provers/bonsai.rs b/crates/broker/src/provers/bonsai.rs index cd6fbaa23..6bafa2b64 100644 --- a/crates/broker/src/provers/bonsai.rs +++ b/crates/broker/src/provers/bonsai.rs @@ -16,7 +16,7 @@ use std::future::Future; use async_trait::async_trait; use bonsai_sdk::{ - non_blocking::{Client as BonsaiClient, SessionId, SnarkId}, + non_blocking::{Client as BonsaiClient, SessionId, ShrinkBitvm2Id as Blake3Groth16Id, SnarkId}, SdkErr, }; use risc0_zkvm::Receipt; @@ -278,6 +278,46 @@ impl StatusPoller { } } } + + async fn poll_with_retries_blake3_groth16_id( + &self, + proof_id: &Blake3Groth16Id, + client: &BonsaiClient, + ) -> Result { + loop { + let status = retry::<_, SdkErr, _, _>( + self.retry_counts, + self.poll_sleep_ms, + || async { proof_id.status(client).await }, + "get blake3 groth16 (shrink_bitvm2) status", + ) + .await; + + if let Err(_err) = status { + return Err(ProverError::StatusFailure); + } + + let status = status.unwrap(); + + match status.status.as_ref() { + "RUNNING" => { + tokio::time::sleep(tokio::time::Duration::from_millis(self.poll_sleep_ms)) + .await; + continue; + } + "SUCCEEDED" => return Ok(proof_id.uuid.clone()), + status_code => { + let err_msg = status.error_msg.unwrap_or_default(); + if err_msg.contains("INTERNAL_ERROR") { + return Err(ProverError::ProverInternalError(err_msg.clone())); + } + return Err(ProverError::ProvingFailed(format!( + "snark proving failed with status {status_code}: {err_msg}" + ))); + } + } + } + } } #[async_trait] @@ -527,6 +567,47 @@ impl Prover for Bonsai { Ok(Some(receipt_buf)) } + + async fn compress_blake3_groth16(&self, proof_id: &str) -> Result { + let proof_id = self + .retry( + || async { Ok(self.client.shrink_bitvm2(proof_id.into()).await?) }, + "create blake3_groth16 (bitvm2)", + ) + .await?; + + let poller = StatusPoller { + poll_sleep_ms: self.status_poll_ms, + retry_counts: self.status_poll_retry_count, + }; + + poller.poll_with_retries_blake3_groth16_id(&proof_id, &self.client).await?; + + Ok(proof_id.uuid) + } + + async fn get_blake3_groth16_receipt( + &self, + proof_id: &str, + ) -> Result>, ProverError> { + let snark_id = Blake3Groth16Id { uuid: proof_id.into() }; + let status = self + .retry( + || async { Ok(snark_id.status(&self.client).await?) }, + "get status of blake3 groth16", + ) + .await?; + + let Some(output) = status.output else { return Ok(None) }; + let receipt_buf = self + .retry( + || async { Ok(self.client.download(&output).await?) }, + "download blake3 groth16 (bitvm2) output", + ) + .await?; + + Ok(Some(receipt_buf)) + } } async fn create_pg_pool() -> Result { diff --git a/crates/broker/src/provers/default.rs b/crates/broker/src/provers/default.rs index ee05667a4..eadbece17 100644 --- a/crates/broker/src/provers/default.rs +++ b/crates/broker/src/provers/default.rs @@ -16,7 +16,7 @@ use std::{borrow::Borrow, collections::HashMap, sync::Arc}; use crate::config::ProverConf; use crate::provers::{ExecutorResp, ProofResult, Prover, ProverError}; -use anyhow::{Context, Result as AnyhowResult}; +use anyhow::{anyhow, Context, Result as AnyhowResult}; use async_trait::async_trait; use risc0_zkvm::{ default_executor, default_prover, ExecutorEnv, ProveInfo, ProverOpts, Receipt, SessionInfo, @@ -370,7 +370,8 @@ impl Prover for DefaultProver { .map(|receipt| bincode::serialize(receipt).unwrap()) .unwrap_or_default(); - let mut proofs = self.state.proofs.write().await; + let mut proofs: tokio::sync::RwLockWriteGuard<'_, HashMap> = + self.state.proofs.write().await; let proof = proofs.get_mut(&proof_id).unwrap(); match compress_result { Ok(_) => { @@ -395,15 +396,67 @@ impl Prover for DefaultProver { .ok_or_else(|| ProverError::NotFound(format!("proof {proof_id}")))?; Ok(proof_data.compressed_receipt.as_ref().cloned()) } + + async fn compress_blake3_groth16(&self, proof_id: &str) -> Result { + tracing::info!("Compressing proof to blake3 groth16 {proof_id}"); + let receipt = self + .get_receipt(proof_id) + .await? + .ok_or_else(|| ProverError::NotFound(format!("no receipt for proof {proof_id}")))?; + if receipt.journal.bytes.len() != 32 { + return Err(ProverError::UnexpectedError(anyhow!( + "Compressing proof to blake3 groth16 requires a journal of 32 bytes, got {}", + receipt.journal.bytes.len() + ))); + } + let proof_id = format!("snark_{}", Uuid::new_v4()); + self.state.proofs.write().await.insert(proof_id.clone(), ProofData::default()); + + let compress_result = + blake3_groth16::compress_blake3_groth16(&receipt).await.map_err(ProverError::from); + + let compressed_bytes = compress_result + .as_ref() + .map(|receipt| bincode::serialize(receipt).unwrap()) + .unwrap_or_default(); + + let mut proofs = self.state.proofs.write().await; + let proof = proofs.get_mut(&proof_id).unwrap(); + match compress_result { + Ok(_) => { + proof.status = Status::Succeeded; + proof.compressed_receipt = Some(compressed_bytes); + + Ok(proof_id) + } + Err(err) => { + proof.status = Status::Failed; + proof.error_msg = err.to_string(); + + Err(err) + } + } + } + async fn get_blake3_groth16_receipt( + &self, + proof_id: &str, + ) -> Result>, ProverError> { + let proofs = self.state.proofs.read().await; + let proof_data = proofs + .get(proof_id) + .ok_or_else(|| ProverError::NotFound(format!("blake3 groth16 proof {proof_id}")))?; + Ok(proof_data.compressed_receipt.as_ref().cloned()) + } } #[cfg(test)] mod tests { use super::*; use boundless_test_utils::guests::{ECHO_ELF, ECHO_ID}; - use risc0_zkvm::sha::Digest; use tokio::test; + use risc0_zkvm::sha::Digest; + #[test] async fn test_upload_input_and_image() { let prover = DefaultProver::new(); @@ -516,4 +569,32 @@ mod tests { let journal_err = prover.get_journal(nonexistent_id).await; assert!(matches!(journal_err, Err(ProverError::NotFound(_)))); } + + #[test] + async fn test_compress_blake3_groth16() { + let prover = DefaultProver::new(); + // Upload test data + let input_data = [255u8; 32].to_vec(); // Example input data + let input_id = prover.upload_input(input_data.clone()).await.unwrap(); + let image_id = Digest::from(ECHO_ID); + prover.upload_image(&image_id.to_string(), ECHO_ELF.to_vec()).await.unwrap(); + + // Run SNARK proving + let ProofResult { id: stark_id, .. } = + prover.prove_and_monitor_stark(&image_id.to_string(), &input_id, vec![]).await.unwrap(); + + let snark_id = prover.compress_blake3_groth16(&stark_id).await.unwrap(); + + // Fetch the compressed receipt + let compressed_receipt = prover.get_compressed_receipt(&snark_id).await.unwrap().unwrap(); + let blake3_receipt: blake3_groth16::Blake3Groth16Receipt = + bincode::deserialize(&compressed_receipt).unwrap(); + + let claim_digest = + blake3_groth16::Blake3Groth16ReceiptClaim::ok(ECHO_ID, input_data.clone()) + .claim_digest(); + + assert_eq!(blake3_receipt.claim_digest().unwrap(), claim_digest); + blake3_receipt.verify(ECHO_ID).expect("blake3 groth16 verification failed"); + } } diff --git a/crates/broker/src/provers/mod.rs b/crates/broker/src/provers/mod.rs index ba9ecf82d..a0e04de12 100644 --- a/crates/broker/src/provers/mod.rs +++ b/crates/broker/src/provers/mod.rs @@ -15,6 +15,7 @@ use std::sync::Arc; use async_trait::async_trait; +use blake3_groth16::Blake3Groth16Receipt; use bonsai_sdk::SdkErr; use boundless_market::input::GuestEnv; use risc0_zkvm::Receipt; @@ -132,6 +133,32 @@ pub(crate) async fn verify_groth16_receipt( Ok(()) } +/// Verify a blake3 Groth16 compressed receipt +/// +/// This helper fetches the compressed receipt, deserializes it, and verifies its integrity. +/// Used by both aggregator and proving services to validate Groth16 proofs before submission. +pub(crate) async fn verify_blake3_groth16_receipt( + prover: &ProverObj, + proof_id: &str, +) -> Result<(), ProverError> { + tracing::trace!("Verifying Blake3 Groth16 receipt locally for proof_id: {proof_id}"); + + let receipt_bytes = prover.get_blake3_groth16_receipt(proof_id).await?.ok_or_else(|| { + ProverError::NotFound(format!("Blake3 Groth16 receipt not found: {proof_id}")) + })?; + + let receipt: Blake3Groth16Receipt = bincode::deserialize(&receipt_bytes).map_err(|e| { + ProverError::ProverInternalError(format!("Failed to deserialize receipt: {e}")) + })?; + + receipt.verify_integrity().map_err(|e| { + ProverError::ProverInternalError(format!("Blake3 Groth16 verification failed: {e}")) + })?; + + tracing::debug!("Blake3 Groth16 verification passed for proof_id: {proof_id}"); + Ok(()) +} + #[async_trait] pub trait Prover { async fn has_image(&self, image_id: &str) -> Result; @@ -167,6 +194,11 @@ pub trait Prover { async fn get_journal(&self, proof_id: &str) -> Result>, ProverError>; async fn compress(&self, proof_id: &str) -> Result; async fn get_compressed_receipt(&self, proof_id: &str) -> Result>, ProverError>; + async fn compress_blake3_groth16(&self, proof_id: &str) -> Result; + async fn get_blake3_groth16_receipt( + &self, + proof_id: &str, + ) -> Result>, ProverError>; } pub type ProverObj = Arc; diff --git a/crates/broker/src/proving.rs b/crates/broker/src/proving.rs index d9fb33bcd..ed42ab1a8 100644 --- a/crates/broker/src/proving.rs +++ b/crates/broker/src/proving.rs @@ -25,7 +25,7 @@ use crate::{ storage::{upload_image_uri, upload_input_uri}, task::{RetryRes, RetryTask, SupervisorErr}, utils::cancel_proof_and_fail_order, - FulfillmentType, Order, OrderStateChange, OrderStatus, + CompressionType, FulfillmentType, Order, OrderStateChange, OrderStatus, }; use anyhow::{Context, Result}; use thiserror::Error; @@ -83,7 +83,7 @@ impl ProvingService { &self, order_id: &str, stark_proof_id: &str, - is_groth16: bool, + compression_type: CompressionType, snark_proof_id: Option, ) -> Result { let proof_res = self @@ -92,7 +92,12 @@ impl ProvingService { .await .context("Monitoring proof (stark) failed")?; - if is_groth16 && snark_proof_id.is_none() { + tracing::debug!( + "compression_type: {compression_type:?}, snark_proof_id: {snark_proof_id:?}" + ); + let is_compress = compression_type != CompressionType::None; + + if is_compress && snark_proof_id.is_none() { let (retry_count, sleep_ms) = { let config = self.config.lock_all().context("Failed to lock config")?; (config.prover.proof_retry_count, config.prover.proof_retry_sleep_ms) @@ -102,8 +107,38 @@ impl ProvingService { retry_count, sleep_ms, || async { - let proof_id = self.prover.compress(stark_proof_id).await?; - provers::verify_groth16_receipt(&self.prover, &proof_id).await?; + let proof_id = match compression_type { + CompressionType::Groth16 => self + .prover + .compress(stark_proof_id) + .await + .context("Failed to compress proof")?, + CompressionType::Blake3Groth16 => self + .prover + .compress_blake3_groth16(stark_proof_id) + .await + .context("Failed to compress blake3 groth16 proof")?, + CompressionType::None => { + unreachable!("Compression type should not be None here") + } + }; + match compression_type { + CompressionType::Groth16 => { + tracing::trace!( + "Verifying compressed Groth16 receipt locally for proof_id: {proof_id}" + ); + provers::verify_groth16_receipt(&self.prover, &proof_id).await?; + } + CompressionType::Blake3Groth16 => { + tracing::trace!( + "Verifying compressed Blake3 Groth16 receipt locally for proof_id: {proof_id}" + ); + provers::verify_blake3_groth16_receipt(&self.prover, &proof_id).await?; + } + CompressionType::None => { + unreachable!("Compression type should not be None here") + } + } Ok::(proof_id) }, "compress_and_verify", @@ -121,7 +156,7 @@ impl ProvingService { })?; }; - let status = match is_groth16 { + let status = match is_compress { false => OrderStatus::PendingAgg, true => OrderStatus::SkipAggregation, }; @@ -239,7 +274,7 @@ impl ProvingService { let monitor_task = self.monitor_proof_internal( &order_id, proof_id, - order.is_groth16(), + order.compression_type(), order.compressed_proof_id, ); tokio::pin!(monitor_task); diff --git a/crates/broker/src/storage.rs b/crates/broker/src/storage.rs index 6aae0b692..f33cd4695 100644 --- a/crates/broker/src/storage.rs +++ b/crates/broker/src/storage.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::{config::ConfigLock, errors::CodedError, is_dev_mode}; +use crate::{allow_local_file_storage, config::ConfigLock, errors::CodedError, is_dev_mode}; use alloy::primitives::bytes::Buf; use anyhow::{Context, Result}; use async_trait::async_trait; @@ -82,7 +82,7 @@ pub(crate) async fn create_uri_handler( match uri.scheme() { "file" => { - if !is_dev_mode() { + if !is_dev_mode() && !allow_local_file_storage() { return Err(StorageErr::UnsupportedScheme("file".to_string())); } let max_size = if skip_max_size_check { diff --git a/crates/broker/src/submitter.rs b/crates/broker/src/submitter.rs index 98bf2b810..b1e187fd5 100644 --- a/crates/broker/src/submitter.rs +++ b/crates/broker/src/submitter.rs @@ -24,13 +24,14 @@ use alloy::{ sol_types::{SolStruct, SolValue}, }; use anyhow::{anyhow, Context, Result}; +use blake3_groth16::Blake3Groth16Receipt; use boundless_market::{ contracts::{ boundless_market::{BoundlessMarketService, FulfillmentTx, MarketError, UnlockedRequest}, encode_seal, AssessorJournal, AssessorReceipt, Fulfillment, FulfillmentDataImageIdAndJournal, FulfillmentDataType, PredicateType, }, - selector::is_groth16_selector, + selector::{is_blake3_groth16_selector, is_groth16_selector}, }; use hex::FromHex; use risc0_aggregation::{SetInclusionReceipt, SetInclusionReceiptVerifierParameters}; @@ -43,7 +44,7 @@ use risc0_zkvm::{ use crate::{ config::ConfigLock, db::DbObj, - impl_coded_debug, now_timestamp, + impl_coded_debug, is_dev_mode, now_timestamp, provers::ProverObj, task::{RetryRes, RetryTask, SupervisorErr}, Batch, FulfillmentType, Order, @@ -172,6 +173,29 @@ where Ok(encoded_seal) } + async fn fetch_encode_b3_g16(&self, b3_g16_proof_id: &str) -> Result> { + let blake3_receipt = self + .prover + .get_blake3_groth16_receipt(b3_g16_proof_id) + .await + .context("Failed to fetch blake3 groth16 receipt")? + .context("Blake3 Groth16 receipt missing")?; + + let blake3_receipt: Blake3Groth16Receipt = bincode::deserialize(&blake3_receipt) + .context("Failed to deserialize Blake3 Groth16 receipt")?; + + let mut encoded_seal = encode_seal(&blake3_receipt.into()) + .context("Failed to encode Blake3 Groth16 receipt seal")?; + if is_dev_mode() { + // In dev mode, we use the fake selector for Blake3 Groth16 proofs. + let fake_selector = &[0xFFu8, 0xFF, 0x00, 0x00]; + // Replace the first 4 bytes with the fake selector + encoded_seal.splice(0..4, fake_selector.iter().cloned()); + } + + Ok(encoded_seal) + } + pub async fn submit_batch(&self, batch_id: usize, batch: &Batch) -> Result<(), SubmitterErr> { tracing::info!("Submitting batch {batch_id}"); @@ -303,6 +327,14 @@ where self.fetch_encode_g16(&compressed_proof_id) .await .context("Failed to fetch and encode g16 proof")? + } else if is_blake3_groth16_selector(order_request.requirements.selector) { + let compressed_proof_id = + self.db.get_order_compressed_proof_id(order_id).await.context( + "Failed to get order compressed proof ID from DB for submission", + )?; + self.fetch_encode_b3_g16(&compressed_proof_id) + .await + .context("Failed to fetch and encode blake3 groth16 proof")? } else { let order_claim_index = aggregation_state .claim_digests @@ -368,7 +400,7 @@ where }; if let Err(err) = res.await { - tracing::error!("Failed to submit {order_id}: {err}"); + tracing::error!("Failed to submit {order_id}: {err:?}"); if let Err(db_err) = self.db.set_order_failure(order_id, "Failed to submit").await { tracing::error!("Failed to set order failure during proof submission: {order_id} {db_err:?}"); } diff --git a/crates/broker/src/tests/e2e.rs b/crates/broker/src/tests/e2e.rs index 0f91fd788..47d8835a7 100644 --- a/crates/broker/src/tests/e2e.rs +++ b/crates/broker/src/tests/e2e.rs @@ -33,7 +33,7 @@ use boundless_market::{ hit_points::default_allowance, Callback, FulfillmentData, Offer, Predicate, ProofRequest, RequestId, RequestInput, Requirements, }, - selector::{is_groth16_selector, ProofType}, + selector::{is_blake3_groth16_selector, is_groth16_selector, ProofType}, storage::{MockStorageProvider, StorageProvider}, Deployment, }; @@ -76,6 +76,12 @@ fn generate_request( if proof_type == ProofType::Groth16 { requirements = requirements.with_groth16_proof(); + } else if proof_type == ProofType::Blake3Groth16 { + requirements = requirements.with_blake3_groth16_proof(); + let blake3_claim_digest = + blake3_groth16::Blake3Groth16ReceiptClaim::ok(ECHO_ID, [255u8; 32]).digest(); + requirements = + requirements.with_predicate(Predicate::claim_digest_match(blake3_claim_digest)); } if let Some(callback) = callback { requirements = requirements.with_callback(callback); @@ -85,7 +91,7 @@ fn generate_request( requirements, image_url, input.unwrap_or_else(|| { - RequestInput::builder().write_slice(&[0x41, 0x41, 0x41, 0x41]).build_inline().unwrap() + RequestInput::builder().write_slice(&[255u8; 32]).build_inline().unwrap() }), offer.unwrap_or(Offer { minPrice: parse_ether("0.02").unwrap(), @@ -485,6 +491,75 @@ async fn e2e_with_selector() { .await; } +#[tokio::test] +#[traced_test] +async fn e2e_with_blake3_groth16_selector() { + // Setup anvil + let anvil = Anvil::new().spawn(); + + // Setup signers / providers + let ctx = create_test_ctx(&anvil).await.unwrap(); + + // Deposit prover / customer balances + ctx.prover_market + .deposit_collateral_with_permit(default_allowance(), &ctx.prover_signer) + .await + .unwrap(); + ctx.customer_market.deposit(utils::parse_ether("0.5").unwrap()).await.unwrap(); + + // Start broker + let config = new_config(1).await; + let args = broker_args( + config.path().to_path_buf(), + ctx.deployment.clone(), + anvil.endpoint_url(), + ctx.prover_signer, + ); + let broker = Broker::new( + args, + ctx.prover_provider, + ConfigWatcher::new(config.path()).await.unwrap(), + Default::default(), + ) + .await + .unwrap(); + // Provide URL for ECHO program + let storage = MockStorageProvider::start(); + let image_url = storage.upload_program(ECHO_ELF).await.unwrap(); + + // Submit an order + let request = generate_request( + ctx.customer_market.index_from_nonce().await.unwrap(), + &ctx.customer_signer.address(), + ProofType::Blake3Groth16, + image_url, + None, + None, + None, + None, + ); + + run_with_broker(broker, async move { + // Submit the request + ctx.customer_market.submit_request(&request, &ctx.customer_signer).await.unwrap(); + + // Wait for fulfillment + let fulfillment = ctx + .customer_market + .wait_for_request_fulfillment( + U256::from(request.id), + Duration::from_secs(1), + request.expires_at(), + ) + .await + .unwrap(); + let seal = fulfillment.seal; + let selector = FixedBytes(seal[0..4].try_into().unwrap()); + assert!(is_blake3_groth16_selector(selector)); + }) + .await; +} + #[tokio::test] #[traced_test] #[ignore = "runs a proof; requires BONSAI if RISC0_DEV_MODE=FALSE"] diff --git a/crates/broker/src/utils.rs b/crates/broker/src/utils.rs index edf440360..a38fd77ef 100644 --- a/crates/broker/src/utils.rs +++ b/crates/broker/src/utils.rs @@ -133,7 +133,7 @@ pub(crate) async fn estimate_gas_to_fulfill( .context("unsupported selector")? { ProofType::Any | ProofType::Inclusion => 0, - ProofType::Groth16 => groth16, + ProofType::Groth16 | ProofType::Blake3Groth16 => groth16, proof_type => { tracing::warn!("Unknown proof type in gas cost estimation: {proof_type:?}"); 0 diff --git a/crates/guest/assessor/assessor-guest/Cargo.lock b/crates/guest/assessor/assessor-guest/Cargo.lock index 31932ca79..d4887d402 100644 --- a/crates/guest/assessor/assessor-guest/Cargo.lock +++ b/crates/guest/assessor/assessor-guest/Cargo.lock @@ -2,6 +2,17 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "addchain" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" +dependencies = [ + "num-bigint 0.3.3", + "num-integer", + "num-traits", +] + [[package]] name = "addr2line" version = "0.24.2" @@ -762,6 +773,15 @@ version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "ark-bn254" version = "0.5.0" @@ -822,7 +842,7 @@ dependencies = [ "fnv", "hashbrown 0.15.5", "itertools 0.13.0", - "num-bigint", + "num-bigint 0.4.6", "num-integer", "num-traits", "zeroize", @@ -839,7 +859,7 @@ dependencies = [ "ark-serialize 0.3.0", "ark-std 0.3.0", "derivative", - "num-bigint", + "num-bigint 0.4.6", "num-traits", "paste", "rustc_version 0.3.3", @@ -859,7 +879,7 @@ dependencies = [ "derivative", "digest 0.10.7", "itertools 0.10.5", - "num-bigint", + "num-bigint 0.4.6", "num-traits", "paste", "rustc_version 0.4.1", @@ -880,7 +900,7 @@ dependencies = [ "digest 0.10.7", "educe", "itertools 0.13.0", - "num-bigint", + "num-bigint 0.4.6", "num-traits", "paste", "zeroize", @@ -922,7 +942,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" dependencies = [ - "num-bigint", + "num-bigint 0.4.6", "num-traits", "quote", "syn 1.0.109", @@ -934,7 +954,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "num-bigint", + "num-bigint 0.4.6", "num-traits", "proc-macro2", "quote", @@ -947,7 +967,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" dependencies = [ - "num-bigint", + "num-bigint 0.4.6", "num-traits", "proc-macro2", "quote", @@ -995,7 +1015,7 @@ dependencies = [ "ark-relations", "ark-std 0.5.0", "educe", - "num-bigint", + "num-bigint 0.4.6", "num-integer", "num-traits", "tracing", @@ -1031,7 +1051,7 @@ checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ "ark-std 0.4.0", "digest 0.10.7", - "num-bigint", + "num-bigint 0.4.6", ] [[package]] @@ -1044,7 +1064,7 @@ dependencies = [ "ark-std 0.5.0", "arrayvec", "digest 0.10.7", - "num-bigint", + "num-bigint 0.4.6", ] [[package]] @@ -1106,6 +1126,12 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + [[package]] name = "arrayvec" version = "0.7.6" @@ -1880,6 +1906,19 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + [[package]] name = "block" version = "0.1.6" @@ -1968,6 +2007,8 @@ dependencies = [ "async-stream", "async-trait", "aws-sdk-s3", + "blake3", + "borsh", "bytemuck", "chrono", "clap", @@ -1980,6 +2021,8 @@ dependencies = [ "rand 0.9.2", "reqwest", "risc0-aggregation", + "risc0-binfmt", + "risc0-circuit-recursion", "risc0-ethereum-contracts", "risc0-zkvm", "rmp-serde", @@ -2274,6 +2317,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "core-foundation" version = "0.9.4" @@ -2363,6 +2412,25 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -2542,6 +2610,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "derive_builder" version = "0.20.2" @@ -2615,6 +2694,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "directories" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +dependencies = [ + "dirs-sys", +] + [[package]] name = "dirs" version = "6.0.0" @@ -2680,6 +2768,20 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +[[package]] +name = "downloader" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac1e888d6830712d565b2f3a974be3200be9296bc1b03db8251a4cbf18a4a34" +dependencies = [ + "digest 0.10.7", + "futures", + "rand 0.8.5", + "reqwest", + "thiserror 1.0.69", + "tokio", +] + [[package]] name = "dunce" version = "1.0.5" @@ -2923,10 +3025,28 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ + "bitvec", + "byteorder", + "ff_derive", "rand_core 0.6.4", "subtle", ] +[[package]] +name = "ff_derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f10d12652036b0e99197587c6ba87a8fc3031986499973c030d8b44fcc151b60" +dependencies = [ + "addchain", + "num-bigint 0.3.3", + "num-integer", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "find-msvc-tools" version = "0.1.0" @@ -2951,6 +3071,16 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -3152,8 +3282,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -3163,9 +3295,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", "wasi 0.14.3+wasi-0.2.4", + "wasm-bindgen", ] [[package]] @@ -3535,6 +3669,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.2", "tower-service", + "webpki-roots", ] [[package]] @@ -4048,9 +4183,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" dependencies = [ "value-bag", ] @@ -4073,6 +4208,12 @@ dependencies = [ "hashbrown 0.15.5", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "macro-string" version = "0.1.4" @@ -4102,6 +4243,16 @@ dependencies = [ "regex-automata", ] +[[package]] +name = "matrixmultiply" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +dependencies = [ + "autocfg", + "rawpointer", +] + [[package]] name = "md-5" version = "0.10.6" @@ -4174,6 +4325,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -4204,6 +4356,22 @@ dependencies = [ "tempfile", ] +[[package]] +name = "ndarray" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", + "rayon", +] + [[package]] name = "new_debug_unreachable" version = "1.0.6" @@ -4235,6 +4403,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -4262,6 +4441,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -4329,6 +4517,15 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "nvtx" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad2e855e8019f99e4b94ac33670eb4e4f570a2e044f3749a0b2c7f83b841e52c" +dependencies = [ + "cc", +] + [[package]] name = "nybbles" version = "0.4.3" @@ -4648,6 +4845,21 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + [[package]] name = "postcard" version = "1.1.3" @@ -4795,12 +5007,81 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "puffin" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa9dae7b05c02ec1a6bc9bcf20d8bc64a7dcbf57934107902a872014899b741f" +dependencies = [ + "anyhow", + "byteorder", + "cfg-if", + "itertools 0.10.5", + "once_cell", + "parking_lot", +] + [[package]] name = "quick-error" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls 0.23.31", + "socket2 0.6.0", + "thiserror 2.0.16", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash 2.1.1", + "rustls 0.23.31", + "rustls-pki-types", + "slab", + "thiserror 2.0.16", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.0", + "tracing", + "windows-sys 0.60.2", +] + [[package]] name = "quote" version = "1.0.40" @@ -4893,6 +5174,32 @@ dependencies = [ "rand_core 0.9.3", ] +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.5.17" @@ -5005,6 +5312,8 @@ dependencies = [ "native-tls", "percent-encoding", "pin-project-lite", + "quinn", + "rustls 0.23.31", "rustls-pki-types", "serde", "serde_json", @@ -5012,6 +5321,7 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-native-tls", + "tokio-rustls 0.26.2", "tower", "tower-http", "tower-service", @@ -5019,6 +5329,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots", ] [[package]] @@ -5129,6 +5440,20 @@ dependencies = [ "tempfile", ] +[[package]] +name = "risc0-build-kernel" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaaa3e04c71e4244354dd9e3f8b89378cfecfbb03f9c72de4e2e7e0482b30c9a" +dependencies = [ + "cc", + "directories", + "hex", + "rayon", + "sha2", + "tempfile", +] + [[package]] name = "risc0-circuit-keccak" version = "4.0.3" @@ -5153,11 +5478,33 @@ checksum = "028cd26e1b1f7bdd964d2f1eac8f812d1872b6b8fd24f10804f07d916b90000e" dependencies = [ "anyhow", "bytemuck", + "cfg-if", + "downloader", "hex", + "lazy-regex", "metal", + "rand 0.9.2", + "rayon", + "risc0-circuit-recursion-sys", "risc0-core", + "risc0-sys", "risc0-zkp", + "serde", + "sha2", "tracing", + "zip", +] + +[[package]] +name = "risc0-circuit-recursion-sys" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5f137bcd382520efcd982e4ee131da43f448b12ade979fe9d1fa92d4337dec0" +dependencies = [ + "glob", + "risc0-build-kernel", + "risc0-core", + "risc0-sys", ] [[package]] @@ -5185,6 +5532,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80f2723fedace48c6c5a505bd8f97ac4e1712bc4cb769083e10536d862b66987" dependencies = [ "bytemuck", + "nvtx", + "puffin", "rand_core 0.9.3", ] @@ -5221,13 +5570,23 @@ dependencies = [ "ark-serialize 0.5.0", "bytemuck", "hex", - "num-bigint", + "num-bigint 0.4.6", "num-traits", "risc0-binfmt", "risc0-zkp", "serde", ] +[[package]] +name = "risc0-sys" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960c8295fbb87e1e73e332f8f7de2fba0252377575042d9d3e9a4eb50a38e078" +dependencies = [ + "anyhow", + "risc0-build-kernel", +] + [[package]] name = "risc0-zkos-v1compat" version = "2.2.1" @@ -5251,12 +5610,18 @@ dependencies = [ "bytemuck", "cfg-if", "digest 0.10.7", + "ff 0.13.1", "hex", "hex-literal", "metal", + "ndarray", + "parking_lot", "paste", + "rand 0.9.2", "rand_core 0.9.3", + "rayon", "risc0-core", + "risc0-sys", "risc0-zkvm-platform", "serde", "sha2", @@ -5390,7 +5755,7 @@ dependencies = [ "bytes", "fastrlp 0.3.1", "fastrlp 0.4.0", - "num-bigint", + "num-bigint 0.4.6", "num-integer", "num-traits", "parity-scale-codec", @@ -5499,6 +5864,7 @@ checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "aws-lc-rs", "once_cell", + "ring", "rustls-pki-types", "rustls-webpki 0.103.4", "subtle", @@ -5544,6 +5910,7 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ + "web-time", "zeroize", ] @@ -5974,6 +6341,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "similar" version = "2.7.0" @@ -6346,6 +6719,21 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.47.1" @@ -6912,6 +7300,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "which" version = "4.4.2" @@ -7346,6 +7753,35 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "zip" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "flate2", + "indexmap 2.11.0", + "memchr", + "thiserror 2.0.16", + "zopfli", +] + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + [[patch.unused]] name = "sha2" version = "0.10.8" diff --git a/crates/test-utils/Cargo.toml b/crates/test-utils/Cargo.toml index 329956e14..ab040bfed 100644 --- a/crates/test-utils/Cargo.toml +++ b/crates/test-utils/Cargo.toml @@ -26,11 +26,22 @@ povw = [ ] [dependencies] -alloy = { workspace = true, features = ["network", "node-bindings", "rpc-types", "providers", "transports", "sol-types", "contract", "signers", "signer-local"] } +alloy = { workspace = true, features = [ + "network", + "node-bindings", + "rpc-types", + "providers", + "transports", + "sol-types", + "contract", + "signers", + "signer-local", +] } alloy-primitives = { workspace = true } alloy-sol-types = { workspace = true } anyhow = { workspace = true } bincode = { version = "1.3", optional = true } +blake3_groth16 = { workspace = true } boundless-market = { workspace = true, features = ["test-utils"] } boundless-povw = { workspace = true, optional = true } boundless-zkc = { workspace = true } diff --git a/crates/test-utils/src/verifier.rs b/crates/test-utils/src/verifier.rs index ff2bc3fe3..3aec13b1b 100644 --- a/crates/test-utils/src/verifier.rs +++ b/crates/test-utils/src/verifier.rs @@ -19,7 +19,8 @@ use alloy::{ use anyhow::{Context, Result}; use boundless_market::contracts::bytecode::RiscZeroVerifierRouter::RiscZeroVerifierRouterInstance; use boundless_market::contracts::bytecode::{ - RiscZeroGroth16Verifier, RiscZeroMockVerifier, RiscZeroSetVerifier, RiscZeroVerifierRouter, + Blake3Groth16Verifier, RiscZeroGroth16Verifier, RiscZeroMockVerifier, RiscZeroSetVerifier, + RiscZeroVerifierRouter, }; use risc0_aggregation::SetInclusionReceiptVerifierParameters; use risc0_circuit_recursion::control_id::{ALLOWED_CONTROL_ROOT, BN254_IDENTITY_CONTROL_ID}; @@ -34,6 +35,16 @@ pub async fn deploy_mock_verifier(deployer_provider: P) -> Result( + deployer_provider: P, +) -> Result
{ + let instance = + RiscZeroMockVerifier::deploy(deployer_provider, FixedBytes([0xFFu8, 0xFF, 0x00, 0x00])) + .await + .context("failed to deploy RiscZeroMockVerifier")?; + Ok(*instance.address()) +} + /// Deploy a RiscZeroGroth16Verifier contract pub async fn deploy_groth16_verifier( deployer_provider: P, @@ -47,6 +58,18 @@ pub async fn deploy_groth16_verifier( Ok(*instance.address()) } +/// Deploy a Blake3Groth16Verifier contract +pub async fn deploy_blake3_groth16_verifier( + deployer_provider: P, + control_root: FixedBytes<32>, + bn254_control_id: FixedBytes<32>, +) -> Result
{ + let instance = Blake3Groth16Verifier::deploy(deployer_provider, control_root, bn254_control_id) + .await + .context("failed to deploy Blake3Groth16Verifier")?; + Ok(*instance.address()) +} + /// Deploy a RiscZeroVerifierRouter contract pub async fn deploy_verifier_router( deployer_provider: P, @@ -118,6 +141,30 @@ pub async fn setup_verifiers( let router_instance = RiscZeroVerifierRouterInstance::new(verifier_router, deployer_provider.clone()); + // Deploying the blake3 groth16 verifier + let (blake_groth16_verifier, blake_groth16_selector) = match is_dev_mode() { + true => ( + deploy_mock_blake3_groth16_verifier(&deployer_provider).await?, + [0xFFu8, 0xFF, 0x00, 0x00], + ), + false => { + let control_root = ALLOWED_CONTROL_ROOT; + let mut bn254_control_id = BN254_IDENTITY_CONTROL_ID; + bn254_control_id.as_mut_bytes().reverse(); + let verifier_parameters_digest = blake3_groth16::verify::verifier_parameters().digest(); + let b3_groth16_verifier = deploy_blake3_groth16_verifier( + &deployer_provider, + <[u8; 32]>::from(control_root).into(), + <[u8; 32]>::from(bn254_control_id).into(), + ) + .await?; + + let b3_groth16_selector = verifier_parameters_digest.as_bytes()[..4].try_into()?; + + (b3_groth16_verifier, b3_groth16_selector) + } + }; + // Add groth16 verifier to router let call = &router_instance .addVerifier(groth16_selector.into(), groth16_verifier) @@ -133,5 +180,11 @@ pub async fn setup_verifiers( .from(deployer_address); call.send().await?.get_receipt().await?; + // Add blake3 groth16 verifier to router + let call = &router_instance + .addVerifier(blake_groth16_selector.into(), blake_groth16_verifier) + .from(deployer_address); + call.send().await?.get_receipt().await?; + Ok((verifier_router, set_verifier, groth16_verifier)) } diff --git a/dockerfiles/agent.dockerfile b/dockerfiles/agent.dockerfile index be84576f9..3f57d17dc 100644 --- a/dockerfiles/agent.dockerfile +++ b/dockerfiles/agent.dockerfile @@ -69,11 +69,30 @@ RUN --mount=type=secret,id=ci_cache_creds,target=/root/.aws/credentials \ FROM ${CUDA_RUNTIME_IMG} AS runtime RUN apt-get update -q -y \ - && apt-get install -q -y ca-certificates libssl3 \ + && apt-get install -q -y ca-certificates libssl3 curl tar xz-utils \ && rm -rf /var/lib/apt/lists/* +# Download and extract BLAKE3 Groth16 artifacts. +ARG BLAKE3_GROTH16_ARTIFACTS_URL +# If USE_LOCAL_BLAKE3_GROTH16_SETUP is set to 1 or yes or true, skip downloading and expect user to mount setup files +ARG USE_LOCAL_BLAKE3_GROTH16_SETUP +ENV BLAKE3_GROTH16_SETUP_DIR=/.blake3_groth16_artifacts/ + +RUN if [ "$USE_LOCAL_BLAKE3_GROTH16_SETUP" = "1" ] || [ "$USE_LOCAL_BLAKE3_GROTH16_SETUP" = "yes" ] || [ "$USE_LOCAL_BLAKE3_GROTH16_SETUP" = "true" ]; then \ + echo "Using local BLAKE3 Groth16 setup files, skipping download"; \ + else \ + if [ -z "$BLAKE3_GROTH16_ARTIFACTS_URL" ]; then \ + echo "ERROR: BLAKE3_GROTH16_ARTIFACTS_URL not specified. Either set USE_LOCAL_BLAKE3_GROTH16_SETUP=1 and mount the setup files, or provide a URL via BLAKE3_GROTH16_ARTIFACTS_URL"; exit 1; \ + fi && \ + mkdir -p $BLAKE3_GROTH16_SETUP_DIR && \ + curl -L -o /tmp/blake3_groth16_artifacts.tar.xz "$BLAKE3_GROTH16_ARTIFACTS_URL" && \ + tar -xvf /tmp/blake3_groth16_artifacts.tar.xz -C $BLAKE3_GROTH16_SETUP_DIR --strip-components=1 && \ + rm -rf /tmp/* ; \ + fi + # Main prover COPY --from=builder /src/agent /app/agent COPY --from=builder /usr/local/risc0 /usr/local/risc0 + ENTRYPOINT ["/app/agent"] diff --git a/dockerfiles/agent.prebuilt.dockerfile b/dockerfiles/agent.prebuilt.dockerfile index d9fc32c77..85a340695 100644 --- a/dockerfiles/agent.prebuilt.dockerfile +++ b/dockerfiles/agent.prebuilt.dockerfile @@ -8,7 +8,7 @@ ARG BINARY_URL # Install runtime dependencies matching non-prebuilt version RUN apt-get update && \ - apt-get install -y ca-certificates libssl3 curl tar && \ + apt-get install -y ca-certificates libssl3 curl tar xz-utils && \ rm -rf /var/lib/apt/lists/* # Download and extract bento bundle tar.gz @@ -39,5 +39,23 @@ RUN curl -L https://risczero.com/install | bash && \ # Clean up any temporary files to reduce image size rm -rf /tmp/* /var/tmp/* +# Download and extract BLAKE3 Groth16 artifacts. +ARG BLAKE3_GROTH16_ARTIFACTS_URL +# If USE_LOCAL_BLAKE3_GROTH16_SETUP is set to 1 or yes or true, skip downloading and expect user to mount setup files +ARG USE_LOCAL_BLAKE3_GROTH16_SETUP +ENV BLAKE3_GROTH16_SETUP_DIR=/.blake3_groth16_artifacts/ + +RUN if [ "$USE_LOCAL_BLAKE3_GROTH16_SETUP" = "1" ] || [ "$USE_LOCAL_BLAKE3_GROTH16_SETUP" = "yes" ] || [ "$USE_LOCAL_BLAKE3_GROTH16_SETUP" = "true" ]; then \ + echo "Using local BLAKE3 Groth16 setup files, skipping download"; \ + else \ + if [ -z "$BLAKE3_GROTH16_ARTIFACTS_URL" ]; then \ + echo "ERROR: BLAKE3_GROTH16_ARTIFACTS_URL not specified. Either set USE_LOCAL_BLAKE3_GROTH16_SETUP=1 and mount the setup files, or provide a URL via BLAKE3_GROTH16_ARTIFACTS_URL"; exit 1; \ + fi && \ + mkdir -p $BLAKE3_GROTH16_SETUP_DIR && \ + curl -L -o /tmp/blake3_groth16_artifacts.tar.xz "$BLAKE3_GROTH16_ARTIFACTS_URL" && \ + tar -xvf /tmp/blake3_groth16_artifacts.tar.xz -C $BLAKE3_GROTH16_SETUP_DIR --strip-components=1 && \ + rm -rf /tmp/* ; \ + fi + WORKDIR /app ENTRYPOINT ["/app/agent"] \ No newline at end of file diff --git a/dockerfiles/broker.dockerfile b/dockerfiles/broker.dockerfile index b074f1d30..48845ece1 100644 --- a/dockerfiles/broker.dockerfile +++ b/dockerfiles/broker.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.88.0-bookworm AS init +FROM rust:1.89.0-bookworm AS init RUN apt-get -qq update && \ apt-get install -y -q clang @@ -22,6 +22,11 @@ RUN --mount=type=secret,id=githubTokenSecret,target=/run/secrets/githubTokenSecr RUN cargo install cargo-chef +# Install protoc +RUN curl -o protoc.zip -L https://github.com/protocolbuffers/protobuf/releases/download/v31.1/protoc-31.1-linux-x86_64.zip \ + && unzip protoc.zip -d /usr/local \ + && rm protoc.zip + FROM init AS planner WORKDIR /src/ @@ -34,7 +39,8 @@ COPY contracts/ ./contracts/ COPY lib/ ./lib/ COPY remappings.txt . COPY foundry.toml . - +COPY blake3_groth16/ ./blake3_groth16/ +COPY xtask/ ./xtask/ RUN cargo chef prepare --recipe-path recipe.json FROM init AS builder @@ -53,6 +59,8 @@ COPY contracts/ ./contracts/ COPY lib/ ./lib/ COPY remappings.txt . COPY foundry.toml . +COPY blake3_groth16/ ./blake3_groth16/ +COPY xtask/ ./xtask/ ENV PATH="$PATH:/root/.foundry/bin" RUN forge build @@ -62,7 +70,7 @@ SHELL ["/bin/bash", "-c"] RUN cargo build --release --bin broker && \ cp /src/target/release/broker /src/broker -FROM rust:1.88.0-bookworm AS runtime +FROM rust:1.89.0-bookworm AS runtime RUN mkdir /app/ diff --git a/dockerfiles/rest_api.dockerfile b/dockerfiles/rest_api.dockerfile index b45cb6772..c9fbf1364 100644 --- a/dockerfiles/rest_api.dockerfile +++ b/dockerfiles/rest_api.dockerfile @@ -30,4 +30,4 @@ RUN mkdir /app/ && \ apt install -y -q openssl COPY --from=rust-builder /src/rest_api /app/rest_api -ENTRYPOINT ["/app/rest_api"] +ENTRYPOINT ["/app/rest_api"] \ No newline at end of file diff --git a/examples/composition/Cargo.lock b/examples/composition/Cargo.lock index 0a8dcfde1..c8b8e1b48 100644 --- a/examples/composition/Cargo.lock +++ b/examples/composition/Cargo.lock @@ -1152,6 +1152,12 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + [[package]] name = "arrayvec" version = "0.7.6" @@ -2032,6 +2038,42 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "blake3_groth16" +version = "1.2.0" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ff 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "bincode", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", + "borsh", + "boundless-market", + "hex", + "risc0-groth16", + "risc0-zkp", + "risc0-zkvm", + "serde", + "serde_json", + "tokio", + "tracing", +] + [[package]] name = "block" version = "0.1.6" @@ -2077,6 +2119,18 @@ name = "bonsai-sdk" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21055e2f49cbbdbfe9f8f96d597c5527b0c6ab7933341fdc2f147180e48a988e" +dependencies = [ + "duplicate", + "maybe-async", + "reqwest", + "serde", + "thiserror 2.0.17", +] + +[[package]] +name = "bonsai-sdk" +version = "1.4.1" +source = "git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2#6ed3f0321638ae7eb9c097b8aa8becba3f4b1350" dependencies = [ "duplicate", "maybe-async", @@ -2134,6 +2188,8 @@ dependencies = [ "async-stream", "async-trait", "aws-sdk-s3", + "blake3", + "borsh", "bytemuck", "chrono", "clap", @@ -2146,6 +2202,7 @@ dependencies = [ "rand 0.9.2", "reqwest", "risc0-aggregation", + "risc0-binfmt", "risc0-circuit-recursion", "risc0-ethereum-contracts", "risc0-zkvm", @@ -2174,6 +2231,7 @@ dependencies = [ "alloy-primitives", "alloy-sol-types", "anyhow", + "blake3_groth16", "boundless-market", "boundless-zkc", "guest-assessor", @@ -2217,7 +2275,8 @@ dependencies = [ "aws-config", "aws-sdk-s3", "bincode", - "bonsai-sdk", + "blake3_groth16", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", "boundless-assessor", "boundless-market", "boundless-test-utils", @@ -2230,6 +2289,8 @@ dependencies = [ "http-cache-reqwest", "moka", "notify", + "num-bigint 0.4.6", + "num-traits", "rand 0.9.2", "requestor-lists", "reqwest", @@ -2596,6 +2657,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "core-foundation" version = "0.9.4" @@ -6838,6 +6905,7 @@ dependencies = [ "addr2line 0.24.2", "anyhow", "bincode", + "bonsai-sdk 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "borsh", "bytemuck", "bytes", diff --git a/examples/counter-with-callback/Cargo.lock b/examples/counter-with-callback/Cargo.lock index f4f4b2b16..72b36acc5 100644 --- a/examples/counter-with-callback/Cargo.lock +++ b/examples/counter-with-callback/Cargo.lock @@ -1152,6 +1152,12 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + [[package]] name = "arrayvec" version = "0.7.6" @@ -2032,6 +2038,42 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "blake3_groth16" +version = "1.2.0" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ff 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "bincode", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", + "borsh", + "boundless-market", + "hex", + "risc0-groth16", + "risc0-zkp", + "risc0-zkvm", + "serde", + "serde_json", + "tokio", + "tracing", +] + [[package]] name = "block" version = "0.1.6" @@ -2077,6 +2119,18 @@ name = "bonsai-sdk" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21055e2f49cbbdbfe9f8f96d597c5527b0c6ab7933341fdc2f147180e48a988e" +dependencies = [ + "duplicate", + "maybe-async", + "reqwest", + "serde", + "thiserror 2.0.17", +] + +[[package]] +name = "bonsai-sdk" +version = "1.4.1" +source = "git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2#6ed3f0321638ae7eb9c097b8aa8becba3f4b1350" dependencies = [ "duplicate", "maybe-async", @@ -2134,6 +2188,8 @@ dependencies = [ "async-stream", "async-trait", "aws-sdk-s3", + "blake3", + "borsh", "bytemuck", "chrono", "clap", @@ -2146,6 +2202,7 @@ dependencies = [ "rand 0.9.2", "reqwest", "risc0-aggregation", + "risc0-binfmt", "risc0-circuit-recursion", "risc0-ethereum-contracts", "risc0-zkvm", @@ -2174,6 +2231,7 @@ dependencies = [ "alloy-primitives", "alloy-sol-types", "anyhow", + "blake3_groth16", "boundless-market", "boundless-zkc", "guest-assessor", @@ -2217,7 +2275,8 @@ dependencies = [ "aws-config", "aws-sdk-s3", "bincode", - "bonsai-sdk", + "blake3_groth16", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", "boundless-assessor", "boundless-market", "boundless-test-utils", @@ -2230,6 +2289,8 @@ dependencies = [ "http-cache-reqwest", "moka", "notify", + "num-bigint 0.4.6", + "num-traits", "rand 0.9.2", "requestor-lists", "reqwest", @@ -2596,6 +2657,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "core-foundation" version = "0.9.4" @@ -6836,6 +6903,7 @@ dependencies = [ "addr2line 0.24.2", "anyhow", "bincode", + "bonsai-sdk 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "borsh", "bytemuck", "bytes", diff --git a/examples/counter/Cargo.lock b/examples/counter/Cargo.lock index 72bf4e9af..5da4d5844 100644 --- a/examples/counter/Cargo.lock +++ b/examples/counter/Cargo.lock @@ -1152,6 +1152,12 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + [[package]] name = "arrayvec" version = "0.7.6" @@ -2032,6 +2038,42 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "blake3_groth16" +version = "1.2.0" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ff 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "bincode", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", + "borsh", + "boundless-market", + "hex", + "risc0-groth16", + "risc0-zkp", + "risc0-zkvm", + "serde", + "serde_json", + "tokio", + "tracing", +] + [[package]] name = "block" version = "0.1.6" @@ -2077,6 +2119,18 @@ name = "bonsai-sdk" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21055e2f49cbbdbfe9f8f96d597c5527b0c6ab7933341fdc2f147180e48a988e" +dependencies = [ + "duplicate", + "maybe-async", + "reqwest", + "serde", + "thiserror 2.0.17", +] + +[[package]] +name = "bonsai-sdk" +version = "1.4.1" +source = "git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2#6ed3f0321638ae7eb9c097b8aa8becba3f4b1350" dependencies = [ "duplicate", "maybe-async", @@ -2134,6 +2188,8 @@ dependencies = [ "async-stream", "async-trait", "aws-sdk-s3", + "blake3", + "borsh", "bytemuck", "chrono", "clap", @@ -2146,6 +2202,7 @@ dependencies = [ "rand 0.9.2", "reqwest", "risc0-aggregation", + "risc0-binfmt", "risc0-circuit-recursion", "risc0-ethereum-contracts", "risc0-zkvm", @@ -2174,6 +2231,7 @@ dependencies = [ "alloy-primitives", "alloy-sol-types", "anyhow", + "blake3_groth16", "boundless-market", "boundless-zkc", "guest-assessor", @@ -2217,7 +2275,8 @@ dependencies = [ "aws-config", "aws-sdk-s3", "bincode", - "bonsai-sdk", + "blake3_groth16", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", "boundless-assessor", "boundless-market", "boundless-test-utils", @@ -2230,6 +2289,8 @@ dependencies = [ "http-cache-reqwest", "moka", "notify", + "num-bigint 0.4.6", + "num-traits", "rand 0.9.2", "requestor-lists", "reqwest", @@ -2596,6 +2657,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "core-foundation" version = "0.9.4" @@ -6836,6 +6903,7 @@ dependencies = [ "addr2line 0.24.2", "anyhow", "bincode", + "bonsai-sdk 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "borsh", "bytemuck", "bytes", diff --git a/examples/smart-contract-requestor/Cargo.lock b/examples/smart-contract-requestor/Cargo.lock index 6264add9c..f6964e501 100644 --- a/examples/smart-contract-requestor/Cargo.lock +++ b/examples/smart-contract-requestor/Cargo.lock @@ -1152,6 +1152,12 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + [[package]] name = "arrayvec" version = "0.7.6" @@ -2032,6 +2038,42 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "blake3_groth16" +version = "1.2.0" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ff 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "bincode", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", + "borsh", + "boundless-market", + "hex", + "risc0-groth16", + "risc0-zkp", + "risc0-zkvm", + "serde", + "serde_json", + "tokio", + "tracing", +] + [[package]] name = "block" version = "0.1.6" @@ -2077,6 +2119,18 @@ name = "bonsai-sdk" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21055e2f49cbbdbfe9f8f96d597c5527b0c6ab7933341fdc2f147180e48a988e" +dependencies = [ + "duplicate", + "maybe-async", + "reqwest", + "serde", + "thiserror 2.0.17", +] + +[[package]] +name = "bonsai-sdk" +version = "1.4.1" +source = "git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2#6ed3f0321638ae7eb9c097b8aa8becba3f4b1350" dependencies = [ "duplicate", "maybe-async", @@ -2134,6 +2188,8 @@ dependencies = [ "async-stream", "async-trait", "aws-sdk-s3", + "blake3", + "borsh", "bytemuck", "chrono", "clap", @@ -2146,6 +2202,7 @@ dependencies = [ "rand 0.9.2", "reqwest", "risc0-aggregation", + "risc0-binfmt", "risc0-circuit-recursion", "risc0-ethereum-contracts", "risc0-zkvm", @@ -2174,6 +2231,7 @@ dependencies = [ "alloy-primitives", "alloy-sol-types", "anyhow", + "blake3_groth16", "boundless-market", "boundless-zkc", "guest-assessor", @@ -2217,7 +2275,8 @@ dependencies = [ "aws-config", "aws-sdk-s3", "bincode", - "bonsai-sdk", + "blake3_groth16", + "bonsai-sdk 1.4.1 (git+https://github.com/risc0/risc0?branch=flaub%2Fshrink-bitvm2)", "boundless-assessor", "boundless-market", "boundless-test-utils", @@ -2230,6 +2289,8 @@ dependencies = [ "http-cache-reqwest", "moka", "notify", + "num-bigint 0.4.6", + "num-traits", "rand 0.9.2", "requestor-lists", "reqwest", @@ -2596,6 +2657,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "core-foundation" version = "0.9.4" @@ -6836,7 +6903,7 @@ dependencies = [ "addr2line 0.24.2", "anyhow", "bincode", - "bonsai-sdk", + "bonsai-sdk 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "borsh", "bytemuck", "bytes", diff --git a/justfile b/justfile index 55e6c2971..dccdeec8c 100644 --- a/justfile +++ b/justfile @@ -235,6 +235,7 @@ localnet action="up": check-deps PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" ADMIN_ADDRESS="0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" DEPOSIT_AMOUNT="100000000000000000000" + CHAIN_ID="31337" CI=${CI:-0} if [ "{{action}}" = "up" ]; then @@ -350,6 +351,7 @@ localnet action="up": check-deps BOUNDLESS_MARKET_ADDRESS=$BOUNDLESS_MARKET_ADDRESS \ SET_VERIFIER_ADDRESS=$SET_VERIFIER_ADDRESS \ VERIFIER_ADDRESS=$VERIFIER_ADDRESS \ + CHAIN_ID=$CHAIN_ID \ ./target/debug/boundless account deposit-collateral 100 || echo "Note: Stake deposit failed, but this is non-critical for localnet setup" echo "Localnet is running with RISC0_DEV_MODE=$RISC0_DEV_MODE" diff --git a/license-check.py b/license-check.py index b794c05f9..6461fead4 100755 --- a/license-check.py +++ b/license-check.py @@ -36,6 +36,7 @@ ] SKIP_PATHS = [ + str(Path.cwd()) + "/blake3_groth16/src/seal_to_json.rs", # ImageID.sol is automatically generated. str(Path.cwd()) + "/contracts/src/SetBuilderImageID.sol", str(Path.cwd()) + "/contracts/src/libraries/AssessorImageID.sol", @@ -50,6 +51,7 @@ ] APACHE_PATHS = [ + str(Path.cwd()) + "/blake3_groth16", str(Path.cwd()) + "/contracts/src/HitPoints.sol", str(Path.cwd()) + "/contracts/src/IBoundlessMarket.sol", str(Path.cwd()) + "/contracts/src/IHitPoints.sol", @@ -73,6 +75,7 @@ str(Path.cwd()) + "/examples", str(Path.cwd()) + "/crates/lambdas", str(Path.cwd()) + "/crates/rewards", + str(Path.cwd()) + "/xtask", ] def check_header(file, expected_year, lines_actual): diff --git a/xtask/Cargo.toml b/xtask/Cargo.toml new file mode 100644 index 000000000..dcc3354f2 --- /dev/null +++ b/xtask/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "xtask" +version = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +repository = { workspace = true } + +[features] +default = [] +cuda = ["dep:risc0-groth16-sys", "blake3_groth16/cuda"] + +[dependencies] +anyhow = "1.0" +astral-tokio-tar = { version = "0.5" } +async-compression = { version = "0.4", default-features = false, features = ["lzma", "tokio"] } +aws-config = "1.0" +aws-credential-types = "1.0" +aws-sdk-s3 = { version = "1.0" } +blake3_groth16 = { path = "../blake3_groth16", features = ["prove"] } +boundless-market = { path = "../crates/boundless-market" } +clap = { version = "4.5", features = ["derive", "env"] } +guest-util = { workspace = true } +hex = { workspace = true } +liblzma = { version = "0.4", features = ["static"] } +memmap2 = { version = "0.9", optional = true } +num_cpus = "1.0" +regex = "1" +risc0-circuit-recursion = { workspace = true } +risc0-groth16-sys = { workspace = true, optional = true, features = ["cuda", "setup"] } +risc0-zkvm = { workspace = true, features = ["prove"] } +rlimit = "0.10.2" +tokio = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { version = "0.3", features = ["env-filter"] } +xshell = "0.2" diff --git a/xtask/src/bootstrap_blake3_groth16.rs b/xtask/src/bootstrap_blake3_groth16.rs new file mode 100644 index 000000000..a7e49ea99 --- /dev/null +++ b/xtask/src/bootstrap_blake3_groth16.rs @@ -0,0 +1,172 @@ +// Copyright 2025 Boundless Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::{fs, path::Path, process::Command}; + +use blake3_groth16::compress_blake3_groth16; +use boundless_market::selector::SelectorExt; +use clap::Parser; +use guest_util::ECHO_ELF; +use regex::Regex; +use risc0_circuit_recursion::control_id::{ALLOWED_CONTROL_ROOT, BN254_IDENTITY_CONTROL_ID}; +use risc0_zkvm::{default_prover, Digest, ExecutorEnv, ProverOpts}; + +#[derive(Debug, Parser)] +pub struct BootstrapBlake3Groth16 { + /// blake3-groth16 setup directory + #[arg(long, env)] + blake3_groth16_setup_dir: String, +} + +const SOL_HEADER: &str = r#"// Copyright 2025 Boundless Foundation, Inc. +// +// Use of this source code is governed by the Business Source License +// as found in the LICENSE-BSL file. +// SPDX-License-Identifier: BUSL-1.1 + +// This file is automatically generated by: +// cargo xtask bootstrap-groth16 + +"#; + +const SOLIDITY_VERIFIER_TARGET: &str = "contracts/src/blake3-groth16/Groth16Verifier.sol"; +const SOLIDITY_CONTROL_ID_PATH: &str = "contracts/src/blake3-groth16/ControlID.sol"; +const SOLIDITY_TEST_RECEIPT_PATH: &str = "contracts/test/receipts/Blake3Groth16TestReceipt.sol"; +const RUST_VERIFIER_PATH: &str = "blake3_groth16/src/verify.rs"; + +impl BootstrapBlake3Groth16 { + pub async fn run(&self) { + let current_dir = std::env::current_dir().unwrap(); + let blake3_setup_path = current_dir.join(&self.blake3_groth16_setup_dir); + bootstrap_verifying_key(&blake3_setup_path); + bootstrap_control_id(); + bootstrap_test_receipt().await; + } +} + +fn bootstrap_verifying_key(blake3_setup_path: &Path) { + let solidity_verifier_target = Path::new(SOLIDITY_VERIFIER_TARGET); + let solidity_verifier_source = blake3_setup_path.join("verifier.sol"); + std::fs::copy(&solidity_verifier_source, solidity_verifier_target).unwrap(); + let solidity_code = fs::read_to_string(solidity_verifier_source).unwrap(); + let mut rust_code = fs::read_to_string(RUST_VERIFIER_PATH).unwrap(); + + let solidity_constants = [ + "alphax", "alphay", "betax1", "betax2", "betay1", "betay2", "gammax1", "gammax2", + "gammay1", "gammay2", "deltax1", "deltax2", "deltay1", "deltay2", "IC0x", "IC0y", "IC1x", + "IC1y", + ]; + + let rust_constants = [ + "ALPHA_X", "ALPHA_Y", "BETA_X1", "BETA_X2", "BETA_Y1", "BETA_Y2", "GAMMA_X1", "GAMMA_X2", + "GAMMA_Y1", "GAMMA_Y2", "DELTA_X1", "DELTA_X2", "DELTA_Y1", "DELTA_Y2", "IC0_X", "IC0_Y", + "IC1_X", "IC1_Y", + ]; + + for (i, constant) in solidity_constants.into_iter().enumerate() { + let re = Regex::new(&format!(r"uint256 constant\s+{constant}\s*=\s*(\d+);")).unwrap(); + if let Some(caps) = re.captures(&solidity_code) { + let rust_re = + Regex::new(&format!("const {}: &str =[\\r\\n\\s]*\"\\d+\";", rust_constants[i])) + .unwrap(); + rust_code = rust_re + .replace( + &rust_code, + &format!("const {}: &str = \"{}\";", rust_constants[i], &caps[1]), + ) + .to_string(); + } else { + println!("{constant} not found"); + } + } + + fs::write(RUST_VERIFIER_PATH, rust_code).unwrap(); + + // Use rustfmt to format the file. + Command::new("rustfmt") + .arg(RUST_VERIFIER_PATH) + .status() + .unwrap_or_else(|_| panic!("failed to format {RUST_VERIFIER_PATH}")); +} + +fn bootstrap_control_id() { + const LIB_HEADER: &str = r#"pragma solidity ^0.8.9; + + library ControlID { +"#; + let control_root = + format!(r#"bytes32 public constant CONTROL_ROOT = hex"{ALLOWED_CONTROL_ROOT}";"#); + let mut bn254_control_id = BN254_IDENTITY_CONTROL_ID; + // NOTE: The solidity verifier interprets it as a uint256 and expects the opposite byte order. + bn254_control_id.as_mut_bytes().reverse(); + let bn254_control_id = format!( + r#"// NOTE: This has the opposite byte order to the value in the risc0 repository.{}bytes32 public constant BN254_CONTROL_ID = hex"{}";"#, + "\n", + hex::encode(bn254_control_id) + ); + let content = &format!("{SOL_HEADER}{LIB_HEADER}\n{control_root}\n{bn254_control_id}\n}}"); + let solidity_control_id_path = Path::new(SOLIDITY_CONTROL_ID_PATH); + fs::write(solidity_control_id_path, content).unwrap_or_else(|_| { + panic!("failed to save changes to {}", solidity_control_id_path.display()) + }); + + // Use forge fmt to format the file. + Command::new("forge") + .arg("fmt") + .arg(solidity_control_id_path.as_os_str()) + .status() + .unwrap_or_else(|_| panic!("failed to format {}", solidity_control_id_path.display())); +} + +async fn bootstrap_test_receipt() { + const LIB_HEADER: &str = r#"pragma solidity ^0.8.13; + + library TestReceipt { +"#; + let (seal, claim_digest) = generate_receipt().await; + let selector = format!("{:x}", SelectorExt::blake3_groth16_latest() as u32); + let seal = hex::encode(&seal); + + // NOTE: Selector value is the first four bytes of the verifier param digest. It is added as part + // of ABI encoding and used for routing to the correct verifier on-chain. We do not use the + // full ABI encoding implementation here because its part of risc0-ethereum-contracts, which + // would be a hassle to import. + let seal = format!(r#"bytes public constant SEAL = hex"{selector}{seal}";"#); + let claim_digest = format!(r#"bytes32 public constant CLAIM_DIGEST = hex"{claim_digest}";"#); + + let solidity_test_receipt_path = Path::new(SOLIDITY_TEST_RECEIPT_PATH); + let content = &format!("{SOL_HEADER}{LIB_HEADER}\n{seal}\n{claim_digest}\n}}"); + fs::write(solidity_test_receipt_path, content).unwrap(); + + // Use forge fmt to format the file. + Command::new("forge").arg("fmt").arg(solidity_test_receipt_path.as_os_str()).status().unwrap(); +} + +// Return a Blake3-Groth16 `seal` and the claim digest. +// Requires running Docker. +async fn generate_receipt() -> (Vec, Digest) { + tracing::info!("prove"); + let input = [3u8; 32]; + + let env = ExecutorEnv::builder().write_slice(&input).build().unwrap(); + tracing::info!("Proving echo program to get initial receipt"); + let prover = default_prover(); + // Produce a receipt by proving the specified ELF binary. + let receipt = prover.prove_with_opts(env, ECHO_ELF, &ProverOpts::succinct()).unwrap().receipt; + tracing::info!("Initial receipt created, compressing to blake3_groth16"); + let blake3_receipt = compress_blake3_groth16(&receipt).await.unwrap(); + let seal = blake3_receipt.seal().expect("failed to retrieve seal"); + let claim_digest = blake3_receipt.claim_digest().expect("failed to compute claim digest"); + (seal.clone(), claim_digest) +} diff --git a/xtask/src/main.rs b/xtask/src/main.rs new file mode 100644 index 000000000..58a134051 --- /dev/null +++ b/xtask/src/main.rs @@ -0,0 +1,53 @@ +// Copyright 2025 Boundless Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use clap::{Parser, Subcommand}; + +mod bootstrap_blake3_groth16; +mod setup_blake3_groth16; +mod upload_blake3_groth16_artifacts; + +#[derive(Parser)] +struct Cli { + #[command(subcommand)] + cmd: Commands, +} + +#[derive(Subcommand)] +enum Commands { + SetupBlake3Groth16(crate::setup_blake3_groth16::SetupBlake3Groth16), + BootstrapBlake3Groth16(crate::bootstrap_blake3_groth16::BootstrapBlake3Groth16), + UploadBlake3Groth16Artifacts( + crate::upload_blake3_groth16_artifacts::UploadBlake3Groth16Artifacts, + ), +} + +impl Commands { + async fn run(&self) { + match self { + Commands::SetupBlake3Groth16(cmd) => cmd.run(), + Commands::BootstrapBlake3Groth16(cmd) => cmd.run().await, + Commands::UploadBlake3Groth16Artifacts(cmd) => cmd.run().await, + } + } +} + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt() + .with_env_filter(tracing_subscriber::filter::EnvFilter::from_default_env()) + .init(); + + Cli::parse().cmd.run().await; +} diff --git a/xtask/src/setup_blake3_groth16.rs b/xtask/src/setup_blake3_groth16.rs new file mode 100644 index 000000000..426fbdd13 --- /dev/null +++ b/xtask/src/setup_blake3_groth16.rs @@ -0,0 +1,133 @@ +// Copyright 2025 Boundless Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use clap::Parser; +use rlimit::{setrlimit, Resource, INFINITY}; +use std::path::PathBuf; +use xshell::{cmd, Shell}; + +const CIRCOM_WITNESSCALC_URL: &str = "https://github.com/iden3/circom-witnesscalc.git"; +const CIRCOM_WITNESSCALC_COMMIT: &str = "b7ff0ffd9c72c8f60896ce131ee98a35aba96009"; // 0.2.1 + +const RISC0_TO_BITVM2_URL: &str = "https://github.com/chainwayxyz/risc0-to-bitvm2.git"; +const RISC0_TO_BITVM2_COMMIT: &str = "efc448ef016cef2a908d97e69b9d3d1f2b2cfdb5"; + +const CIRCOMLIB_URL: &str = "https://github.com/iden3/circomlib.git"; +const CIRCOMLIB_COMMIT: &str = "35e54ea21da3e8762557234298dbb553c175ea8d"; + +#[derive(Debug, Parser)] +pub struct SetupBlake3Groth16 { + /// Directory to store Groth16 setup files + dir: PathBuf, +} + +const CIRCUIT_FILES: &[&str] = &[ + "blake3_common.circom", + "blake3_compression.circom", + "risc0.circom", + "stark_verify.circom", + "verify_for_guest.circom", +]; + +fn download_circuits(sh: &Shell) { + if !sh.path_exists("risc0-to-bitvm2") { + cmd!(sh, "git clone {RISC0_TO_BITVM2_URL} risc0-to-bitvm2").run().unwrap(); + } + { + let _cd = sh.push_dir("risc0-to-bitvm2"); + cmd!(sh, "git checkout {RISC0_TO_BITVM2_COMMIT}").run().unwrap(); + cmd!(sh, "git lfs pull").run().unwrap(); + } + sh.create_dir("groth16_proof").unwrap(); + sh.create_dir("groth16_proof/circuits").unwrap(); + // Copy circuit files every time because we modify stark_verify.circom + for file in CIRCUIT_FILES { + let src = format!("risc0-to-bitvm2/groth16_proof/circuits/{file}"); + let dst = format!("groth16_proof/circuits/{file}"); + sh.copy_file(&src, &dst).unwrap(); + } + // Delete the last line of stark_verify.circom so that we only use its template + cmd!(sh, "sed -i '$d' ./groth16_proof/circuits/stark_verify.circom").run().unwrap(); +} + +impl SetupBlake3Groth16 { + pub fn run(&self) { + tracing::info!("Setting up Groth16 in {}", self.dir.display()); + setrlimit(Resource::STACK, INFINITY, INFINITY).unwrap(); + let sh = Shell::new().unwrap(); + + let setup_dir = sh.create_dir(&self.dir).unwrap(); + + let srs_path = setup_dir.join("verify_for_guest_final.zkey"); + + if !sh.path_exists(srs_path.as_path()) { + let zkey_path = srs_path.as_path().to_path_buf(); + let url = "https://static.mainnet.citrea.xyz/verify_for_guest_final.zkey"; + cmd!(sh, "curl -o {zkey_path} {url}").run().unwrap(); + } + + sh.change_dir(&setup_dir); + + download_circuits(&sh); + + if !sh.path_exists("circom-witnesscalc") { + cmd!(sh, "git clone {CIRCOM_WITNESSCALC_URL}").run().unwrap(); + } + + if !sh.path_exists("circomlib") { + cmd!(sh, "git clone {CIRCOMLIB_URL}").run().unwrap(); + } + { + let _cd = sh.push_dir("circomlib"); + cmd!(sh, "git checkout {CIRCOMLIB_COMMIT}").run().unwrap(); + } + + let build_circuit = "circom-witnesscalc/target/release/build-circuit"; + if !sh.path_exists(build_circuit) { + let _cd = sh.push_dir("circom-witnesscalc"); + cmd!(sh, "git checkout {CIRCOM_WITNESSCALC_COMMIT}").run().unwrap(); + cmd!(sh, "cargo build --release -p build-circuit").run().unwrap(); + } + + let stark_verify_circom = setup_dir.join("groth16_proof/circuits/verify_for_guest.circom"); + if !sh.path_exists(&stark_verify_circom) { + panic!("Run from top of workspace. Could not find: {}", stark_verify_circom.display()); + } + + let graph_path = setup_dir.join("verify_for_guest_graph.bin"); + // verify_for_guest.circom -> verify_for_guest_graph.bin + if !sh.path_exists(graph_path.as_path()) { + cmd!(sh, "{build_circuit} {stark_verify_circom} {graph_path}").run().unwrap(); + } + + let verifier_sol_path = setup_dir.join("verifier.sol"); + if !sh.path_exists(verifier_sol_path.as_path()) { + tracing::info!("Exporting Solidity verifier to {}", verifier_sol_path.display()); + // Export Solidity verifier + cmd!(sh, "snarkjs zkey export solidityverifier {srs_path} {verifier_sol_path}") + .run() + .unwrap(); + } + + #[cfg(feature = "cuda")] + { + tracing::info!("Setting up Groth16 with CUDA"); + let mut setup_params = risc0_groth16_sys::SetupParams::new(&setup_dir).unwrap(); + setup_params.srs_path = srs_path.try_into().unwrap(); + + // stark_verify_final.zkey -> (fuzzed_msm_results.bin, preprocessed_coeffs.bin) + risc0_groth16_sys::setup(&setup_params).unwrap(); + } + } +} diff --git a/xtask/src/upload_blake3_groth16_artifacts.rs b/xtask/src/upload_blake3_groth16_artifacts.rs new file mode 100644 index 000000000..32ebb1462 --- /dev/null +++ b/xtask/src/upload_blake3_groth16_artifacts.rs @@ -0,0 +1,207 @@ +// Copyright 2025 Boundless Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use anyhow::{Context, Result}; +use aws_config::BehaviorVersion; +use aws_credential_types::Credentials; +use aws_sdk_s3::config::Region; +use aws_sdk_s3::primitives::ByteStream; +use aws_sdk_s3::Client; +use clap::Parser; +use tokio::fs::File; +use tokio::io::AsyncWriteExt; +use tokio_tar::Builder; + +#[derive(Debug, Parser)] +pub struct UploadBlake3Groth16Artifacts { + /// blake3-groth16 setup directory + #[arg(long, env)] + blake3_groth16_setup_dir: std::path::PathBuf, + + /// S3-compatible bucket name + #[arg(long)] + bucket: String, + + /// S3-compatible endpoint URL (optional as not needed if using AWS S3) + #[arg(long)] + endpoint: Option, + + /// S3-compatible region (optional, defaults to us-east-1) + #[arg(long)] + region: Option, + + /// Access key ID + #[arg(long, env)] + access_key_id: Option, + + /// Secret access key + #[arg(long, env)] + secret_access_key: Option, + + /// Is R2 bucket + #[arg(long)] + is_r2_bucket: bool, + + #[arg(long, default_value = "6")] + /// XZ compression level (1-9) + compression_level: i32, + + #[arg(long, default_value_t = false)] + publish: bool, +} + +const ARCHIVE_NAME: &str = "blake3_groth16_artifacts.tar.xz"; +const FILES_TO_ARCHIVE: &[&str] = &[ + "verify_for_guest_final.zkey", + "verify_for_guest_graph.bin", + "fuzzed_msm_results.bin", + "preprocessed_coeffs.bin", +]; + +impl UploadBlake3Groth16Artifacts { + pub async fn run(&self) { + let tar_xz_path = self.blake3_groth16_setup_dir.join(ARCHIVE_NAME); + + let file = self.create_tar_xz(tar_xz_path.clone()).await.unwrap(); + tracing::info!( + "Created tar.xz at {} ({} bytes)", + tar_xz_path.display(), + file.metadata().await.unwrap().len() + ); + if self.publish { + self.publish(tar_xz_path).await.unwrap(); + } else { + tracing::info!("Skipping upload as --publish not set"); + } + } + + async fn publish(&self, tar_xz_path: impl AsRef) -> Result<()> { + let uploader = BucketUploader::new( + self.is_r2_bucket, + self.endpoint.clone(), + self.access_key_id.clone(), + self.secret_access_key.clone(), + None, + self.bucket.clone(), + self.region.clone(), + ) + .await + .context("Failed to create bucket uploader")?; + + tracing::info!("Uploading to bucket: {}", &uploader.bucket); + + let byte_stream = ByteStream::read_from() + .path(tar_xz_path) + .build() + .await + .context("Failed to create s3 byte stream")?; + + uploader + .client + .put_object() + .bucket(&uploader.bucket) + .key(format!("v3/proving/{}", ARCHIVE_NAME)) + .body(byte_stream) + .send() + .await + .context("Failed to upload artifacts to S3 bucket")?; + + tracing::info!("Uploaded artifacts to bucket: {}", &uploader.bucket); + Ok(()) + } + + async fn create_tar_xz(&self, output_path: impl AsRef) -> Result { + tracing::info!( + "Creating tar.xz at {} with compression level {}", + output_path.as_ref().display(), + self.compression_level + ); + let level = async_compression::Level::Precise(self.compression_level); + let output_file = File::create(output_path).await?; + + let writer = async_compression::tokio::write::LzmaEncoder::with_quality(output_file, level); + + let mut tar_builder = Builder::new(writer); + + for file_path in FILES_TO_ARCHIVE { + tracing::info!("Adding file to tar.xz: {}", file_path); + tar_builder + .append_file( + format!("blake3_groth16_artifacts/{}", file_path), + &mut File::open(self.blake3_groth16_setup_dir.join(file_path)).await?, + ) + .await?; + } + tar_builder.finish().await?; + let mut writer = tar_builder.into_inner().await?; + writer.shutdown().await?; + + Ok(writer.into_inner()) + } +} + +struct BucketUploader { + client: Client, + bucket: String, +} + +impl BucketUploader { + async fn new( + is_r2_bucket: bool, + endpoint: Option, + access_key_id: Option, + secret_access_key: Option, + session_token: Option, + bucket: String, + region: Option, + ) -> Result { + let mut credentials: Option = None; + if is_r2_bucket { + credentials = Some(Credentials::new( + access_key_id.unwrap(), + secret_access_key.unwrap(), + None, + None, + "R2", + )); + } else if access_key_id.is_some() && secret_access_key.is_some() { + credentials = Some(Credentials::new( + access_key_id.unwrap(), + secret_access_key.unwrap(), + session_token, + None, + "static", + )); + } + + let mut config_builder = aws_config::defaults(BehaviorVersion::latest()); + + if let Some(credentials) = credentials { + config_builder = config_builder.credentials_provider(credentials); + } + + if let Some(endpoint_url) = endpoint { + config_builder = config_builder.endpoint_url(endpoint_url); + } + + if let Some(region_value) = region { + config_builder = config_builder.region(Region::new(region_value)); + } + + let config = config_builder.load().await; + let client = Client::new(&config); + + Ok(Self { client, bucket }) + } +}