diff --git a/.env.sample b/.env.sample new file mode 100644 index 000000000..01f969f8b --- /dev/null +++ b/.env.sample @@ -0,0 +1,27 @@ +export BRIDGE_DATA_STORE_CLIENT_DATA_SUFFIX=-"bridge-client-data.json" + +export BRIDGE_AWS_ACCESS_KEY_ID="" +export BRIDGE_AWS_SECRET_ACCESS_KEY="" +export BRIDGE_AWS_REGION="" +export BRIDGE_AWS_BUCKET="" +export KEY_DIR="" +export VERIFIERS="" +export ENVIRONMENT="" + +# export BRIDGE_SFTP_HOST="" +# export BRIDGE_SFTP_PORT="22" +# export BRIDGE_SFTP_USERNAME="" +# export BRIDGE_SFTP_KEYFILE_PATH="" +# export BRIDGE_SFTP_BASE_PATH="/bitvm" + +# export BRIDGE_FTP_HOST="" +# export BRIDGE_FTP_PORT="21" +# export BRIDGE_FTP_USERNAME="" +# export BRIDGE_FTP_PASSWORD="" +# export BRIDGE_FTP_BASE_PATH="/bitvm" + +# export BRIDGE_FTPS_HOST="" +# export BRIDGE_FTPS_PORT="21" +# export BRIDGE_FTPS_USERNAME="" +# export BRIDGE_FTPS_PASSWORD="" +# export BRIDGE_FTPS_BASE_PATH="/bitvm" \ No newline at end of file diff --git a/.env.test.sample b/.env.test.sample new file mode 100644 index 000000000..e03ab30ca --- /dev/null +++ b/.env.test.sample @@ -0,0 +1,2 @@ +# Desired block time in seconds for the regtest network +REGTEST_BLOCK_TIME=5 diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 000000000..fb347a77f --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,115 @@ +name: BitVM CI + +on: + push: + branches: [ "main" ] + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + branches: ["*"] + +env: + CARGO_TERM_COLOR: always + +jobs: + clippy: + if: github.event.pull_request.draft == false + timeout-minutes: 60 + runs-on: self-hosted + steps: + - uses: actions/checkout@v4 + - name: Run clippy (no guests) + run: cargo clippy --workspace --exclude header-chain-circuit --exclude final-spv-circuit + + guest: + if: github.event.pull_request.draft == false + timeout-minutes: 60 + runs-on: self-hosted + steps: + - uses: actions/checkout@v4 + - name: Build guests + run: | + REPR_GUEST_BUILD=1 BITCOIN_NETWORK=mainnet cargo build -p header-chain-circuit --release + REPR_GUEST_BUILD=1 BITCOIN_NETWORK=mainnet cargo build -p final-spv-circuit --release + + build: + if: github.event.pull_request.draft == false + timeout-minutes: 60 + runs-on: self-hosted + steps: + - uses: actions/checkout@v4 + + - name: Cache Build Artifacts + uses: actions/cache@v4 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + + - name: Build + run: cargo build + + test_script: + if: github.event.pull_request.draft == false + timeout-minutes: 120 + needs: build + runs-on: self-hosted + steps: + - uses: actions/checkout@v4 + + - name: Cache Build Artifacts + uses: actions/cache@v4 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + + - name: Build + run: cargo build + + - name: Run tests + run: | + cargo test -- --skip bridge:: --skip tests::test_final_circuit + +# test_bridge: +# if: github.event.pull_request.draft == false +# timeout-minutes: 200 +# needs: build +# runs-on: self-hosted +# steps: +# - uses: actions/checkout@v4 +# +# - name: Cache Build Artifacts +# uses: actions/cache@v4 +# with: +# path: | +# ~/.cargo/bin/ +# ~/.cargo/registry/index/ +# ~/.cargo/registry/cache/ +# ~/.cargo/git/db/ +# target/ +# key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} +# +# - name: Build +# run: cargo build +# +# - name: Run bridge tests +# env: +# BRIDGE_DATA_STORE_CLIENT_DATA_SUFFIX: bridge-client-data.json +# BRIDGE_AWS_ACCESS_KEY_ID: ${{ secrets.BRIDGE_AWS_ACCESS_KEY_ID }} +# BRIDGE_AWS_SECRET_ACCESS_KEY: ${{ secrets.BRIDGE_AWS_SECRET_ACCESS_KEY }} +# BRIDGE_AWS_REGION: ap-southeast-1 +# BRIDGE_AWS_BUCKET: bitvm +# run: | +# cp .env.test.sample .env.test +# cd regtest +# ./install.sh <<< "." +# ./start.sh +# cargo test -- --test bridge:: diff --git a/.gitignore b/.gitignore index 041de6eac..4ff3d66dd 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ target/ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock +#Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk @@ -15,6 +15,7 @@ Cargo.lock # Ignore .env files .env +.env.test # Added by cargo @@ -25,7 +26,15 @@ Cargo.lock .DS_Store +tmp + # Bridge public and private files bridge_data/ -chunk_stats.txt +# Esplora regtest data +nohup.out +data_path +esplora-bitcoin-regtest-data + +# test cache +test_cache/ diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 000000000..58b8fd6c2 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7796 @@ +# This file is automatically @generated by Cargo. +# 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.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "cpp_demangle", + "fallible-iterator", + "gimli 0.29.0", + "memmap2", + "object 0.35.0", + "rustc-demangle", + "smallvec", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli 0.31.1", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4a4aaae80afd4be443a6aecd92a6b255dcdd000f97996928efb33d8a71e100" +dependencies = [ + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-network", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-serde", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", +] + +[[package]] +name = "alloy-chains" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "996564c1782285d4e0299c29b318bc74f24b1d7f456cef3e040810b061ee3256" +dependencies = [ + "alloy-primitives 0.8.22", + "num_enum", + "strum", +] + +[[package]] +name = "alloy-consensus" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c309895995eaa4bfcc345f5515a39c7df9447798645cc8bf462b6c5bf1dc96" +dependencies = [ + "alloy-eips", + "alloy-primitives 0.7.7", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4e0ef72b0876ae3068b2ed7dfae9ae1779ce13cfaec2ee1f08f5bd0348dc57" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives 0.7.7", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "thiserror 1.0.69", +] + +[[package]] +name = "alloy-core" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "529fc6310dc1126c8de51c376cbc59c79c7f662bd742be7dc67055d5421a81b4" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives 0.7.7", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413902aa18a97569e60f679c23f46a18db1656d87ab4d4e49d0e1e52042f66df" +dependencies = [ + "alloy-json-abi", + "alloy-primitives 0.7.7", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow 0.6.26", +] + +[[package]] +name = "alloy-eips" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9431c99a3b3fe606ede4b3d4043bdfbcb780c45b8d8d226c3804e2b75cfbe68" +dependencies = [ + "alloy-primitives 0.7.7", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more 0.99.19", + "k256", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-genesis" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79614dfe86144328da11098edcc7bc1a3f25ad8d3134a9eb9e857e06f0d9840d" +dependencies = [ + "alloy-primitives 0.7.7", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc05b04ac331a9f07e3a4036ef7926e49a8bf84a99a1ccfc7e2ab55a5fcbb372" +dependencies = [ + "alloy-primitives 0.7.7", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e2865c4c3bb4cdad3f0d9ec1ab5c0c657ba69a375651bd35e32fb6c180ccc2" +dependencies = [ + "alloy-primitives 0.7.7", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e701fc87ef9a3139154b0b4ccb935b565d27ffd9de020fe541bf2dec5ae4ede" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives 0.7.7", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "thiserror 1.0.69", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec9d5a0f9170b10988b6774498a022845e13eda94318440d17709d50687f67f9" +dependencies = [ + "alloy-primitives 0.7.7", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 0.99.19", + "hex-literal", + "itoa", + "k256", + "keccak-asm", + "proptest", + "rand", + "ruint", + "serde", + "tiny-keccak", +] + +[[package]] +name = "alloy-primitives" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c66bb6715b7499ea755bde4c96223ae8eb74e05c014ab38b9db602879ffb825" +dependencies = [ + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.0.1", + "itoa", + "paste", + "ruint", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9c0ab10b93de601a6396fc7ff2ea10d3b28c46f079338fa562107ebf9857c8" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives 0.7.7", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "pin-project", + "reqwest 0.12.12", + "serde", + "serde_json", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "alloy-pubsub" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f5da2c55cbaf229bad3c5f8b00b5ab66c74ef093e5f3a753d874cfecf7d2281" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives 0.7.7", + "alloy-transport", + "bimap", + "futures", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.4.13", + "tracing", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b38e3ffdb285df5d9f60cb988d336d9b8e3505acb78750c3bc60336a7af41d3" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives 0.7.7", + "alloy-pubsub", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "futures", + "pin-project", + "reqwest 0.12.12", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.4.13", + "tracing", + "url", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c31a3750b8f5a350d17354e46a52b0f2f19ec5f2006d816935af599dedc521" +dependencies = [ + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-engine" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff63f51b2fb2f547df5218527fd0653afb1947bf7fead5b3ce58c75d170b30f7" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives 0.7.7", + "alloy-rlp", + "alloy-rpc-types-eth", + "alloy-serde", + "jsonwebtoken", + "rand", + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e18424d962d7700a882fe423714bd5b9dde74c7a7589d4255ea64068773aef" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives 0.7.7", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.13.0", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "alloy-serde" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33feda6a53e6079895aed1d08dcb98a1377b000d80d16370fbbdb8155d547ef" +dependencies = [ + "alloy-primitives 0.7.7", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740a25b92e849ed7b0fa013951fe2f64be9af1ad5abe805037b44fb7770c5c47" +dependencies = [ + "alloy-primitives 0.7.7", + "async-trait", + "auto_impl", + "elliptic-curve 0.13.8", + "k256", + "thiserror 1.0.69", +] + +[[package]] +name = "alloy-signer-local" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b0707d4f63e4356a110b30ef3add8732ab6d181dd7be4607bf79b8777105cee" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives 0.7.7", + "alloy-signer", + "async-trait", + "k256", + "rand", + "thiserror 1.0.69", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.99", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.99", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbcba3ca07cf7975f15d871b721fb18031eec8bce51103907f6dcce00b255d98" +dependencies = [ + "serde", + "winnow 0.6.26", +] + +[[package]] +name = "alloy-sol-types" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" +dependencies = [ + "alloy-json-abi", + "alloy-primitives 0.7.7", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0590afbdacf2f8cca49d025a2466f3b6584a016a8b28f532f29f8da1007bae" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tower 0.4.13", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-http" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2437d145d80ea1aecde8574d2058cceb8b3c9cba05f6aea8e67907c660d46698" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest 0.12.12", + "serde_json", + "tower 0.4.13", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-ipc" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804494366e20468776db4e18f9eb5db7db0fe14f1271eb6dbf155d867233405c" +dependencies = [ + "alloy-json-rpc", + "alloy-pubsub", + "alloy-transport", + "bytes", + "futures", + "interprocess", + "pin-project", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "alloy-transport-ws" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af855163e7df008799941aa6dd324a43ef2bf264b08ba4b22d44aad6ced65300" +dependencies = [ + "alloy-pubsub", + "alloy-transport", + "futures", + "http 1.2.0", + "rustls 0.23.23", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "ws_stream_wasm", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" + +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3a13b34da09176a8baba701233fdffbaa7c1b1192ce031a3da4e55ce1f1a56" +dependencies = [ + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-relations 0.4.0", + "ark-serialize 0.4.2", + "ark-snark 0.4.0", + "ark-std 0.4.0", + "blake2", + "derivative", + "digest 0.10.7", + "sha2", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-relations 0.5.1", + "ark-serialize 0.5.0", + "ark-snark 0.5.1", + "ark-std 0.5.0", + "blake2", + "derivative", + "digest 0.10.7", + "fnv", + "merlin", + "rayon", + "sha2", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.5.0" +source = "git+https://github.com/arkworks-rs/crypto-primitives?branch=release-0.5.0#c71d09d85c99aded77be076d6626707224f90a7c" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros 0.5.0 (git+https://github.com/arkworks-rs/crypto-primitives?branch=release-0.5.0)", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-relations 0.5.1", + "ark-serialize 0.5.0", + "ark-snark 0.5.1", + "ark-std 0.5.0", + "blake2", + "derivative", + "digest 0.10.7", + "fnv", + "merlin", + "sha2", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "git+https://github.com/arkworks-rs/crypto-primitives?branch=release-0.5.0#c71d09d85c99aded77be076d6626707224f90a7c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.2", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.99", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "ark-groth16" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ceafa83848c3e390f1cbf124bc3193b3e639b3f02009e0e290809a501b95fc" +dependencies = [ + "ark-crypto-primitives 0.4.0", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-relations 0.4.0", + "ark-serialize 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-groth16" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" +dependencies = [ + "ark-crypto-primitives 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-relations 0.5.1", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "rayon", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.2", + "rayon", +] + +[[package]] +name = "ark-relations" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00796b6efc05a3f48225e59cb6a2cda78881e7c390872d5786aaf112f31fb4f0" +dependencies = [ + "ark-ff 0.4.2", + "ark-std 0.4.0", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "ark-relations" +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", +] + +[[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-serialize-derive 0.4.2", + "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 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint 0.4.6", + "rayon", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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.99", +] + +[[package]] +name = "ark-snark" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d3cc6833a335bb8a600241889ead68ee89a3cf8448081fb7694c0fe503da63" +dependencies = [ + "ark-ff 0.4.2", + "ark-relations 0.4.0", + "ark-serialize 0.4.2", + "ark-std 0.4.0", +] + +[[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 0.5.1", + "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", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "colored", + "num-traits", + "rand", + "rayon", +] + +[[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" + +[[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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-native-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9343dc5acf07e79ff82d0c37899f079db3534d99f189a1837c8e549c99405bec" +dependencies = [ + "futures-util", + "native-tls", + "thiserror 1.0.69", + "url", +] + +[[package]] +name = "async-std" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "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 = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version 0.4.1", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_impl" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12882f59de5360c748c4cbf569a042d5fb0eb515f7bea9c1f470b47f6ffbd73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "auto_ops" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7460f7dd8e100147b82a63afca1a20eb6c231ee36b90ba7272e14951cb58af59" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "awaitable" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70af449c9a763cb655c6a1e5338b42d99c67190824ff90658c1e30be844c0775" +dependencies = [ + "awaitable-error", + "cfg-if", +] + +[[package]] +name = "awaitable-error" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5b3469636cdf8543cceab175efca534471f36eee12fb8374aba00eb5e7e7f8a" + +[[package]] +name = "aws-credential-types" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60e8f6b615cb5fc60a98132268508ad104310f0cfb25a1c22eee76efdf9154da" +dependencies = [ + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "zeroize", +] + +[[package]] +name = "aws-runtime" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76dd04d39cc12844c0994f2c9c5a6f5184c22e9188ec1ff723de41910a21dcad" +dependencies = [ + "aws-credential-types", + "aws-sigv4", + "aws-smithy-async", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "http 0.2.12", + "http-body 0.4.6", + "once_cell", + "percent-encoding", + "pin-project-lite", + "tracing", + "uuid", +] + +[[package]] +name = "aws-sdk-s3" +version = "1.77.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34e87342432a3de0e94e82c99a7cbd9042f99de029ae1f4e368160f9e9929264" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-sigv4", + "aws-smithy-async", + "aws-smithy-checksums", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-smithy-xml", + "aws-types", + "bytes", + "fastrand", + "hex", + "hmac", + "http 0.2.12", + "http-body 0.4.6", + "lru", + "once_cell", + "percent-encoding", + "regex-lite", + "sha2", + "tracing", + "url", +] + +[[package]] +name = "aws-sigv4" +version = "1.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bfe75fad52793ce6dec0dc3d4b1f388f038b5eb866c8d4d7f3a8e21b5ea5051" +dependencies = [ + "aws-credential-types", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "crypto-bigint 0.5.5", + "form_urlencoded", + "hex", + "hmac", + "http 0.2.12", + "http 1.2.0", + "once_cell", + "p256", + "percent-encoding", + "ring", + "sha2", + "subtle", + "time", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-smithy-async" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa59d1327d8b5053c54bf2eaae63bf629ba9e904434d0835a28ed3c0ed0a614e" +dependencies = [ + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "aws-smithy-checksums" +version = "0.63.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2dc8d842d872529355c72632de49ef8c5a2949a4472f10e802f28cf925770c" +dependencies = [ + "aws-smithy-http", + "aws-smithy-types", + "bytes", + "crc32c", + "crc32fast", + "crc64fast-nvme", + "hex", + "http 0.2.12", + "http-body 0.4.6", + "md-5", + "pin-project-lite", + "sha1", + "sha2", + "tracing", +] + +[[package]] +name = "aws-smithy-eventstream" +version = "0.60.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b18559a41e0c909b77625adf2b8c50de480a8041e5e4a3f5f7d177db70abc5a" +dependencies = [ + "aws-smithy-types", + "bytes", + "crc32fast", +] + +[[package]] +name = "aws-smithy-http" +version = "0.60.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7809c27ad8da6a6a68c454e651d4962479e81472aa19ae99e59f9aba1f9713cc" +dependencies = [ + "aws-smithy-eventstream", + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "bytes-utils", + "futures-core", + "http 0.2.12", + "http-body 0.4.6", + "once_cell", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tracing", +] + +[[package]] +name = "aws-smithy-json" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "623a51127f24c30776c8b374295f2df78d92517386f77ba30773f15a30ce1422" +dependencies = [ + "aws-smithy-types", +] + +[[package]] +name = "aws-smithy-runtime" +version = "1.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d526a12d9ed61fadefda24abe2e682892ba288c2018bcb38b1b4c111d13f6d92" +dependencies = [ + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "fastrand", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "http-body 1.0.1", + "httparse", + "hyper 0.14.32", + "hyper-rustls 0.24.2", + "once_cell", + "pin-project-lite", + "pin-utils", + "rustls 0.21.12", + "tokio", + "tracing", +] + +[[package]] +name = "aws-smithy-runtime-api" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92165296a47a812b267b4f41032ff8069ab7ff783696d217f0994a0d7ab585cd" +dependencies = [ + "aws-smithy-async", + "aws-smithy-types", + "bytes", + "http 0.2.12", + "http 1.2.0", + "pin-project-lite", + "tokio", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-smithy-types" +version = "1.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7b8a53819e42f10d0821f56da995e1470b199686a1809168db6ca485665f042" +dependencies = [ + "base64-simd", + "bytes", + "bytes-utils", + "futures-core", + "http 0.2.12", + "http 1.2.0", + "http-body 0.4.6", + "http-body 1.0.1", + "http-body-util", + "itoa", + "num-integer", + "pin-project-lite", + "pin-utils", + "ryu", + "serde", + "time", + "tokio", + "tokio-util", +] + +[[package]] +name = "aws-smithy-xml" +version = "0.60.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab0b0166827aa700d3dc519f72f8b3a91c35d0b8d042dc5d643a91e6f80648fc" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "aws-types" +version = "1.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbd0a668309ec1f66c0f6bda4840dd6d4796ae26d699ebc266d7cc95c6d040f" +dependencies = [ + "aws-credential-types", + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "rustc_version 0.4.1", + "tracing", +] + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line 0.24.2", + "cfg-if", + "libc", + "miniz_oxide", + "object 0.36.7", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base16ct" +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 = "base58ck" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8d66485a3a2ea485c1913c4572ce0256067a5377ac8c75c4960e1cda98605f" +dependencies = [ + "bitcoin-internals", + "bitcoin_hashes", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" + +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitcode" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18c1406a27371b2f76232a2259df6ab607b91b5a0a7476a7729ff590df5a969a" +dependencies = [ + "arrayvec", + "bitcode_derive", + "bytemuck", + "glam", + "serde", +] + +[[package]] +name = "bitcode_derive" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42b6b4cb608b8282dc3b53d0f4c9ab404655d562674c682db7e6c0458cc83c23" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "bitcoin" +version = "0.32.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6bc65742dea50536e35ad42492b234c27904a27f0abdcbce605015cb4ea026" +dependencies = [ + "base58ck", + "bech32", + "bitcoin-internals", + "bitcoin-io", + "bitcoin-units", + "bitcoin_hashes", + "hex-conservative", + "hex_lit", + "secp256k1", + "serde", +] + +[[package]] +name = "bitcoin-internals" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bdbe14aa07b06e6cfeffc529a1f099e5fbe249524f8125358604df99a4bed2" +dependencies = [ + "serde", +] + +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + +[[package]] +name = "bitcoin-script" +version = "0.3.0" +source = "git+https://github.com/BitVM/rust-bitcoin-script#cda22ff17ba3e471f76fa1caa0995f20058ac2a3" +dependencies = [ + "bincode", + "bitcoin", + "lazy_static", + "script-macro", + "serde", + "stdext", +] + +[[package]] +name = "bitcoin-script-stack" +version = "0.0.1" +source = "git+https://github.com/BitVM/rust-bitcoin-script-stack#bb397b6023b149aa2031306620b079f9b70adc92" +dependencies = [ + "bitcoin", + "bitcoin-script", + "bitcoin-scriptexec", + "hex", +] + +[[package]] +name = "bitcoin-scriptexec" +version = "0.0.0" +source = "git+https://github.com/BitVM/rust-bitcoin-scriptexec#b24608bff855ea8932ae236c7a04f13f730ab9f8" +dependencies = [ + "bitcoin", + "clap", + "console_error_panic_hook", + "getrandom 0.2.15", + "lazy_static", + "serde", + "serde-wasm-bindgen", + "serde_json", + "wasm-bindgen", +] + +[[package]] +name = "bitcoin-units" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5285c8bcaa25876d07f37e3d30c303f2609179716e11d688f51e8f1fe70063e2" +dependencies = [ + "bitcoin-internals", + "serde", +] + +[[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", + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "bitvm" +version = "0.1.0" +dependencies = [ + "ark-bn254 0.5.0", + "ark-crypto-primitives 0.5.0 (git+https://github.com/arkworks-rs/crypto-primitives?branch=release-0.5.0)", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-groth16 0.5.0", + "ark-relations 0.5.1", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "bitcoin", + "bitcoin-script", + "bitcoin-script-stack", + "bitcoin-scriptexec", + "blake3", + "colored", + "hex", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rand", + "rand_chacha", + "regex", + "serde", + "serde_json", + "sha2", + "tqdm", +] + +[[package]] +name = "bitvm-fuzz" +version = "0.0.0" +dependencies = [ + "arbitrary", + "bitvm", + "libfuzzer-sys", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "blake3" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "blst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "borsh" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8b668d39970baad5356d7c83a86fee3a539e6f93bf6764c97368243e17a0487" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "bridge" +version = "0.1.0" +dependencies = [ + "alloy", + "ark-bn254 0.5.0", + "ark-crypto-primitives 0.5.0 (git+https://github.com/arkworks-rs/crypto-primitives?branch=release-0.5.0)", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-groth16 0.5.0", + "ark-relations 0.5.1", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "async-trait", + "aws-sdk-s3", + "bitcode", + "bitcoin", + "bitcoin-script", + "bitcoin-scriptexec", + "bitvm", + "clap", + "colored", + "dotenv", + "esplora-client", + "futures", + "hex", + "human_bytes", + "itertools 0.13.0", + "musig2", + "num-traits", + "openssh", + "openssh-sftp-client", + "rand", + "regex", + "secp256k1", + "serde", + "serde_json", + "serial_test", + "sha2", + "strum", + "strum_macros", + "suppaftp", + "tokio", + "toml", + "zstd", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytemuck" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +dependencies = [ + "serde", +] + +[[package]] +name = "bytes-utils" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" +dependencies = [ + "bytes", + "either", +] + +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cc" +version = "1.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "windows-link", +] + +[[package]] +name = "clap" +version = "4.5.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "colored" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" +dependencies = [ + "lazy_static", + "windows-sys 0.59.0", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "concurrent_arena" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef19a8d27aefd2a86b39ee61a6e83bc98ee97dacc93ce87770adab2413392a6" +dependencies = [ + "arc-swap", + "parking_lot", + "triomphe", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "const-hex" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpp_demangle" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32c" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a47af21622d091a8f0fb295b88bc886ac74efcc613efc19f5d0b21de5c89e47" +dependencies = [ + "rustc_version 0.4.1", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crc64fast-nvme" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4955638f00a809894c947f85a024020a20815b65a5eea633798ea7924edab2b3" +dependencies = [ + "crc", +] + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +dependencies = [ + "crossbeam-utils", +] + +[[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-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crossterm" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" +dependencies = [ + "bitflags 1.3.2", + "crossterm_winapi", + "libc", + "mio 0.8.11", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.2" +source = "git+https://github.com/risc0/RustCrypto-crypto-bigint?tag=v0.5.2-risczero.0#8b30304277cfe553b51a78a0e693f48bbb059eb3" +dependencies = [ + "getrandom 0.2.15", + "subtle", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" + +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "derive_destructure2" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b697ac90ff296f0fc031ee5a61c7ac31fb9fff50e3fb32873b09223613fc0c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "derive_more" +version = "0.99.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "syn 2.0.99", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", + "unicode-xid", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "docker-generate" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" + +[[package]] +name = "doctest-file" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" + +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "downcast-rs" +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", + "reqwest 0.12.12", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "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.9", + "digest 0.10.7", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "signature 2.2.0", + "spki 0.7.3", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "either" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" + +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", + "generic-array", + "group 0.12.1", + "pkcs8 0.9.0", + "rand_core", + "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.0", + "generic-array", + "group 0.13.0", + "pkcs8 0.10.2", + "rand_core", + "sec1 0.7.3", + "subtle", + "zeroize", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +dependencies = [ + "serde", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "esplora-client" +version = "0.11.0" +source = "git+https://github.com/BitVM/rust-esplora-client#7befb9147b69126edaad8b9dbd0b13259f2e9ea0" +dependencies = [ + "bitcoin", + "hex-conservative", + "log", + "minreq", + "reqwest 0.11.27", + "serde", + "tokio", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec", + "byteorder", + "ff_derive", + "rand_core", + "subtle", +] + +[[package]] +name = "ff_derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f54704be45ed286151c5e11531316eaef5b8f5af7d597b806fdb8af108d84a" +dependencies = [ + "addchain", + "cfg-if", + "num-bigint 0.3.3", + "num-integer", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "final-spv" +version = "0.1.0" +dependencies = [ + "bitcoin", + "blake3", + "borsh", + "crypto-bigint 0.5.5", + "header-chain", + "hex", + "hex-literal", + "risc0-zkvm", + "serde", + "sha2", +] + +[[package]] +name = "final-spv-circuit" +version = "0.1.0" +dependencies = [ + "risc0-build", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "flate2" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +dependencies = [ + "fallible-iterator", + "stable_deref_trait", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glam" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17fcdf9683c406c2fc4d124afd29c0d595e22210d633cbdb8695ba9935ab1dc6" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[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 = "goat-bridge" +version = "0.1.0" +dependencies = [ + "alloy", + "ark-bn254 0.5.0", + "ark-crypto-primitives 0.5.0 (git+https://github.com/arkworks-rs/crypto-primitives?branch=release-0.5.0)", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-groth16 0.5.0", + "ark-relations 0.5.1", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "bincode", + "bitcode", + "bitcoin", + "bitcoin-script", + "bitcoin-scriptexec", + "bitvm", + "clap", + "colored", + "hex", + "itertools 0.13.0", + "musig2", + "num-traits", + "rand", + "regex", + "secp256k1", + "serde", + "serde_json", + "serial_test", + "sha2", + "strum", + "strum_macros", + "tokio", + "toml", + "zstd", +] + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "rand_core", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.0", + "rand_core", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "header-chain" +version = "0.1.0" +dependencies = [ + "bitcoin", + "borsh", + "crypto-bigint 0.5.5", + "hex", + "hex-literal", + "risc0-zkvm", + "serde", + "sha2", +] + +[[package]] +name = "header-chain-circuit" +version = "0.1.0" +dependencies = [ + "risc0-build", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.2.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "human_bytes" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91f255a4535024abf7640cb288260811fc14794f62b063652ed349f9a6c2348e" +dependencies = [ + "ryu", +] + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.32", + "log", + "rustls 0.21.12", + "rustls-native-certs", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http 1.2.0", + "hyper 1.6.0", + "hyper-util", + "rustls 0.23.23", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.2", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper 0.14.32", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[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.6.0", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "hyper 1.6.0", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "indexmap" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", +] + +[[package]] +name = "interprocess" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "894148491d817cb36b6f778017b8ac46b17408d522dd90f539d677ea938362eb" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + +[[package]] +name = "inventory" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab08d7cd2c5897f2c949e5383ea7c7db03fb19130ffcfbf7eda795137ae3cb83" +dependencies = [ + "rustversion", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "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 = "jsonwebtoken" +version = "9.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +dependencies = [ + "base64 0.22.1", + "js-sys", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + +[[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", + "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 = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "lazy-regex" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.99", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.170" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +dependencies = [ + "arbitrary", + "cc", +] + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "lockfree-object-pool" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" + +[[package]] +name = "log" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +dependencies = [ + "value-bag", +] + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.2", +] + +[[package]] +name = "lzma-sys" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core", + "zeroize", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.9.0", + "block", + "core-graphics-types", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +dependencies = [ + "adler2", +] + +[[package]] +name = "minreq" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0c420feb01b9fb5061f8c8f452534361dd783756dcf38ec45191ce55e7a161" +dependencies = [ + "base64 0.12.3", + "log", + "serde", + "serde_json", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "musig2" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89bee285da6010ad76c3467c4de8265bb4fa46fba0017df95ae55cad4436528" +dependencies = [ + "base16ct 0.2.0", + "hmac", + "once_cell", + "rand", + "secp", + "secp256k1", + "serde", + "serdect", + "sha2", + "subtle", +] + +[[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", + "security-framework-sys", + "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 = "non-zero-byte-slice" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daa1daa11c9df05d1181bcd0936d8066f8543144d77b09808eb78d65e38024" +dependencies = [ + "serde", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", + "rand", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "nvtx" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad2e855e8019f99e4b94ac33670eb4e4f570a2e044f3749a0b2c7f83b841e52c" +dependencies = [ + "cc", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "object" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" +dependencies = [ + "flate2", + "memchr", + "ruzstd", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" + +[[package]] +name = "openssh" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330f4b61092456dc0aaa0cf9a205d956cae07d8127a69ffeff6760a72549c77f" +dependencies = [ + "libc", + "once_cell", + "openssh-mux-client", + "shell-escape", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tokio-pipe", +] + +[[package]] +name = "openssh-mux-client" +version = "0.17.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d091692d0a7d9035a3cdc5f8c3572abe401e64e30eac5404e517fb54e554c9bc" +dependencies = [ + "cfg-if", + "non-zero-byte-slice", + "once_cell", + "openssh-mux-client-error", + "sendfd", + "serde", + "ssh_format", + "tokio", + "tokio-io-utility", + "typed-builder", +] + +[[package]] +name = "openssh-mux-client-error" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9879168afb48a235200e30d93df320b7191568cda8621df02f145c1c0f1af95a" +dependencies = [ + "ssh_format_error", + "thiserror 2.0.12", +] + +[[package]] +name = "openssh-sftp-client" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f472c9c38ea60bc161f8b5df4d04c79057003cdc12572eaad7f6dcc74e6fca5" +dependencies = [ + "bytes", + "derive_destructure2", + "futures-core", + "once_cell", + "openssh", + "openssh-sftp-client-lowlevel", + "openssh-sftp-error", + "pin-project", + "scopeguard", + "tokio", + "tokio-io-utility", + "tokio-util", +] + +[[package]] +name = "openssh-sftp-client-lowlevel" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a84f1a52761901fcf5b10885544085348a872e57294531ec9188145d9a83042" +dependencies = [ + "awaitable", + "bytes", + "concurrent_arena", + "derive_destructure2", + "openssh-sftp-error", + "openssh-sftp-protocol", + "pin-project", + "tokio", + "tokio-io-utility", +] + +[[package]] +name = "openssh-sftp-error" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a5aea093d714df10186f481a6003e3f906f6fc8360c026737a841f4f182996" +dependencies = [ + "awaitable-error", + "openssh", + "openssh-sftp-protocol-error", + "ssh_format_error", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "openssh-sftp-protocol" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c862e0c56553146306507f55958c11ff554e02c46de287e6976e50d815b350" +dependencies = [ + "bitflags 2.9.0", + "num-derive", + "num-traits", + "openssh-sftp-protocol-error", + "serde", + "ssh_format", + "vec-strings", +] + +[[package]] +name = "openssh-sftp-protocol-error" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42b54df62ccfd9a7708a83a9d60c46293837e478f9f4c0829360dcfa60ede8d2" +dependencies = [ + "serde", + "thiserror 2.0.12", + "vec-strings", +] + +[[package]] +name = "openssl" +version = "0.10.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" +dependencies = [ + "bitflags 2.9.0", + "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.99", +] + +[[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.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "p256" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +dependencies = [ + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2", +] + +[[package]] +name = "parity-scale-codec" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +dependencies = [ + "base64 0.22.1", + "serde", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + +[[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.99", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +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 = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der 0.7.9", + "spki 0.7.3", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "portable-atomic" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[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 = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.9.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "prover" +version = "0.1.0" +dependencies = [ + "bitcoin", + "blake3", + "borsh", + "crypto-bigint 0.5.2", + "final-spv", + "header-chain", + "hex", + "hex-literal", + "num-bigint 0.4.6", + "num-traits", + "risc0-binfmt", + "risc0-circuit-recursion", + "risc0-groth16", + "risc0-zkp", + "risc0-zkvm", + "serde_json", + "sha2", + "tempfile", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.23", + "socket2", + "thiserror 2.0.12", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +dependencies = [ + "bytes", + "getrandom 0.2.15", + "rand", + "ring", + "rustc-hash", + "rustls 0.23.23", + "rustls-pki-types", + "slab", + "thiserror 2.0.12", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quote" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "recvmsg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" + +[[package]] +name = "redox_syscall" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-tls 0.5.0", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile 1.0.4", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-socks", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "reqwest" +version = "0.12.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.6.0", + "hyper-rustls 0.27.5", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.23", + "rustls-pemfile 2.2.0", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tokio-native-tls", + "tokio-rustls 0.26.2", + "tower 0.5.2", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "windows-registry", +] + +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "risc0-binfmt" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d893807e609dd44942644aef5137ad87d178a032c5932b0c68cdec538c3370" +dependencies = [ + "anyhow", + "borsh", + "elf", + "risc0-zkp", + "risc0-zkvm-platform", + "serde", + "tracing", +] + +[[package]] +name = "risc0-build" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98bcfd51f182f7e94209249ca3a0c64df0ab0dbfe151bd5fcbe2b708c4f9f17f" +dependencies = [ + "anyhow", + "cargo_metadata", + "dirs", + "docker-generate", + "hex", + "risc0-binfmt", + "risc0-zkp", + "risc0-zkvm-platform", + "serde", + "serde_json", + "tempfile", +] + +[[package]] +name = "risc0-build-kernel" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be0b201426fa79c1517ea919f6f37091489748c6b11b984ab3e6e452b9c5a6a" +dependencies = [ + "cc", + "directories", + "glob", + "hex", + "rayon", + "sha2", + "tempfile", +] + +[[package]] +name = "risc0-circuit-keccak" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d1d4f248ccf111a9d58a6cd9ae5bfb4c3830e100e75874c39622a2952ef5a9" +dependencies = [ + "anyhow", + "bytemuck", + "cfg-if", + "keccak", + "paste", + "rayon", + "risc0-binfmt", + "risc0-circuit-keccak-sys", + "risc0-circuit-recursion", + "risc0-core", + "risc0-sys", + "risc0-zkp", + "tracing", + "xz2", +] + +[[package]] +name = "risc0-circuit-keccak-sys" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d9256fd78de19c09bb2131ab86a02b841e1569f2e4d474c3ae3928ce273283" +dependencies = [ + "cc", + "derive_more 1.0.0", + "glob", + "risc0-build-kernel", + "risc0-core", + "risc0-sys", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5ab005ed38c1119c0511b9260cd18d95adbb226ad849eccfdb650eebecd769c" +dependencies = [ + "anyhow", + "bytemuck", + "cfg-if", + "downloader", + "hex", + "lazy-regex", + "metal", + "rand", + "rayon", + "risc0-circuit-recursion-sys", + "risc0-core", + "risc0-sys", + "risc0-zkp", + "serde", + "sha2", + "tracing", + "zip", +] + +[[package]] +name = "risc0-circuit-recursion-sys" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202ceb200e1248534e808ffc00e5f302c2fe68d5ade99231d61fbb65b7945214" +dependencies = [ + "glob", + "risc0-build-kernel", + "risc0-core", + "risc0-sys", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d64420292f716e468cba1e17eb56146a525d612d967ee09566eda80b423a54a" +dependencies = [ + "anyhow", + "auto_ops", + "bytemuck", + "byteorder", + "cfg-if", + "crossbeam", + "crypto-bigint 0.5.5", + "derive_more 1.0.0", + "enum-map", + "lazy-regex", + "metal", + "num-bigint 0.4.6", + "num-derive", + "num-traits", + "rand", + "rayon", + "risc0-binfmt", + "risc0-circuit-rv32im-sys", + "risc0-core", + "risc0-sys", + "risc0-zkp", + "risc0-zkvm-platform", + "serde", + "sha2", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im-sys" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d161d7a468272e803655856a11d379e5754d347fd01146b079aaaa8b4536c0c6" +dependencies = [ + "glob", + "risc0-build-kernel", + "risc0-core", + "risc0-sys", +] + +[[package]] +name = "risc0-core" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2492abd92da4eb2a6e5e9e74757d00b1c29c03bb867266c85752cb22a03a920" +dependencies = [ + "bytemuck", + "nvtx", + "puffin", + "rand_core", +] + +[[package]] +name = "risc0-groth16" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0017c18151e017a154f4b4bbeec2a0656a3a7822fab3cd0dc1a15e2654dde4fe" +dependencies = [ + "anyhow", + "ark-bn254 0.4.0", + "ark-ec 0.4.2", + "ark-groth16 0.4.0", + "ark-serialize 0.4.2", + "bytemuck", + "hex", + "num-bigint 0.4.6", + "num-traits", + "risc0-binfmt", + "risc0-core", + "risc0-zkp", + "serde", + "serde_json", + "stability", + "tempfile", + "tracing", +] + +[[package]] +name = "risc0-sys" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3ea764e96dd881a9e568deae0ad4cf0a603f0d685a622ed5f1b1afed8d62d30" +dependencies = [ + "anyhow", + "risc0-build-kernel", +] + +[[package]] +name = "risc0-zkp" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a6e3c078d7a7d27eda9383db8d080f7200ac4e5e65c1971d454a0286c00cae" +dependencies = [ + "anyhow", + "blake2", + "borsh", + "bytemuck", + "cfg-if", + "digest 0.10.7", + "ff 0.13.0", + "hex", + "hex-literal", + "metal", + "ndarray", + "parking_lot", + "paste", + "rand", + "rand_core", + "rayon", + "risc0-core", + "risc0-sys", + "risc0-zkvm-platform", + "serde", + "sha2", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd97c60815994da62fa000dec9470c0d0e3045a554354e279695f2213b0182f" +dependencies = [ + "addr2line 0.22.0", + "anyhow", + "bincode", + "borsh", + "bytemuck", + "bytes", + "elf", + "enum-map", + "getrandom 0.2.15", + "hex", + "keccak", + "lazy-regex", + "num-bigint 0.4.6", + "num-traits", + "prost", + "rand", + "rayon", + "risc0-binfmt", + "risc0-build", + "risc0-circuit-keccak", + "risc0-circuit-recursion", + "risc0-circuit-rv32im", + "risc0-core", + "risc0-groth16", + "risc0-zkp", + "risc0-zkvm-platform", + "rrs-lib", + "rustc-demangle", + "semver 1.0.26", + "serde", + "sha2", + "stability", + "tempfile", + "tracing", + "typetag", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778e0235c87d8e18f13da5c71bfe69b1beb7c08694c75d19eae9dbed09a59c57" +dependencies = [ + "bytemuck", + "cfg-if", + "getrandom 0.2.15", + "libm", + "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 = "rrs-lib" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +dependencies = [ + "downcast-rs", + "paste", +] + +[[package]] +name = "ruint" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "825df406ec217a8116bd7b06897c6cc8f65ffefc15d030ae2c9540acc9ed50b6" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.26", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile 1.0.4", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +dependencies = [ + "web-time", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ruzstd" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5174a470eeb535a721ae9fdd6e291c2411a906b96592182d05217591d5c5cf7b" +dependencies = [ + "byteorder", + "derive_more 0.99.19", + "twox-hash", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scc" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea091f6cac2595aa38993f04f4ee692ed43757035c36e67c180b6828356385b1" +dependencies = [ + "sdd", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "script-macro" +version = "0.3.0" +source = "git+https://github.com/BitVM/rust-bitcoin-script#cda22ff17ba3e471f76fa1caa0995f20058ac2a3" +dependencies = [ + "bitcoin", + "hex", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sdd" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b07779b9b918cc05650cb30f404d4d7835d26df37c235eded8a6832e2fb82cca" + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct 0.1.1", + "der 0.6.1", + "generic-array", + "pkcs8 0.9.0", + "subtle", + "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.9", + "generic-array", + "pkcs8 0.10.2", + "subtle", + "zeroize", +] + +[[package]] +name = "secp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd426921f62c7e334ca27173743cd90a7263566a3be76ef0b47773d631633cf9" +dependencies = [ + "base16ct 0.2.0", + "once_cell", + "rand", + "secp256k1", + "serde", + "serdect", + "subtle", +] + +[[package]] +name = "secp256k1" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" +dependencies = [ + "bitcoin_hashes", + "rand", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "sendfd" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604b71b8fc267e13bb3023a2c901126c8f349393666a6d98ac1ae5729b701798" +dependencies = [ + "libc", + "tokio", +] + +[[package]] +name = "serde" +version = "1.0.218" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.218" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[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 = "serial_test" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" +dependencies = [ + "futures", + "log", + "once_cell", + "parking_lot", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[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 = "shell-escape" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +dependencies = [ + "libc", + "mio 0.8.11", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.7", + "rand_core", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "thiserror 2.0.12", + "time", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der 0.7.9", +] + +[[package]] +name = "ssh_format" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24ab31081d1c9097c327ec23550858cb5ffb4af6b866c1ef4d728455f01f3304" +dependencies = [ + "bytes", + "serde", + "ssh_format_error", +] + +[[package]] +name = "ssh_format_error" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be3c6519de7ca611f71ef7e8a56eb57aa1c818fecb5242d0a0f39c83776c210c" +dependencies = [ + "serde", +] + +[[package]] +name = "stability" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" +dependencies = [ + "quote", + "syn 2.0.99", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stdext" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4af28eeb7c18ac2dbdb255d40bee63f203120e1db6b0024b177746ebec7049c1" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.99", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "suppaftp" +version = "6.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "821742c6eeb5a90b95566abae78cc4bab5b96d9c230d29ea9e1a2e3181e57885" +dependencies = [ + "async-native-tls", + "async-std", + "async-trait", + "chrono", + "futures-lite", + "lazy-regex", + "log", + "pin-project", + "thiserror 2.0.12", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" +dependencies = [ + "cfg-if", + "fastrand", + "getrandom 0.3.1", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thin-vec" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +dependencies = [ + "num-conv", + "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 = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +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.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio 1.0.3", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-io-utility" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d672654d175710e52c7c41f6aec77c62b3c0954e2a7ebce9049d1e94ed7c263" +dependencies = [ + "bytes", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[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-pipe" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f213a84bffbd61b8fa0ba8a044b4bbe35d471d0b518867181e82bd5c15542784" +dependencies = [ + "libc", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls 0.23.23", + "tokio", +] + +[[package]] +name = "tokio-socks" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" +dependencies = [ + "either", + "futures-util", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" +dependencies = [ + "futures-util", + "log", + "rustls 0.23.23", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.2", + "tungstenite", + "webpki-roots", +] + +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.7.3", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tqdm" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2d2932240205a99b65f15d9861992c95fbb8c9fb280b3a1f17a92db6dc611f" +dependencies = [ + "anyhow", + "crossterm", + "once_cell", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "triomphe" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" +dependencies = [ + "arc-swap", + "serde", + "stable_deref_trait", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 1.2.0", + "httparse", + "log", + "rand", + "rustls 0.23.23", + "rustls-pki-types", + "sha1", + "thiserror 1.0.69", + "utf-8", +] + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "static_assertions", +] + +[[package]] +name = "typed-builder" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e14ed59dc8b7b26cacb2a92bad2e8b1f098806063898ab42a3bd121d7d45e75" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "560b82d656506509d43abe30e0ba64c56b1953ab3d4fe7ba5902747a7a3cedd5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "typetag" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f22b40dd7bfe8c14230cf9702081366421890435b2d625fa92b4acc4c3de6f" +dependencies = [ + "erased-serde", + "inventory", + "once_cell", + "serde", + "typetag-impl", +] + +[[package]] +name = "typetag-impl" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35f5380909ffc31b4de4f4bdf96b877175a016aa2ca98cee39fcfd8c4d53d952" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "value-bag" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec-strings" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8509489e2a7ee219522238ad45fd370bec6808811ac15ac6b07453804e77659" +dependencies = [ + "serde", + "thin-vec", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vsimd" +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 = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +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.99", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "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 = "0.26.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + +[[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-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.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xmlparser" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" + +[[package]] +name = "xz2" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" +dependencies = [ + "lzma-sys", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "zip" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b280484c454e74e5fff658bbf7df8fdbe7a07c6b2de4a53def232c15ef138f3a" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "flate2", + "indexmap", + "memchr", + "thiserror 2.0.12", + "zopfli", +] + +[[package]] +name = "zopfli" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +dependencies = [ + "bumpalo", + "crc32fast", + "lockfree-object-pool", + "log", + "once_cell", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.14+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml index 3e2d4edd7..e5e4f0e73 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,76 +1,65 @@ -[package] -name = "bitvm" -version = "0.1.0" -edition = "2021" -exclude = ["tests"] +[workspace] +resolver = "2" +members = [ + "bitvm", + "bridge", + "fuzz", + "goat", + "header-chain", + "header-chain/header-chain-guest", + "final-spv", + "final-spv/final-spv-guest", + "prover", +] -[dependencies] -#bitcoin-script = { path = "../rust-bitcoin-script"} -#bitcoin-scriptexec = { path = "../rust-bitcoin-scriptexec"} -bitcoin-script = { git = "https://github.com/BitVM/rust-bitcoin-script", branch= "chunker" } -bitcoin = { git = "https://github.com/rust-bitcoin/rust-bitcoin", branch = "bitvm", features = ["rand-std"]} -strum = "0.26" -strum_macros = "0.26" +[workspace.dependencies] +bitcoin-script = { git = "https://github.com/BitVM/rust-bitcoin-script" } +bitcoin = { version = "0.32.5", features = ["rand-std"] } +strum = "0.27" +strum_macros = "0.27" hex = "0.4.3" -bitcoin-scriptexec = { git = "https://github.com/BitVM/rust-bitcoin-scriptexec/"} +bitcoin-scriptexec = { git = "https://github.com/BitVM/rust-bitcoin-scriptexec" } serde = { version = "1.0.197", features = ["derive"] } -num-bigint = "0.4.4" num-traits = "0.2.18" -ark-bn254 = { git = "https://github.com/Antalpha-Labs/algebra/", features = ["curve"], default-features = false } -ark-ff = { git = "https://github.com/Antalpha-Labs/algebra/" } -ark-ec = { git = "https://github.com/Antalpha-Labs/algebra/" } -ark-groth16 = { git = "https://github.com/Antalpha-Labs/groth16" } +ark-bn254 = { version = "0.5.0", features = ["curve", "scalar_field"], default-features = false } +ark-ff = "0.5.0" +ark-ec = "0.5.0" +ark-groth16 = "0.5.0" +ark-serialize = "0.5.0" sha2 = "0.10.8" tokio = { version = "1.37.0", features = ["full"] } esplora-client = { git = "https://github.com/BitVM/rust-esplora-client" } serde_json = "1.0.116" -lazy_static = "1.4.0" -bitcoin-script-stack = { git = "https://github.com/FairgateLabs/rust-bitcoin-script-stack"} +bitcoin-script-stack = { git = "https://github.com/BitVM/rust-bitcoin-script-stack" } rand = "0.8.5" rand_chacha = "0.3.1" -once_cell = "1.19.0" dotenv = "0.15.0" aws-sdk-s3 = "1.40.0" regex = "1.10.5" blake3 = "=1.5.1" paste = "1.0.15" -musig2 = { version = "0.0.11", features = ["serde", "rand"] } +musig2 = { version = "0.1.0", features = ["serde", "rand"] } futures = "0.3.30" async-trait = "0.1.81" suppaftp = { version = "6.0.1", features = ["async", "async-native-tls"] } openssh-sftp-client = { version = "0.14.6", features = ["openssh"] } openssh = { version = "0.10.4", features = ["native-mux"] } alloy = { version = "0.2.1", features = ["full"] } - -[dev-dependencies] +clap = { version = "4.5.23", features = ["derive", "cargo", "env"] } +toml = "0.5.11" +colored = "2.0.0" +itertools = "0.13.0" +serde-big-array = "0.5.1" num-bigint = { version = "0.4.4", features = ["rand"] } -ark-std = { version = "0.4.0", default-features = false, features = ["print-trace"] } -ark-crypto-primitives = { git = "https://github.com/Antalpha-Labs/crypto-primitives", features = ["snark", "sponge"] } -ark-relations = { git = "https://github.com/Antalpha-Labs/snark/" } +ark-std = { version = "0.5.0", default-features = false, features = ["print-trace"] } +ark-crypto-primitives = { git = "https://github.com/arkworks-rs/crypto-primitives", branch = "release-0.5.0", features = ["snark", "sponge"] } +ark-relations = "0.5.0" +serial_test = "*" +tqdm = "0.7" +secp256k1 = { version = "0.29.1", features = ["global-context"]} [profile.dev] opt-level = 3 [profile.release] -lto = true - -[patch.crates-io] -base58check = { git = "https://github.com/rust-bitcoin/rust-bitcoin", branch = "bitvm"} -bitcoin = { git = "https://github.com/rust-bitcoin/rust-bitcoin", branch = "bitvm"} -bitcoin_hashes = { git = "https://github.com/rust-bitcoin/rust-bitcoin", branch = "bitvm"} -bitcoin-internals = { git = "https://github.com/rust-bitcoin/rust-bitcoin", branch = "bitvm"} -bitcoin-io = { git = "https://github.com/rust-bitcoin/rust-bitcoin", branch = "bitvm"} -bitcoin-units = { git = "https://github.com/rust-bitcoin/rust-bitcoin", branch = "bitvm"} - -ark-ff = { git = "https://github.com/Antalpha-Labs/algebra/" } -ark-ec = { git = "https://github.com/Antalpha-Labs/algebra/" } -ark-poly = { git = "https://github.com/Antalpha-Labs/algebra/" } -ark-serialize = { git = "https://github.com/Antalpha-Labs/algebra/" } -ark-bn254 = { git = "https://github.com/Antalpha-Labs/algebra/", features = ["curve"], default-features = false } - -ark-r1cs-std = { git = "https://github.com/Antalpha-Labs/r1cs-std/" } -ark-crypto-primitives = { git = "https://github.com/Antalpha-Labs/crypto-primitives/" } - -ark-relations = { git = "https://github.com/Antalpha-Labs/snark/" } -ark-snark = { git = "https://github.com/Antalpha-Labs/snark/" } -ark-groth16 = { git = "https://github.com/Antalpha-Labs/groth16" } +lto = true \ No newline at end of file diff --git a/DEMO_INSTRUCTIONS.md b/DEMO_INSTRUCTIONS.md new file mode 100644 index 000000000..d6edaf6b1 --- /dev/null +++ b/DEMO_INSTRUCTIONS.md @@ -0,0 +1,261 @@ +Before running the demo for the first time, see [Environment Setup](#environment-setup) section below. + +# Demo Prep: Funding UTXOs +The bridge peg-in and peg-out execution consumes three funding UTXOs. For convenience, prepare them before running the demo. This process remains the same across all scenarios. You can use the recommended amounts as below: + +1. Peg-in graph - 'peg-in depost' tx input: **2097447 SAT** - will be spent by [DEPOSITOR] (use `-d` to get their address) +2. Peg-out graph - 'peg-out confirm' tx input: **3562670 SAT** - will be spent by [OPERATOR] (use `-o` to get their address) +3. Withdrawer peg-out - 'peg-out' tx input: **2097274 SAT** - will be spent by [OPERATOR] (use `-o` to get their address) + +# Demo Steps +The following is the list of command line arguments that are passed to the CLI tool in sequence by the respective actors. The arguments can be used either with `cargo run --bin bridge --` or when running the CLI binary directly. + +## Rejected Disprove Scenario (a.k.a. 'happy peg-out' execution path). +#### [DEPOSITOR] Initiate peg-in +`:` = Bridge deposit UTXO that includes the expected peg-in amount. It must be spendable by the depositor private key. Suggested test amount: `2097447 sats`. It is the UTXO #1 in [Demo Prep](#demo-prep-funding-utxos). +``` +-n -u : -d +``` +#### [OPERATOR] Create peg-out graph +`:` = UTXO funding the peg-out confirm tx. Must be spendable by the operator private key. Suggested test amount: `3562670 sats`. It is the UTXO #2 in [Demo Prep](#demo-prep-funding-utxos). +``` +-t -u : -i +``` +#### [VERIFIER_0] Push verifier_0 nonces for peg-in graph +``` +-c -i +``` +#### [VERIFIER_1] Push verifier_1 nonces for peg-in graph +``` +-c -i +``` +#### [VERIFIER_0] Push verifier_0 signatures for peg-in graph +``` +-g -i +``` +#### [VERIFIER_1] Push verifier_1 signatures for peg-in graph +``` +-g -i +``` +#### [OPERATOR] or [VERIFIER_0] or [VERIFIER_1] Broadcast peg-in confirm +``` +-b pegin -g confirm +``` +Record the peg-in confirm txid. +#### [VERIFIER_0] Push verifier_0 nonces for peg-out graph +``` +-c -i +``` +#### [VERIFIER_1] Push verifier_1 nonces for peg-out graph +``` +-c -i +``` +#### [VERIFIER_0] Push verifier_0 signatures for peg-out graph +``` +-g -i +``` +#### [VERIFIER_1] Push verifier_1 signatures for peg-out graph +``` +-g -i +``` +#### [OPERATOR] Mock L2 peg-out event (requires peg-in confirm txid mined earlier) +> [!IMPORTANT] +> Start the CLI in interactive mode here. + +`:` = The peg-in confirm txid recorded above and output index 0. +``` +-x -u : +``` +#### [OPERATOR] Broadcast peg-out +`:` = UTXO funding the payout to the withdrawer. Must be spendable by the operator private key. Suggested test amount: `2097274 sats`. It is the UTXO #3 in [Demo Prep](#demo-prep-funding-utxos). +``` +-b tx -g -u : peg_out +``` +#### [OPERATOR] Broadcast peg-out confirm +``` +-b tx -g peg_out_confirm +``` +#### [OPERATOR] Broadcast kick-off 1 +``` +-b tx -g kick_off_1 +``` +#### [OPERATOR] Broadcast kick-off 2 +``` +-b tx -g kick_off_2 +``` +#### [OPERATOR] Broadcast assert-initial +``` +-b tx -g assert_initial +``` +#### [OPERATOR] Broadcast assert-commit 1 +``` +-b tx -g assert_commit_1 +``` +#### [OPERATOR] Broadcast assert-commit 2 +``` +-b tx -g assert_commit_2 +``` +#### [OPERATOR] Broadcast assert-final +``` +-b tx -g assert_final +``` +#### [VERIFIER_1] Broadcast disprove (should fail) +`` = Receiver of the disprove reward. +``` +-b tx -g -a disprove +``` +#### [OPERATOR] Broadcast take 2 +``` +-b tx -g take_2 +``` + +## Successful Disprove Scenario (a.k.a. 'unhappy peg-out' execution path). +#### [DEPOSITOR] Initiate peg-in +`:` = Bridge deposit UTXO that includes the expected peg-in amount. It must be spendable by the depositor private key. Suggested test amount: `2097447 sats`. +``` +-n -u : -d +``` +#### [OPERATOR] Create peg-out graph +`:` = UTXO funding the peg-out confirm tx. Must be spendable by the operator private key. Suggested test amount: `3562670 sats`. +``` +-t -u : -i +``` +#### [VERIFIER_0] Push verifier_0 nonces for peg-in graph +``` +-c -i +``` +#### [VERIFIER_1] Push verifier_1 nonces for peg-in graph +``` +-c -i +``` +#### [VERIFIER_0] Push verifier_0 signatures for peg-in graph +``` +-g -i +``` +#### [VERIFIER_0] Push verifier_1 signatures for peg-in graph +``` +-g -i +``` +#### [OPERATOR] or [VERIFIER_0] or [VERIFIER_1] Broadcast peg-in confirm +``` +-b pegin -g confirm +``` +Record the peg-in confirm txid. +#### [VERIFIER_0] Push verifier_0 nonces for peg-out graph +``` +-c -i +``` +#### [VERIFIER_1] Push verifier_1 nonces for peg-out graph +``` +-c -i +``` +#### [VERIFIER_0] Push verifier_0 signatures for peg-out graph +``` +-g -i +``` +#### [VERIFIER_1] Push verifier_1 signatures for peg-out graph +``` +-g -i +``` +#### [OPERATOR] Mock L2 peg-out event (requires peg-in confirm txid mined earlier) +> [!IMPORTANT] +> Start the CLI in interactive mode here. + +`:` = The peg-in confirm txid recorded above and output index 0. +``` +-x -u : +``` +#### [OPERATOR] Broadcast peg-out +`:` = UTXO funding the payout to the withdrawer. Must be spendable by the operator private key. Suggested test amount: `2097274 sats`. +``` +-b tx -g -u : peg_out +``` +#### [OPERATOR] Broadcast peg-out confirm +``` +-b tx -g peg_out_confirm +``` +#### [OPERATOR] Broadcast kick-off 1 +``` +-b tx -g kick_off_1 +``` +#### [OPERATOR] Broadcast kick-off 2 +``` +-b tx -g kick_off_2 +``` +#### [OPERATOR] Broadcast assert-initial +``` +-b tx -g assert_initial +``` +#### [OPERATOR] Broadcast assert-commit 1 with invalid proof +``` +-b tx -g assert_commit_1_invalid +``` +#### [OPERATOR] Broadcast assert-commit 2 with invalid proof +``` +-b tx -g assert_commit_2_invalid +``` +#### [OPERATOR] Broadcast assert-final +``` +-b tx -g assert_final +``` +#### [VERIFIER_1] Broadcast disprove +`` = Receiver of the disprove reward. +``` +-b tx -g -a disprove +``` + +# Environment Setup +Clone and build this repository. The CLI executable is called `bridge`. + +## [DEPOSITOR] and [OPERATOR] and [VERIFIER_0] +All the above users can execute commands using a single setup (from the same directory). + +#### `bridge.toml` +Sample `bridge.toml` file that contains private keys of protocol participants and the ZK proof verifying key: +```toml +[keys] +depositor = "b8f17ea979be24199e7c3fec71ee88914d92fd4ca508443f765d56ce024ef1d7" +operator = "3076ca1dfc1e383be26d5dd3c0c427340f96139fa8c2520862cf551ec2d670ac" +verifier = "ee0817eac0c13aa8ee2dd3256304041f09f0499d1089b56495310ae8093583e2" +verifying_key = "9c3815c2ec66950b63e60c86dc9a2a658e0224d55ea45efe1f633be052dc7d867aff76a9e983210318f1b808aacbbba1dc04b6ac4e6845fa0cc887aeacaf5a068ab9aeaf8142740612ff2f3377ce7bfa7433936aaa23e3f3749691afaa06301fd03f043c097556e7efdf6862007edf3eb868c736d917896c014c54754f65182ae0c198157f92e667b6572ba60e6a52d58cb70dbeb3791206e928ea5e65c6199d25780cedb51796a8a43e40e192d1b23d0cfaf2ddd03e4ade7c327dbc427999244bf4b47b560cf65d672c86ef448eb5061870d3f617bd3658ad6917d0d32d9296020000000000000008f167c3f26c93dbfb91f3077b66bc0092473a15ef21c30f43d3aa96776f352a33622830e9cfcb48bdf8d3145aa0cf364bd19bbabfb3c73e44f56794ee65dc8a" +``` +Place the file in `.bitvm-bridge` directory in the user home directory. + +#### `.env` +Sample `.env` file that must be present in the same directory as the CLI tool or any of its parent directories (if you clone this repository, you can put it in the root directory). +``` +export BRIDGE_DATA_STORE_CLIENT_DATA_SUFFIX=-"bridge-client-data-demo-feb-2025.json" + +export BRIDGE_AWS_ACCESS_KEY_ID="" +export BRIDGE_AWS_SECRET_ACCESS_KEY="" +export BRIDGE_AWS_REGION="" +export BRIDGE_AWS_BUCKET="" + +# All verifier public keys +export VERIFIERS="026cc14f56ad7e8fdb323378287895c6c0bcdbb37714c74fba175a0c5f0cd0d56f,02452556ed6dbac394cbb7441fbaf06c446d1321467fa5a138895c6c9e246793dd" +``` + +## [VERIFIER_1] +Install the CLI tool in a different directory and make sure it doesn't share the `.env` file with the setup above. You can either clone this repository at another location or just copy the binary along with the .env. + +#### `bridge.toml` +Create a 'bitvm-bridge-verifier-1' directory there and put the following `bridge.toml` file there: +```toml +[keys] +verifier = "fc294c70faf210d4d0807ea7a3dba8f7e41700d90c119e1ae82a0687d89d297f" +verifying_key = "9c3815c2ec66950b63e60c86dc9a2a658e0224d55ea45efe1f633be052dc7d867aff76a9e983210318f1b808aacbbba1dc04b6ac4e6845fa0cc887aeacaf5a068ab9aeaf8142740612ff2f3377ce7bfa7433936aaa23e3f3749691afaa06301fd03f043c097556e7efdf6862007edf3eb868c736d917896c014c54754f65182ae0c198157f92e667b6572ba60e6a52d58cb70dbeb3791206e928ea5e65c6199d25780cedb51796a8a43e40e192d1b23d0cfaf2ddd03e4ade7c327dbc427999244bf4b47b560cf65d672c86ef448eb5061870d3f617bd3658ad6917d0d32d9296020000000000000008f167c3f26c93dbfb91f3077b66bc0092473a15ef21c30f43d3aa96776f352a33622830e9cfcb48bdf8d3145aa0cf364bd19bbabfb3c73e44f56794ee65dc8a" +``` +#### `.env` +``` +export BRIDGE_DATA_STORE_CLIENT_DATA_SUFFIX=-"bridge-client-data-demo-feb-2025.json" + +export BRIDGE_AWS_ACCESS_KEY_ID="" +export BRIDGE_AWS_SECRET_ACCESS_KEY="" +export BRIDGE_AWS_REGION="" +export BRIDGE_AWS_BUCKET="" + +export KEY_DIR="bitvm-bridge-verifier-1" + +# All verifier public keys +export VERIFIERS="026cc14f56ad7e8fdb323378287895c6c0bcdbb37714c74fba175a0c5f0cd0d56f,02452556ed6dbac394cbb7441fbaf06c446d1321467fa5a138895c6c9e246793dd" +``` diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..245b2918c --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 BitVM + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index c8053323d..3c3337fc9 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,270 @@ -# BitVM: Smarter Bitcoin Contracts +# BitVM Bridge: A Trust-minimized Bitcoin Bridge -The official implementation of [BitVM2](https://bitvm.org/bitvm2), running a [SNARK verifier](https://bitvm.org/snark). Work in progress. +[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) -We are following the implementation of [Arkworks](https://github.com/arkworks-rs) +> [!WARNING] +> DO NOT USE IN PRODUCTION! +The official implementation of [BitVM2](https://bitvm.org/bitvm2), +running a [SNARK verifier](https://bitvm.org/snark). -## Overview +The code follows the implementation of [Arkworks](https://github.com/arkworks-rs) -- Winternitz signatures -- BigInt arithmetic -- Bn254 - - Field operations - - Extension fields - - Curve operations - - Pairings -- Fflonk verifier -- Groth16 verifier +## Overview +The repository contains the implementation of a groth16 SNARK verifier that is executable via the optimistic BitVM paradigm on Bitcoin without any soft forks. -[BitVM1](https://github.com/BitVM/BitVM/tree/1dce989d1963b90c35391b77b451c6823302d503) +It is designed to be modular, allowing developers to reuse bitcoin scripts for u32 data types, hashes and curve operations. + +## Components + +BitVM is composed of several components. +Below is a list of the components and their purpose. + +- [**`u32` Operations**](bitvm/src/u32/): + Basic arithmetic operations of `u32` for hash functions, + including `add`, `sub`, `or`, `xor`, `rotation`, `shift`. + +- [**`u4` Operations**](bitvm/src/u4): + `u4` version arithmetic operations, + providing a more efficient way to construct hashes. + +- [**Hash Functions**](bitvm/src/hash/): + Two types of hash functions: + + - `SHA256`: comparing block headers and measuring Bitcoin difficulty. + - `BLAKE3`: compressing intermediate states in the chunker. + +- [**Big Integer**](bitvm/src/bigint/): + Variable-length big integer operations, + including of `add`, `sub`, `mul`, `div`, `inverse` and other operations. + +- [**BN254**](bitvm/src/bn254/): + Point expression of BN254 elliptic curves and operations based on BN254, + including addition, multiplication, pairing. + The pairing part is related to the "Algorithm 9" in the paper "On Proving Pairings" + +- [**Groth16**](bitvm/src/groth16/): + Groth16 uses BN254 to verify proof, the script is currently around 1 GB. + Some hints are precomputed in this part, which is related to the paper "On Proving Pairings". + +- [**Chunker**](bitvm/src/chunker/): + Splits Groth16 into chunks. + These chunks make sure two principles: + + 1. Any chunks shouldn't be success with a right proof. + 2. There are always some successful chunks with a wrong proof. + +- [**Signatures**](bitvm/src/signatures/): + Bit commitment using + [Winternitz signature](https://en.wikipedia.org/wiki/Lamport_signature#Short_keys_and_signature). + +- [**Bridge**](bridge/): + Definitions for the context (roles), connectors, Bitcoin transaction construction, + Bitcoin client wrapper, etc. + +## BitVM1 + +If you are looking for the deprectated BitVM1 implementation, please check out +[BitVM1](https://github.com/BitVM/BitVM/tree/1dce989d1963b90c35391b77b451c6823302d503). + + +## BitVM CLI + +### Overview + +The **BitVM CLI** is a command-line interface for interacting with the BitVM protocol, enabling users to manage Bitcoin keys, initiate peg-ins, retrieve addresses and UTXOs, and monitor the status of transactions within the BitVM network. + +This CLI supports multiple Bitcoin network environments, including `mainnet` and `testnet`. + +### Features + +- **Manage Bitcoin Keys**: Easily manage keys for different roles (depositor, operator, verifier, withdrawer). +- **Retrieve Depositor Address**: Get the address associated with the registered depositor key. +- **Retrieve Depositor UTXOs**: List unspent transaction outputs (UTXOs) for the depositor. +- **Initiate Peg-Ins**: Start the process of peg-ins by creating peg-in graphs. +- **Broadcast Transactions**: Send various types of transactions related to peg-ins and peg-outs. +- **Interactive Mode**: Use an interactive command-line interface for manual command issuance and management. + +## Requirements + +- Rust programming language (latest stable version) +- Cargo (Rust package manager) + +## Installation + +1. **Clone the Repository**: + ```bash + git clone + cd + ``` +2. **Build the Project**: + ```bash + cargo build --release + ``` +3. **Run the Application**: + ```bash + ./target/release/bridge + ``` + +## Usage + +The BitVM CLI application can be invoked with various commands. The general syntax is: + +``` +./target/release/bridge [OPTIONS] +``` + +### Global Options + +- -r, --verifiers : Comma-separated list of public keys for verifiers (max: 1000). Can also be set via the VERIFIERS environment variable. +- -e, --environment : Optional; Specify the Bitcoin network environment (mainnet, testnet, regtest). Defaults to testnet. Can also be set via the ENVIRONMENT environment variable. +- --key-dir : Optional; Directory containing the private keys. Can also be set via the KEY_DIR environment variable. +- -p, --user-profile : Optional; An arbitrary name of the user running the client (e.g. 'operator_one', 'verifier_0'). Used as a namespace separator in the local file path for storing private and public client data. Can also be set by the USER_PROFILE environment variable. + +### Available Commands + +#### Keys Management: + +1. Description: Manage secret keys for different contexts (depositor, operator, verifier, withdrawer). +2. Usage: +```bash +./target/release/bridge keys [OPTIONS] +``` + +3. Options: +- -d, --depositor : Secret key for the depositor. +- -o, --operator : Secret key for the operator. +- -v, --verifier : Secret key for the verifier. +- -w, --withdrawer : Secret key for the withdrawer. +- -k, --vk : Zero-knowledge proof verifying key. + +#### Get Operator Address: +1. Description: Retrieve the address spendable by the registered operator key. +2. Usage: +```bash +./target/release/bridge get-operator-address +``` + +#### Get Operator UTXOs: +1. Description: Retrieve a list of the operator's UTXOs. +2. Usage: +```bash +./target/release/bridge get-operator-utxos +``` + +#### Get Depositor Address: +1. Description: Retrieve the address spendable by the registered depositor key. +2. Usage: +```bash +./target/release/bridge get-depositor-address +``` + +#### Get Depositor UTXOs: +1. Description: Retrieve a list of the depositor's UTXOs. +2. Usage: +```bash +./target/release/bridge get-depositor-utxos +``` + +#### Initiate Peg-In: +1. Description: Start the peg-in process by creating a peg-in graph. +2. Usage: +```bash +./target/release/bridge initiate-peg-in --utxo : --destination_address +``` + +#### Create Peg-Out graph: +1. Description: Create the peg-out graph for the corresponding peg-in graph. +2. Usage: +```bash +./target/release/bridge create-peg-out --utxo : --peg_in_id +``` + +#### Push nonces (MuSig2 signing process): +1. Description: Push nonces for the corresponding peg-out or peg-in graph. +2. Usage: +```bash +./target/release/bridge push-nonces --id +``` + +#### Push signatures (MuSig2 signing process): +1. Description: Push signatures for the corresponding peg-out or peg-in graph. +2. Usage: +```bash +./target/release/bridge push-signatures --id +``` + +#### Mock L2 peg-out event: +1. Description: FOR TEST PURPOSES ONLY! Mocks L2 chain service with specified peg-in-confirm txid. +2. Usage: +```bash +./target/release/bridge mock-l2-pegout-event --utxo : +``` + +#### Broadcast Transactions: +1. Description: Send various types of transactions related to peg-ins and peg-outs. +2. Usage: +```bash +./target/release/bridge broadcast [COMMAND] [OPTIONS] +``` + +#### Automatic Mode: +1. Description: Enable automatic mode to poll for status updates and handle transactions. +2. Usage: +```bash +./target/release/bridge automatic +``` + +#### Interactive Mode: +1. Description: Enter into an interactive command prompt for manual command execution. +2. Usage: +```bash +./target/release/bridge interactive +``` + +#### Show Status: +1. Description: Display the current status of the BitVM client. +2. Usage: +```bash +./target/release/bridge status +``` + +### Environment Variables + +You can set the following environment variables to configure the CLI: + +#### General Environment Variables + +- BRIDGE_DATA_STORE_CLIENT_DATA_SUFFIX : Specifies the suffix for the bridge client data file. Default value is "bridge-client-data.json". +- BRIDGE_AWS_ACCESS_KEY_ID : Your AWS access key ID for authenticating with AWS services. Required if using AWS for storage. +- BRIDGE_AWS_SECRET_ACCESS_KEY : Your AWS secret access key for authenticating with AWS services. Required if using AWS for storage. +- BRIDGE_AWS_REGION : The AWS region where your storage bucket is located. Required if using AWS for storage. +- BRIDGE_AWS_BUCKET : The name of the S3 bucket where files will be stored. Required if using AWS for storage. + +- KEY_DIR: Optional; Directory containing private keys. +- VERIFIERS: Comma-separated list of public keys for verifiers. +- ENVIRONMENT: Optional; Bitcoin network environment (default: testnet). +- USER_PROFILE: Optional; An arbitrary name of the user running the client (e.g. 'operator_one', 'verifier_0'). Used as a namespace separator in the local file path for storing private and public client data. + +#### FTP/SFTP Environment Variables + +- BRIDGE_SFTP_HOST : Hostname or IP address of the SFTP server for secure file transfers. +- BRIDGE_SFTP_PORT : Port number for the SFTP connection. Default is 22. +- BRIDGE_SFTP_USERNAME : Username for authenticating to the SFTP server. +- BRIDGE_SFTP_KEYFILE_PATH : Path to the private key file used for authenticating to the SFTP server. +BRIDGE_SFTP_BASE_PATH : Base path on the SFTP server where BitVM data will be stored. Default is /bitvm. +- BRIDGE_FTP_HOST : Hostname or IP address of the FTP server for file transfers. +- BRIDGE_FTP_PORT : Port number for the FTP connection. Default is 21. +- BRIDGE_FTP_USERNAME : Username for authenticating to the FTP server. +- BRIDGE_FTP_PASSWORD : Password for authenticating to the FTP server. +- BRIDGE_FTP_BASE_PATH : Base path on the FTP server where BitVM data will be stored. Default is /bitvm. +- BRIDGE_FTPS_HOST : Hostname or IP address of the FTPS server for secure file transfers over FTP. +- BRIDGE_FTPS_PORT : Port number for the FTPS connection. Default is 21. +- BRIDGE_FTPS_USERNAME : Username for authenticating to the FTPS server. +- BRIDGE_FTPS_PASSWORD : Password for authenticating to the FTPS server. +- BRIDGE_FTPS_BASE_PATH : Base path on the FTPS server where BitVM data will be stored. Default is /bitvm. + +### Configuration File +The BitVM Bridge CLI uses a configuration file (bridge.toml) located in the specified key directory (default: `~/.bitvm-bridge/`). This file is used to store the keys for the depositor, operator, verifier, and withdrawer. diff --git a/bitvm/Cargo.toml b/bitvm/Cargo.toml new file mode 100644 index 000000000..5119fe69e --- /dev/null +++ b/bitvm/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "bitvm" +version = "0.1.0" +edition = "2021" +exclude = ["tests"] + + +[dependencies] +bitcoin-script.workspace = true +bitcoin.workspace = true +hex.workspace = true +bitcoin-scriptexec.workspace = true +serde.workspace = true +num-traits.workspace = true +ark-bn254.workspace = true +ark-ff.workspace = true +ark-ec.workspace = true +ark-groth16.workspace = true +ark-serialize.workspace = true +sha2.workspace = true +bitcoin-script-stack.workspace = true +rand.workspace = true +rand_chacha.workspace = true +blake3.workspace = true +paste.workspace = true +colored.workspace = true +itertools.workspace = true +num-bigint.workspace = true +ark-std.workspace = true +ark-crypto-primitives.workspace = true +ark-relations.workspace = true +tqdm.workspace = true +regex.workspace = true + +[features] +fuzzing = [] + +[dev-dependencies] +serde_json.workspace = true + +[profile.dev] +opt-level = 3 + +[profile.release] +lto = true diff --git a/src/bigint/add.rs b/bitvm/src/bigint/add.rs similarity index 63% rename from src/bigint/add.rs rename to bitvm/src/bigint/add.rs index 151524543..d122d77bc 100644 --- a/src/bigint/add.rs +++ b/bitvm/src/bigint/add.rs @@ -63,52 +63,50 @@ impl BigIntImpl { } } - pub fn add1() -> Script { + /// Double the BigInt on top of the stack + /// + /// # Note + /// + /// This function allows overflow of the underlying integer types during + /// doubling operation. + pub fn double_allow_overflow() -> Script { script! { - 1 { 1 << LIMB_SIZE } - // A0 + 1 - limb_add_carry OP_TOALTSTACK + // Double the limb, take the result to the alt stack, and add initial carry + OP_SWAP limb_double_without_carry OP_TOALTSTACK + - // from A1 + carry_0 - // to A{N-2} + carry_{N-3} for _ in 0..Self::N_LIMBS - 2 { - OP_SWAP - limb_add_carry OP_TOALTSTACK + OP_ROT limb_double_with_carry OP_TOALTSTACK } - // A{N-1} + carry_{N-2} - OP_NIP - { limb_add_nocarry(Self::HEAD_OFFSET) } + // When we got {limb} {base} {carry} on the stack, we drop the base + OP_NIP // {limb} {carry} + OP_SWAP { limb_double_with_carry_allow_overflow(Self::HEAD_OFFSET) } + // Take all limbs from the alt stack to the main stack for _ in 0..Self::N_LIMBS - 1 { OP_FROMALTSTACK } } } - /// Double the BigInt on top of the stack - /// - /// # Note - /// - /// This function allows overflow of the underlying integer types during - /// doubling operation. - pub fn double_allow_overflow() -> Script { + pub fn double_allow_overflow_keep_element(n: u32) -> Script { script! { + // OP_DEPTH OP_1SUB OP_PICK { 1 << LIMB_SIZE } // Double the limb, take the result to the alt stack, and add initial carry - limb_double_without_carry OP_TOALTSTACK + { n + 1 } OP_PICK limb_double_without_carry OP_TOALTSTACK - - for _ in 0..Self::N_LIMBS - 2 { - limb_double_with_carry OP_TOALTSTACK + for i in 0..Self::N_LIMBS - 2 { + { n + i + 3 } OP_PICK limb_double_with_carry OP_TOALTSTACK } // When we got {limb} {base} {carry} on the stack, we drop the base OP_NIP // {limb} {carry} - { limb_double_with_carry_allow_overflow(Self::HEAD_OFFSET) } + { n + 9 } OP_PICK { limb_double_with_carry_allow_overflow(Self::HEAD_OFFSET) } // Take all limbs from the alt stack to the main stack for _ in 0..Self::N_LIMBS - 1 { @@ -128,11 +126,11 @@ impl BigIntImpl { { 1 << LIMB_SIZE } // Double the limb, take the result to the alt stack, and add initial carry - limb_double_without_carry OP_TOALTSTACK + OP_SWAP limb_double_without_carry OP_TOALTSTACK for _ in 0..Self::N_LIMBS - 2 { - limb_double_with_carry OP_TOALTSTACK + OP_ROT limb_double_with_carry OP_TOALTSTACK } // When we got {limb} {base} {carry} on the stack, we drop the base @@ -173,6 +171,42 @@ impl BigIntImpl { } } + pub fn add_ref_with_top(b: u32) -> Script { + let b_depth = b * Self::N_LIMBS; + assert_ne!(b, 0); + script! { + { b_depth } OP_PICK + OP_OVER + OP_ADD + + // OP_DEPTH OP_1SUB OP_PICK + { 1 << LIMB_SIZE } + OP_SWAP + + { limb_add_create_carry() } + OP_TOALTSTACK + + for i in 0..Self::N_LIMBS - 2 { + { i + 3 } OP_PICK + OP_ADD + { b_depth + i + 3 } OP_PICK + OP_ADD { limb_add_create_carry() } OP_TOALTSTACK + } + + OP_NIP + { b_depth + Self::N_LIMBS } OP_PICK + { Self::N_LIMBS + 1 } OP_PICK + OP_ROT + { limb_add_with_carry_prevent_overflow(Self::HEAD_OFFSET) } + + for _ in 0..Self::N_LIMBS - 1 { + OP_FROMALTSTACK + } + } + } + + + /// Add BigInt on top of the stack to a BigInt at `b` depth in the stack /// /// # Note @@ -181,31 +215,32 @@ impl BigIntImpl { /// the referenced BigInt pub fn add_ref(b: u32) -> Script { let b_depth = b * Self::N_LIMBS; - if b > 1 { - script! { - { b_depth } - { Self::_add_ref_inner() } + assert_ne!(b, 0); + script! { + { b_depth } OP_PICK + OP_ADD + + // OP_DEPTH OP_1SUB OP_PICK + { 1 << LIMB_SIZE } + OP_SWAP + + { limb_add_create_carry() } + OP_TOALTSTACK + + for _ in 0..Self::N_LIMBS - 2 { + OP_ROT + { b_depth + 2 } OP_PICK + OP_ADD + OP_ADD { limb_add_create_carry() } OP_TOALTSTACK } - } else { - script! { - {b_depth} OP_PICK - { 1 << LIMB_SIZE } - limb_add_carry OP_TOALTSTACK - for i in 1..Self::N_LIMBS { - { b_depth + 2 } OP_PICK - if i < Self::N_LIMBS - 1 { - OP_ADD - OP_SWAP - limb_add_carry OP_TOALTSTACK - } else { - OP_ROT OP_DROP - OP_SWAP { limb_add_with_carry_prevent_overflow(Self::HEAD_OFFSET) } - // OP_SWAP { limb_add_nocarry(Self::HEAD_OFFSET) } - } - } - for _ in 0..Self::N_LIMBS - 1 { - OP_FROMALTSTACK - } + + OP_NIP + { b_depth + 1 } OP_PICK + OP_ROT + { limb_add_with_carry_prevent_overflow(Self::HEAD_OFFSET) } + + for _ in 0..Self::N_LIMBS - 1 { + OP_FROMALTSTACK } } } @@ -239,11 +274,15 @@ impl BigIntImpl { // OP_ELSE 3 OP_ADD { 1 << LIMB_SIZE } - 0 - for _ in 0..Self::N_LIMBS-1 { - 2 OP_PICK - OP_PICK - OP_ADD + for i in 0..Self::N_LIMBS-1 { + if i == 0 { + OP_OVER OP_1SUB + OP_PICK + } else { + 2 OP_PICK + OP_PICK + OP_ADD + } 3 OP_ROLL OP_ADD OP_2DUP @@ -265,6 +304,17 @@ impl BigIntImpl { } } +pub fn limb_add_create_carry() -> Script { + script! { + OP_2DUP + OP_LESSTHANOREQUAL + OP_TUCK + OP_IF + 2 OP_PICK OP_SUB + OP_ENDIF + } +} + /// Compute the sum of two limbs, including the carry bit /// /// Optimized by: @stillsaiko @@ -296,34 +346,31 @@ pub fn limb_add_nocarry(head_offset: u32) -> Script { } fn limb_add_with_carry_prevent_overflow(head_offset: u32) -> Script { - script! { + script!{ // {a} {b} {c:carry} - OP_3DUP // {a} {b} {c} {a} {b} {c} - OP_ADD OP_ADD OP_NIP // {a} {b} {a+b+c} - OP_ROT // {b} {a+b+c} {a} - { head_offset >> 1 } OP_LESSTHAN // {b} {a+b+c} {sign_a} - OP_ROT // {a+b+c} {sign_a} {b} - { head_offset >> 1 } OP_LESSTHAN // {a+b+c} {sign_a} {sign_b} - OP_ADD // {a+b+c} {sign_a+b} -> both neg: 0, both diff: 1, both pos: 2 - OP_SWAP // {sign_a+b} {a+b+c} - OP_DUP { head_offset } OP_GREATERTHANOREQUAL // {sign_a+b} {a+b+c} {L:0/1} // limb overflow - OP_TUCK // {sign_a+b} {L:0/1} {a+b+c} {L:0/1} - OP_IF { head_offset } OP_SUB OP_ENDIF // {sign_a+b} {L:0/1} {a+b+c_nlo} - OP_DUP { head_offset >> 1 } OP_GREATERTHANOREQUAL // {sign_a+b} {L:0/1} {a+b+c_nlo} {I:0/1} // integer overflow - OP_2SWAP // {a+b+c_nlo} {I:0/1} {sign_a+b} {L:0/1} - OP_IF // {a+b+c_nlo} {I:0/1} {sign_a+b} - OP_NOTIF OP_VERIFY 0 OP_ENDIF // {a+b+c_nlo} 0 - OP_ELSE - OP_1SUB OP_IF OP_NOT OP_VERIFY 0 OP_ENDIF // {a+b+c_nlo} 0 - OP_ENDIF - OP_DROP // {a+b+c_nlo} + OP_3DUP OP_ADD OP_ADD OP_NIP // {a} {b} {a+b+c} + { head_offset >> 1 } // {a} {b} {a+b+c} {x} + OP_TUCK OP_DUP OP_ADD // {a} {b} {x} {a+b+c} {2x} + OP_2DUP // {a} {b} {x} {a+b+c} {2x} {a+b+c} {2x} + OP_GREATERTHANOREQUAL // {a} {b} {x} {a+b+c} {2x} {L:0/1} + OP_NOTIF OP_NOT OP_ENDIF // {a} {b} {x} {a+b+c} {0/2x} + OP_SUB // {a} {b} {x} {a+b+c_nlo} + OP_SWAP // {a} {b} {a+b+c_nlo} {x} + OP_2DUP // {a} {b} {a+b+c_nlo} {x} {a+b+c_nlo} {x} + OP_2ROT // {a+b+c_nlo} {x} {a+b+c_nlo} {x} {a} {b} + 2 OP_PICK // {a+b+c_nlo} {x} {a+b+c_nlo} {x} {a} {b} {x} + OP_LESSTHAN // {a+b+c_nlo} {x} {a+b+c_nlo} {x} {a} {sign_b} + OP_2SWAP // {a+b+c_nlo} {x} {a} {sign_b} {a+b+c_nlo} {x} + OP_GREATERTHANOREQUAL // {a+b+c_nlo} {x} {a} {sign_b} {I:0/1} + OP_2SWAP // {a+b+c_nlo} {sign_b} {I:0/1} {x} {a} + OP_GREATERTHANOREQUAL // {a+b+c_nlo} {sign_b} {I:0/1} {sign_a} + OP_ADD OP_ADD 1 3 OP_WITHIN OP_VERIFY // verify (sign_a, sign_b, I) is not (0, 0, 0) or (1, 1, 1) which would mean overflow } } fn limb_double_without_carry() -> Script { script! { - // {limb} {base} - OP_SWAP // {base} {limb} + // {base} {limb} { NMUL(2) } // {base} {2*limb} OP_2DUP // {base} {2*limb} {base} {2*limb} OP_LESSTHANOREQUAL // {base} {2*limb} {base<=2*limb} @@ -336,8 +383,7 @@ fn limb_double_without_carry() -> Script { fn limb_double_with_carry() -> Script { script! { - // {limb} {base} {carry} - OP_ROT // {base} {carry} {limb} + // {base} {carry} {limb} { NMUL(2) } // {base} {carry} {2*limb} OP_ADD // {base} {2*limb + carry} OP_2DUP // {base} {2*limb + carry} {base} {2*limb + carry} @@ -351,7 +397,7 @@ fn limb_double_with_carry() -> Script { fn limb_double_with_carry_allow_overflow(head_offset: u32) -> Script { script! { - OP_SWAP // {carry} {limb} + // {carry} {limb} { NMUL(2) } // {carry} {2*limb} OP_ADD // {carry + 2*limb} { head_offset } OP_2DUP @@ -369,22 +415,15 @@ fn limb_double_with_carry_prevent_overflow(head_offset: u32) -> Script { // {a} {c:carry} OP_OVER // {a} {c} {a} OP_DUP OP_ADD OP_ADD // {a} {2a+c} - OP_SWAP // {2a+c} {a} - { head_offset >> 1 } OP_LESSTHAN // {2a+c} {sign_a} // neg: 0, pos: 1 - OP_SWAP // {sign_a} {2a+c} - OP_DUP { head_offset } OP_GREATERTHANOREQUAL // {sign_a} {2a+c} {L:0/1} // limb overflow - - OP_TUCK // {sign_a} {L:0/1} {2a+c} {L:0/1} - OP_IF { head_offset } OP_SUB OP_ENDIF // {sign_a} {L:0/1} {2a+c_nlo} - OP_DUP {head_offset >> 1 } OP_GREATERTHANOREQUAL // {sign_a} {L:0/1} {2a+c_nlo} {I:0/1} - OP_2SWAP // {2a+c_nlo} {I:0/1} {sign_a} {L:0/1} - - OP_IF // {2a+c_nlo} {I:0/1} {sign_a} - OP_NOTIF OP_VERIFY 0 OP_ENDIF // {2a+c_nlo} 0 - OP_ELSE // {2a+c_nlo} {I:0/1} {sign_a} - OP_IF OP_NOT OP_VERIFY 0 OP_ENDIF // {2a+c_nlo} 0 - OP_ENDIF - OP_DROP // {2a+c_nlo} + { head_offset >> 1 } // {a} {2a+c} {x} + OP_TUCK OP_DUP OP_ADD // {a} {x} {2a+c} {2x} + OP_2DUP OP_GREATERTHANOREQUAL // {a} {x} {2a+c} {2x} {L:0/1} + OP_NOTIF OP_NOT OP_ENDIF OP_SUB // {a} {x} {2a+c_nlo} + OP_2DUP OP_LESSTHAN // {a} {x} {2a+c_nlo} {I:0/1} + OP_2SWAP // {2a+c_nlo} {I:0/1} {a} {x} + OP_LESSTHAN // {2a+c_nlo} {I:0/1} {sign_a} + + OP_NUMNOTEQUAL OP_VERIFY // sign_a must be different than I } } @@ -427,32 +466,29 @@ fn limb_lshift_with_carry(bits: u32) -> Script { fn limb_lshift_with_carry_prevent_overflow(bits: u32, head: u32) -> Script { script! { // {a} {c..} - { bits } OP_PICK // {a} {c..} {a} + { bits } OP_ROLL // {c..} {a} + { 1 << (head - 1) } // {c..} {a} {x} + OP_DUP OP_TOALTSTACK // {c..} {a} {x} | {x} + OP_2DUP OP_LESSTHAN // {c..} {a} {x} {sign_a} | {x} + OP_IF OP_NOT OP_ENDIF // {c..} {a} {0/x} | {x} + OP_DUP OP_ADD OP_SUB // {c..} {a/a-2x} | {x} + for i in 0..bits { - { NMUL(2) } // {a} {c..} {2*a} + { NMUL(2) } if i < bits - 1 { { bits - i } OP_ROLL } - OP_ADD // {a} {c..} {2*a+c0} - } // {a} {2*a+c..} - - OP_SWAP // {2a+c} {a} - { 1 << (head - 1) } OP_LESSTHAN // {2a+c} {sign_a} // neg: 0, pos: 1 - OP_SWAP // {sign_a} {2a+c} - - OP_DUP { 1 << head } OP_GREATERTHANOREQUAL // {sign_a} {2a+c} {L:0/1} // limb overflow - OP_TUCK // {sign_a} {L:0/1} {2a+c} {L:0/1} - OP_IF { ((1 << bits) - 1) << head } OP_SUB OP_ENDIF // {sign_a} {L:0/1} {2a+c_nlo} - OP_DUP { 1 << head } OP_LESSTHAN OP_VERIFY - OP_DUP { 1 << (head - 1) } OP_GREATERTHANOREQUAL // {sign_a} {L:0/1} {2a+c_nlo} {I:0/1} - OP_2SWAP // {2a+c_nlo} {I:0/1} {sign_a} {L:0/1} - - OP_IF // {2a+c_nlo} {I:0/1} {sign_a} - OP_NOTIF OP_VERIFY 0 OP_ENDIF // {2a+c_nlo} 0 - OP_ELSE // {2a+c_nlo} {I:0/1} {sign_a} - OP_IF OP_NOT OP_VERIFY 0 OP_ENDIF // {2a+c_nlo} 0 - OP_ENDIF - OP_DROP // {2a+c_nlo} + OP_ADD + } // {result_signed} | {x} + + OP_FROMALTSTACK // {result_signed} {x} + OP_OVER // {result_signed} {x} {result_signed} + OP_2DUP OP_SWAP // {result_signed} {x} {result_signed} {result_signed} {x} + OP_DUP OP_NEGATE OP_SWAP // {result_signed} {x} {result_signed} {result_signed} {-x} {x} + OP_WITHIN OP_VERIFY // {result_signed} {x} {result_signed} + 0 OP_GREATERTHANOREQUAL // {result_signed} {x} {sign_result} + OP_IF OP_NOT OP_ENDIF // {result_signed} {0/x} + OP_DUP OP_ADD OP_ADD // {result} } } @@ -460,7 +496,7 @@ fn limb_lshift_with_carry_prevent_overflow(bits: u32, head: u32) -> Script { mod test { use crate::bigint::{U254, U64}; use crate::treepp::*; - use core::ops::{Add, Rem, Shl}; + use core::ops::{Rem, Shl}; use num_bigint::{BigUint, RandomBits}; use num_traits::One; use rand::{Rng, SeedableRng}; @@ -483,8 +519,7 @@ mod test { { U254::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -500,8 +535,7 @@ mod test { { U64::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } @@ -520,8 +554,7 @@ mod test { { U254::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -535,43 +568,7 @@ mod test { { U64::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); - } - } - - #[test] - fn test_1add() { - println!("U254.add1: {} bytes", U254::add1().len()); - let mut prng = ChaCha20Rng::seed_from_u64(0); - for _ in 0..100 { - let a: BigUint = prng.sample(RandomBits::new(254)); - let c: BigUint = (a.clone().add(BigUint::one())).rem(BigUint::one().shl(254)); - - let script = script! { - { U254::push_u32_le(&a.to_u32_digits()) } - { U254::add1() } - { U254::push_u32_le(&c.to_u32_digits()) } - { U254::equalverify(1, 0) } - OP_TRUE - }; - let exec_result = execute_script(script); - assert!(exec_result.success); - } - - for _ in 0..100 { - let a: u64 = prng.gen(); - let c = a.wrapping_add(1u64); - - let script = script! { - { U64::push_u64_le(&[a]) } - { U64::add1() } - { U64::push_u64_le(&[c]) } - { U64::equalverify(1, 0) } - OP_TRUE - }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } } diff --git a/src/bigint/bits.rs b/bitvm/src/bigint/bits.rs similarity index 89% rename from src/bigint/bits.rs rename to bitvm/src/bigint/bits.rs index 2feb5c4c3..9b29524c1 100644 --- a/src/bigint/bits.rs +++ b/bitvm/src/bigint/bits.rs @@ -1,5 +1,3 @@ -use bitcoin::opcodes::all::OP_FROMALTSTACK; - use crate::bigint::BigIntImpl; use crate::treepp::{script, Script}; use std::cmp::min; @@ -227,7 +225,6 @@ mod test { use super::{limb_to_be_bits, limb_to_le_bits}; use crate::bigint::{U254, U64}; use crate::run; - use crate::treepp::execute_script; use bitcoin_script::script; use core::ops::ShrAssign; use num_bigint::{BigUint, RandomBits}; @@ -262,9 +259,7 @@ mod test { } OP_TRUE }; - - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -288,8 +283,7 @@ mod test { OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for a in 0..4 { @@ -299,9 +293,7 @@ mod test { { a >> 1 } OP_EQUALVERIFY { a & 1 } OP_EQUAL }; - - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for a in 0..2 { @@ -310,17 +302,13 @@ mod test { { limb_to_be_bits(1) } { a } OP_EQUAL }; - - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } let script = script! { 0 { limb_to_be_bits(0) } 0 OP_EQUAL }; - - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } #[test] @@ -352,8 +340,7 @@ mod test { OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -377,8 +364,7 @@ mod test { OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for a in 0..4 { @@ -388,9 +374,7 @@ mod test { { a & 1 } OP_EQUALVERIFY { a >> 1 } OP_EQUAL }; - - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for a in 0..2 { @@ -399,17 +383,13 @@ mod test { { limb_to_le_bits(1) } { a } OP_EQUAL }; - - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } let script = script! { 0 { limb_to_le_bits(0) } 0 OP_EQUAL }; - - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } #[test] @@ -435,9 +415,7 @@ mod test { } OP_TRUE }; - - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..10 { @@ -460,8 +438,7 @@ mod test { OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } @@ -489,8 +466,7 @@ mod test { OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..10 { @@ -513,8 +489,7 @@ mod test { OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } @@ -543,8 +518,7 @@ mod test { OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..10 { @@ -568,8 +542,7 @@ mod test { OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } @@ -598,8 +571,7 @@ mod test { OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..10 { @@ -623,8 +595,7 @@ mod test { OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } @@ -640,10 +611,8 @@ mod test { { 0x01121314 } OP_EQUAL }; - let exec_result = execute_script(script); - println!("result: {}", exec_result); - assert!(exec_result.success); - + run(script); + let script = script! { { 0x00 } { 0x01 } @@ -653,9 +622,7 @@ mod test { { 0x00011314 } OP_EQUAL }; - let exec_result = execute_script(script); - println!("result: {}", exec_result); - assert!(exec_result.success); + run(script); } #[test] fn test_u254_from_bytes() { diff --git a/src/bigint/cmp.rs b/bitvm/src/bigint/cmp.rs similarity index 86% rename from src/bigint/cmp.rs rename to bitvm/src/bigint/cmp.rs index 68127d4e5..72e6243c2 100644 --- a/src/bigint/cmp.rs +++ b/bitvm/src/bigint/cmp.rs @@ -117,8 +117,7 @@ mod test { { a_lessthan } OP_EQUAL }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -137,8 +136,7 @@ mod test { { a_lessthanorequal } OP_EQUAL }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -157,8 +155,7 @@ mod test { { a_greaterthan } OP_EQUAL }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -177,8 +174,7 @@ mod test { { a_greaterthanorequal } OP_EQUAL }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } @@ -202,8 +198,7 @@ mod test { { a_lessthan } OP_EQUAL }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -222,8 +217,7 @@ mod test { { a_lessthanorequal } OP_EQUAL }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -242,8 +236,7 @@ mod test { { a_greaterthan } OP_EQUAL }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -262,8 +255,7 @@ mod test { { a_greaterthanorequal } OP_EQUAL }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } @@ -282,8 +274,7 @@ mod test { { U254::drop() } OP_FROMALTSTACK }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -295,8 +286,7 @@ mod test { { U254::is_zero(0) } OP_NOT }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -310,8 +300,7 @@ mod test { { U64::drop() } OP_FROMALTSTACK }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -323,8 +312,7 @@ mod test { { U64::is_zero(0) } OP_NOT }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } let script = script! { @@ -334,15 +322,13 @@ mod test { { U254::drop() } OP_FROMALTSTACK }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); let script = script! { { U254::push_u32_le(&[0]) } { U254::is_zero(0) } }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); let script = script! { { U64::push_u32_le(&[0]) } @@ -351,14 +337,12 @@ mod test { { U64::drop() } OP_FROMALTSTACK }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); let script = script! { { U64::push_u32_le(&[0]) } { U64::is_zero(0) } }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } diff --git a/src/bigint/inv.rs b/bitvm/src/bigint/inv.rs similarity index 94% rename from src/bigint/inv.rs rename to bitvm/src/bigint/inv.rs index e7552874e..54c3ce95e 100644 --- a/src/bigint/inv.rs +++ b/bitvm/src/bigint/inv.rs @@ -2,7 +2,6 @@ use crate::bigint::BigIntImpl; use crate::pseudo::OP_NDUP; use crate::treepp::*; use core::ops::{Mul, Rem, Sub}; -use bitcoin::opcodes::all::{OP_FROMALTSTACK, OP_TOALTSTACK}; use num_bigint::BigUint; use num_traits::Num; @@ -103,7 +102,7 @@ impl BigIntImpl { // roll the 2 * s { Self::roll(2) } { Self::toaltstack() } - + // roll the v { Self::roll(3) } { Self::toaltstack() } @@ -118,7 +117,7 @@ impl BigIntImpl { // remove the unused s { Self::drop() } - + // remove the unused u { Self::drop() } @@ -137,7 +136,7 @@ impl BigIntImpl { // start stack: u, r, v, s, 2 * s, 2 * r, u/2, v/2 | k { Self::toaltstack() } - + // remove the unused u/2 { Self::drop() } { Self::toaltstack() } @@ -203,7 +202,7 @@ impl BigIntImpl { // final stack: (u/2 - v/2), r + s, v, 2 * s | k OP_ELSE // start stack: u, v, 2 * s, 2 * r, (v/2 - u/2), r + s | k - + // remove the unused v { Self::roll(4) } { Self::drop() } @@ -234,7 +233,7 @@ impl BigIntImpl { // final stack: s k } } - + pub fn inv_stage2(modulus_hex: &str) -> Script { let modulus = BigUint::from_str_radix(modulus_hex, 16).unwrap(); @@ -367,6 +366,7 @@ mod test { use crate::bigint::inv::{limb_div3_carry, limb_shr1_carry}; use crate::bigint::{U254, U64}; use crate::treepp::*; + use core::ops::{Div, Shr}; use num_bigint::{BigUint, RandomBits}; use rand::{Rng, SeedableRng}; @@ -389,8 +389,7 @@ mod test { { a >> 1 } OP_EQUAL }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -405,8 +404,7 @@ mod test { { (1 << 28) | (a >> 1) } OP_EQUAL }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } @@ -432,8 +430,7 @@ mod test { { c } OP_EQUAL }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } } @@ -453,8 +450,7 @@ mod test { { U254::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -468,8 +464,7 @@ mod test { { U64::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } @@ -488,8 +483,7 @@ mod test { { U254::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -503,8 +497,7 @@ mod test { { U64::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } } diff --git a/src/bigint/mod.rs b/bitvm/src/bigint/mod.rs similarity index 77% rename from src/bigint/mod.rs rename to bitvm/src/bigint/mod.rs index 68dad85b0..2a2de2190 100644 --- a/src/bigint/mod.rs +++ b/bitvm/src/bigint/mod.rs @@ -5,16 +5,17 @@ pub mod inv; pub mod mul; pub mod std; pub mod sub; -pub mod u29x9; pub struct BigIntImpl {} impl BigIntImpl { pub const N_BITS: u32 = N_BITS; - pub const N_LIMBS: u32 = (N_BITS + LIMB_SIZE - 1) / LIMB_SIZE; + pub const LIMB_SIZE: u32 = LIMB_SIZE; + pub const N_LIMBS: u32 = N_BITS.div_ceil(LIMB_SIZE); pub const HEAD: u32 = N_BITS - (Self::N_LIMBS - 1) * LIMB_SIZE; pub const HEAD_OFFSET: u32 = 1u32 << Self::HEAD; } pub type U254 = BigIntImpl<254, 29>; pub type U64 = BigIntImpl<64, 16>; +pub type U256 = BigIntImpl<256, 29>; diff --git a/src/bigint/mul.rs b/bitvm/src/bigint/mul.rs similarity index 69% rename from src/bigint/mul.rs rename to bitvm/src/bigint/mul.rs index e93522b39..6a7a3d544 100644 --- a/src/bigint/mul.rs +++ b/bitvm/src/bigint/mul.rs @@ -42,7 +42,7 @@ impl BigIntImpl { #[cfg(test)] mod test { use crate::bigint::{U254, U64}; - use crate::{execute_script_as_chunks, treepp::*}; + use crate::treepp::*; use core::ops::{Mul, Rem, Shl}; use num_bigint::{BigUint, RandomBits}; use num_traits::One; @@ -65,8 +65,7 @@ mod test { { U254::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..3 { @@ -82,29 +81,7 @@ mod test { { U64::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } - - #[test] - fn test_mul_as_chunks() { - let mut prng = ChaCha20Rng::seed_from_u64(0); - let a: BigUint = prng.sample(RandomBits::new(254)); - let b: BigUint = prng.sample(RandomBits::new(254)); - let c: BigUint = (a.clone().mul(b.clone())).rem(BigUint::one().shl(254)); - - let script = script! { - { U254::push_u32_le(&a.to_u32_digits()) } - { U254::push_u32_le(&b.to_u32_digits()) } - { U254::mul() } - { U254::push_u32_le(&c.to_u32_digits()) } - { U254::equalverify(1, 0) } - OP_TRUE - }; - println!("compiled size: {:?}", script.clone().compile().len()); - let exec_result = execute_script_as_chunks(script, 20000, 400); - println!("Execute info: {}", exec_result); - assert!(exec_result.success); - } } diff --git a/bitvm/src/bigint/std.rs b/bitvm/src/bigint/std.rs new file mode 100644 index 000000000..7c8e6e32c --- /dev/null +++ b/bitvm/src/bigint/std.rs @@ -0,0 +1,1078 @@ +use bitcoin::script::read_scriptint; +use num_bigint::BigUint; +use num_traits::Num; +use std::str::FromStr; +use std::cmp::Ordering; + +use crate::bigint::BigIntImpl; +use crate::pseudo::{push_to_stack, NMUL}; +use crate::treepp::*; + +/// Struct to store the information of each step in `transform_limbsize` function. +/// ## Fields: +/// - current_limb_remaining_bits: the number of bits left in the current source limb that is being processed. +/// - extract_window: the number of bits to extract from the current limb. +/// - drop_currentlimb: signals to drop the current limb and bring another from altstack. +/// - initiate_targetlimb: signals to start a new target limb. +#[derive(Debug)] +struct TransformStep { + current_limb_remaining_bits: u32, + extract_window: u32, + drop_currentlimb: bool, + initiate_targetlimb: bool, +} + +impl BigIntImpl { + pub fn push_u32_le(v: &[u32]) -> Script { + let mut bits = vec![]; + for elem in v.iter() { + for i in 0..32 { + bits.push((elem & (1 << i)) != 0); + } + } + bits.resize(N_BITS as usize, false); + + let mut limbs = vec![]; + for chunk in bits.chunks(LIMB_SIZE as usize) { + let mut chunk_vec = chunk.to_vec(); + chunk_vec.resize(LIMB_SIZE as usize, false); + + let mut elem = 0u32; + for (i, chunk_i) in chunk_vec.iter().enumerate() { + if *chunk_i { + elem += 1 << i; + } + } + + limbs.push(elem); + } + + limbs.reverse(); + + script! { + for limb in &limbs { + { *limb } + } + { push_to_stack(0,Self::N_LIMBS as usize - limbs.len()) } + } + } + + pub fn read_u32_le(mut witness: Vec>) -> Vec { + assert_eq!(witness.len() as u32, Self::N_LIMBS); + + witness.reverse(); + + let mut bits: Vec = vec![]; + for element in witness.iter() { + let limb = read_scriptint(element).unwrap(); + for i in 0..LIMB_SIZE { + bits.push((limb & (1 << i)) != 0); + } + } + + bits.resize(N_BITS as usize, false); + + let mut u32s = vec![]; + + for chunk in bits.chunks(32) { + let mut chunk_vec = chunk.to_vec(); + chunk_vec.resize(32, false); + + let mut elem = 0u32; + for i in 0..32 as usize { + if chunk_vec[i] { + elem += 1 << i; + } + } + + u32s.push(elem); + } + + u32s + } + + pub fn push_u64_le(v: &[u64]) -> Script { + let v = v + .iter() + .flat_map(|v| { + [ + (v & 0xffffffffu64) as u32, + ((v >> 32) & 0xffffffffu64) as u32, + ] + }) + .collect::>(); + + Self::push_u32_le(&v) + } + + /// Zip the top two u{16N} elements + /// input: a0 ... a{N-1} b0 ... b{N-1} + /// output: a0 b0 ... ... a{N-1} b{N-1} + pub fn zip(mut a: u32, mut b: u32) -> Script { + a = (a + 1) * Self::N_LIMBS - 1; + b = (b + 1) * Self::N_LIMBS - 1; + + assert_ne!(a, b); + if a < b { + script! { + for i in 0..Self::N_LIMBS { + { a + i } + OP_ROLL + { b } + OP_ROLL + } + } + } else { + script! { + for i in 0..Self::N_LIMBS { + { a } + OP_ROLL + { b + i + 1 } + OP_ROLL + } + } + } + } + + pub fn copy_zip(mut a: u32, mut b: u32) -> Script { + a = (a + 1) * Self::N_LIMBS - 1; + b = (b + 1) * Self::N_LIMBS - 1; + + script! { + for i in 0..Self::N_LIMBS { + { a + i } OP_PICK { b + 1 + i } OP_PICK + } + } + } + + pub fn dup_zip(mut a: u32) -> Script { + a = (a + 1) * Self::N_LIMBS - 1; + + script! { + for i in 0..Self::N_LIMBS { + { a + i } OP_ROLL OP_DUP + } + } + } + + pub fn copy(mut a: u32) -> Script { + a = (a + 1) * Self::N_LIMBS - 1; + + script! { + if a < 134 { + for _ in 0..Self::N_LIMBS { + { a } OP_PICK + } + } else { + { a + 1 } + for _ in 0..Self::N_LIMBS - 1 { + OP_DUP OP_PICK OP_SWAP + } + OP_1SUB OP_PICK + } + } + } + + pub fn roll(mut a: u32) -> Script { + if a == 0 { + return script! {}; + } + a = (a + 1) * Self::N_LIMBS - 1; + + script! { + for _ in 0..Self::N_LIMBS { + { a } OP_ROLL + } + } + } + + pub fn drop() -> Script { + script! { + for _ in 0..Self::N_LIMBS / 2 { + OP_2DROP + } + if Self::N_LIMBS & 1 == 1 { + OP_DROP + } + } + } + + pub fn push_dec(dec_string: &str) -> Script { + Self::push_u32_le(&BigUint::from_str(dec_string).unwrap().to_u32_digits()) + } + + pub fn push_hex(hex_string: &str) -> Script { + Self::push_u32_le( + &BigUint::from_str_radix(hex_string, 16) + .unwrap() + .to_u32_digits(), + ) + } + + #[inline] + pub fn push_zero() -> Script { + push_to_stack(0, Self::N_LIMBS as usize) + } + + #[inline] + pub fn push_one() -> Script { + script! { + { push_to_stack(0,(Self::N_LIMBS - 1) as usize) } + 1 + } + } + + pub fn is_zero_keep_element(a: u32) -> Script { + let a = Self::N_LIMBS * a; + script! { + 1 + for i in 0..Self::N_LIMBS { + { a + i+1 } OP_PICK + OP_NOT + OP_BOOLAND + } + } + } + + pub fn is_zero(a: u32) -> Script { + let a = Self::N_LIMBS * a; + script! { + 1 + for _ in 0..Self::N_LIMBS { + { a +1 } OP_ROLL + OP_NOT + OP_BOOLAND + } + } + } + + pub fn is_one_keep_element(a: u32) -> Script { + let a = Self::N_LIMBS * a; + script! { + 1 + { a + 1 } OP_PICK + 1 OP_EQUAL OP_BOOLAND + for i in 1..Self::N_LIMBS { + { a + i + 1 } OP_PICK + OP_NOT + OP_BOOLAND + } + } + } + + pub fn is_one(a: u32) -> Script { + let a = Self::N_LIMBS * a; + script! { + 1 + { a + 1 } OP_ROLL + 1 OP_EQUAL OP_BOOLAND + for _ in 1..Self::N_LIMBS { + { a + 1 } OP_ROLL + OP_NOT + OP_BOOLAND + } + } + } + + pub fn toaltstack() -> Script { + script! { + for _ in 0..Self::N_LIMBS { + OP_TOALTSTACK + } + } + } + + pub fn fromaltstack() -> Script { + script! { + for _ in 0..Self::N_LIMBS { + OP_FROMALTSTACK + } + } + } + + pub fn is_negative(depth: u32) -> Script { + script! { + { (1 + depth) * Self::N_LIMBS - 1 } OP_PICK + { Self::HEAD_OFFSET >> 1 } + OP_GREATERTHANOREQUAL + } + } + + pub fn is_positive(depth: u32) -> Script { + script! { + { Self::is_zero_keep_element(depth) } OP_NOT + { (1 + depth) * Self::N_LIMBS } OP_PICK + { Self::HEAD_OFFSET >> 1 } + OP_LESSTHAN OP_BOOLAND + } + } + + /// Resize positive numbers + /// + /// # Note + /// + /// Does not work for negative numbers + pub fn resize() -> Script { + let n_limbs_self = N_BITS.div_ceil(LIMB_SIZE); + let n_limbs_target = T_BITS.div_ceil(LIMB_SIZE); + + match n_limbs_target.cmp(&n_limbs_self) { + Ordering::Equal => script! {}, + Ordering::Greater => { + let n_limbs_to_add = n_limbs_target - n_limbs_self; + script! { + if n_limbs_to_add > 0 { + {0} {crate::pseudo::OP_NDUP((n_limbs_to_add - 1) as usize)} // Pushing zeros to the stack + } + for _ in 0..n_limbs_self { + { n_limbs_target - 1 } OP_ROLL + } + } + }, + Ordering::Less => { + let n_limbs_to_remove = n_limbs_self - n_limbs_target; + script! { + for _ in 0..n_limbs_to_remove { + { n_limbs_target } OP_ROLL OP_DROP + } + } + } + } + } + + /// Generates a vector of TransformStep struct that encodes all the information needed to + /// convert BigInt form one limbsize represention (source) to another (target). + /// used as a helper function for `transform_limbsize` + + fn get_transform_steps(source_limb_size: u32, target_limb_size: u32) -> Vec { + + //define an empty vector to store Transform steps + let mut transform_steps: Vec = Vec::new(); + + // compute the number of limbs for target and source + let target_n_limbs = N_BITS.div_ceil(target_limb_size); + let mut target_limb_remaining_bits = Self::N_BITS - (target_n_limbs - 1) * target_limb_size; + let source_n_limbs = N_BITS.div_ceil(source_limb_size); + let source_head = Self::N_BITS - (source_n_limbs - 1) * source_limb_size; + + // define a vector of limbsizes of source + let mut limb_sizes: Vec = Vec::with_capacity(source_n_limbs as usize); + let mut first_iter_flag = true; + for _ in 0..(source_n_limbs - 1) { + limb_sizes.push(source_limb_size); + } + limb_sizes.push(source_head); + + //iterate until all limbs of source are processed + while limb_sizes.len() > 0 { + //iterate until the target limb is filled completely + while target_limb_remaining_bits > 0 { + let source_limb_last_idx = limb_sizes.len() - 1; + let source_limb_remaining_bits = limb_sizes[source_limb_last_idx]; + + match source_limb_remaining_bits.cmp(&target_limb_remaining_bits) { + Ordering::Less => { + transform_steps.push(TransformStep { + current_limb_remaining_bits: source_limb_remaining_bits.clone(), + extract_window: source_limb_remaining_bits.clone(), + drop_currentlimb: true, + initiate_targetlimb: first_iter_flag, + }); + target_limb_remaining_bits -= source_limb_remaining_bits.clone(); + limb_sizes.pop(); + } + Ordering::Equal => { + transform_steps.push(TransformStep { + current_limb_remaining_bits: source_limb_remaining_bits.clone(), + extract_window: target_limb_remaining_bits, + drop_currentlimb: true, + initiate_targetlimb: first_iter_flag, + }); + target_limb_remaining_bits = 0; + limb_sizes.pop(); + } + Ordering::Greater => { + transform_steps.push(TransformStep { + current_limb_remaining_bits: source_limb_remaining_bits.clone(), + extract_window: target_limb_remaining_bits, + drop_currentlimb: false, + initiate_targetlimb: first_iter_flag, + }); + limb_sizes[source_limb_last_idx] = source_limb_remaining_bits - target_limb_remaining_bits; + target_limb_remaining_bits = 0; + } + } + first_iter_flag = false; + } + target_limb_remaining_bits = target_limb_size; + first_iter_flag = true; + } + transform_steps + } + + /// Transform Limbsize for BigInt + /// This function changes the representation of BigInt present on stack as multiple limbs of source limbsize to + /// any another limbsize within 1 and 31 (inclusive). + /// Specifically, This can be used to transform limbs into nibbles, limbs into bits ans vice-versa to aid optimizetions. + /// + /// ## Assumptions: + /// - Does NOT do input validation. + /// - The message is placed such that LSB is on top of stack. (MSB pushed first) + /// + /// ## Stack Effects: + /// The original BigInt which that was in stack is dropped + /// The same BigInt with target_limbsize is left on stack + /// + /// ## Panics: + /// - If the source or target limb size lies outside of 0 to 31 (inclusive), fails with assertion error. + /// - If the source or target limb size is greater than number of bits, fails with assertion error. + /// - If the elements do not fit on the stack. (few satck elements are also used for intermediate computation). + /// - The number of bits in the BigInt must be 32 or larger. + + pub fn transform_limbsize(source_limb_size: u32, target_limb_size: u32) -> Script { + // ensure that source and target limb sizes are between 0 and 31 inclusive + assert!( + source_limb_size < 32 && source_limb_size > 0, + "source limb size must lie between 1 and 31 inclusive" + ); + assert!( + target_limb_size < 32 && target_limb_size > 0, + "target limb size must lie between 1 and 31 inclusive" + ); + + //ensure that source and target limb size aren't greater than N_BITS + assert!( + source_limb_size <= Self::N_BITS, + "source limb size mustn't be greater than number of bits in bigInt" + ); + assert!( + target_limb_size <= Self::N_BITS, + "target limb size mustn't be greater than number of bits in bigInt" + ); + + //ensure that the N_BITS are larger than or equal to 32 + assert!( + Self::N_BITS >= 32, + "The number of bits in BigInt must be atleast 32" + ); + + // if both source and target limb size are same, do nothing + if source_limb_size == target_limb_size { + script!() + } else { + let steps = Self::get_transform_steps(source_limb_size, target_limb_size); + + let source_n_limbs = N_BITS.div_ceil(source_limb_size); + script!( + // send all limbs except the first to alt stack so that the MSB is handled first + for _ in 0..(source_n_limbs - 1){OP_TOALTSTACK} + + for (index, step) in steps.iter().enumerate() { + {extract_digits(step.current_limb_remaining_bits, step.extract_window)} + + if !step.initiate_targetlimb{ + // add + OP_ROT + for _ in 0..step.extract_window {OP_DUP OP_ADD} + OP_ROT + OP_ADD + OP_SWAP + } + + if step.drop_currentlimb{ + OP_DROP + //except when its the last limb, we pull a new limb from altstack + if index != (steps.len() - 1){ + OP_FROMALTSTACK + } + } + } + ) + } + } +} + +/// Extracts a window of bits from a u32 limb on top of stack +/// +/// ## Assumptions; +/// Doesn't do input validation +/// All the bits before start_index must be 0 for the extract to work properly +/// +/// ## Panics: +/// - If the start_index is not between the range 1 and 31 (inclusive), fails with assertion error +/// - If the window is larger than the start_index, fails with assertion error +/// +/// ## Stack behaviour: +/// - extracts the desired window as a stack element +/// - leaves the original limb with extracted bits set to zero on top of stack +pub fn extract_digits(start_index: u32, window: u32) -> Script { + // doesnot work if start_index is 32 + assert!(start_index < 32 && start_index > 0, "start_index must lie between 1 and 31 (inclusive)"); + + //panics if the window exceeds the number of bits on the left of start_index + assert!( + start_index >= window, + "not enough bits left of start_index to fill the window!" + ); + + script! { + 0 + OP_SWAP + for i in 0..window { + OP_TUCK + { 1 << (start_index - i - 1) } + OP_GREATERTHANOREQUAL + OP_TUCK + OP_ADD + if i < window - 1 { { NMUL(2) } } + OP_ROT OP_ROT + OP_IF + { 1 << (start_index - i - 1) } + OP_SUB + OP_ENDIF + } + } +} + +#[cfg(test)] +mod test { + use crate::bigint::std::extract_digits; + use crate::bigint::{BigIntImpl, U254}; + use crate::run; + + use bitcoin_script::script; + use rand::{Rng, SeedableRng}; + use rand_chacha::ChaCha20Rng; + + #[test] + fn test_zip() { + const N_BITS: u32 = 1450; + const N_U30_LIMBS: u32 = 50; + + let mut prng = ChaCha20Rng::seed_from_u64(0); + + for _ in 0..50 { + let mut v = vec![]; + for _ in 0..N_U30_LIMBS { + v.push(prng.gen::()); + } + for _ in 0..N_U30_LIMBS { + v.push(prng.gen::()); + } + + let mut expected = vec![]; + for i in 0..N_U30_LIMBS { + expected.push(v[i as usize]); + expected.push(v[(N_U30_LIMBS + i) as usize]); + } + + let script = script! { + for i in 0..N_U30_LIMBS * 2 { + { v[i as usize] } + } + { BigIntImpl::::zip(1, 0) } + for i in 0..N_U30_LIMBS * 2 { + { expected[(N_U30_LIMBS * 2 - 1 - i) as usize] } + OP_EQUALVERIFY + } + OP_TRUE + }; + run(script); + } + + for _ in 0..50 { + let mut v = vec![]; + for _ in 0..N_U30_LIMBS { + v.push(prng.gen::()); + } + for _ in 0..N_U30_LIMBS { + v.push(prng.gen::()); + } + + let mut expected = vec![]; + for i in 0..N_U30_LIMBS { + expected.push(v[(N_U30_LIMBS + i) as usize]); + expected.push(v[i as usize]); + } + + let script = script! { + for i in 0..N_U30_LIMBS * 2 { + { v[i as usize] } + } + { BigIntImpl::::zip(0, 1) } + for i in 0..N_U30_LIMBS * 2 { + { expected[(N_U30_LIMBS * 2 - 1 - i) as usize] } + OP_EQUALVERIFY + } + OP_TRUE + }; + run(script); + } + } + + #[test] + fn test_copy() { + println!("U254.copy(0): {} bytes", U254::copy(0).len()); + println!("U254.copy(13): {} bytes", U254::copy(13).len()); + println!("U254.copy(14): {} bytes", U254::copy(14).len()); + const N_U30_LIMBS: u32 = 9; + + let mut prng = ChaCha20Rng::seed_from_u64(0); + + for _ in 0..50 { + let mut v = vec![]; + for _ in 0..N_U30_LIMBS { + v.push(prng.gen::()); + } + for _ in 0..N_U30_LIMBS { + v.push(prng.gen::()); + } + + let mut expected = vec![]; + for i in 0..N_U30_LIMBS { + expected.push(v[i as usize]); + } + + let script = script! { + for i in 0..N_U30_LIMBS * 2 { + { v[i as usize] } + } + { U254::copy(1) } + for i in 0..N_U30_LIMBS { + { expected[(N_U30_LIMBS - 1 - i) as usize] } + OP_EQUALVERIFY + } + { U254::drop() } + { U254::drop() } + OP_TRUE + }; + run(script); + } + } + + #[test] + fn test_roll() { + const N_U30_LIMBS: u32 = 9; + + let mut prng = ChaCha20Rng::seed_from_u64(0); + + for _ in 0..50 { + let mut v = vec![]; + for _ in 0..N_U30_LIMBS { + v.push(prng.gen::()); + } + for _ in 0..N_U30_LIMBS { + v.push(prng.gen::()); + } + + let mut expected = vec![]; + for i in 0..N_U30_LIMBS { + expected.push(v[i as usize]); + } + + let script = script! { + for i in 0..N_U30_LIMBS * 2 { + { v[i as usize] } + } + { U254::roll(1) } + for i in 0..N_U30_LIMBS { + { expected[(N_U30_LIMBS - 1 - i) as usize] } + OP_EQUALVERIFY + } + { U254::drop() } + OP_TRUE + }; + run(script); + } + } + + #[test] + fn test_copy_zip() { + const N_U30_LIMBS: u32 = 9; + + let mut prng = ChaCha20Rng::seed_from_u64(0); + + for _ in 0..50 { + let mut v = vec![]; + for _ in 0..N_U30_LIMBS { + v.push(prng.gen::()); + } + for _ in 0..N_U30_LIMBS { + v.push(prng.gen::()); + } + + let mut expected = vec![]; + for i in 0..N_U30_LIMBS { + expected.push(v[i as usize]); + expected.push(v[(N_U30_LIMBS + i) as usize]); + } + + let script = script! { + for i in 0..N_U30_LIMBS * 2 { + { v[i as usize] } + } + { U254::copy_zip(1, 0) } + for i in 0..N_U30_LIMBS * 2 { + { expected[(N_U30_LIMBS * 2 - 1 - i) as usize] } + OP_EQUALVERIFY + } + { U254::drop() } + { U254::drop() } + OP_TRUE + }; + run(script); + + let mut expected = vec![]; + for i in 0..N_U30_LIMBS { + expected.push(v[(N_U30_LIMBS + i) as usize]); + expected.push(v[i as usize]); + } + + let script = script! { + for i in 0..N_U30_LIMBS * 2 { + { v[i as usize] } + } + { U254::copy_zip(0, 1) } + for i in 0..N_U30_LIMBS * 2 { + { expected[(N_U30_LIMBS * 2 - 1 - i) as usize] } + OP_EQUALVERIFY + } + { U254::drop() } + { U254::drop() } + OP_TRUE + }; + run(script); + + let mut expected = vec![]; + for i in 0..N_U30_LIMBS { + expected.push(v[i as usize]); + expected.push(v[i as usize]); + } + + let script = script! { + for i in 0..N_U30_LIMBS * 2 { + { v[i as usize] } + } + { U254::copy_zip(1, 1) } + for i in 0..N_U30_LIMBS * 2 { + { expected[(N_U30_LIMBS * 2 - 1 - i) as usize] } + OP_EQUALVERIFY + } + { U254::drop() } + { U254::drop() } + OP_TRUE + }; + run(script); + + let script = script! { + for i in 0..N_U30_LIMBS * 2 { + { v[i as usize] } + } + { U254::dup_zip(1) } + for i in 0..N_U30_LIMBS * 2 { + { expected[(N_U30_LIMBS * 2 - 1 - i) as usize] } + OP_EQUALVERIFY + } + { U254::drop() } + OP_TRUE + }; + run(script); + } + } + + #[test] + fn push_hex() { + run(script! { + { U254::push_hex("30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47") } + { 0x187cfd47 } OP_EQUALVERIFY // 410844487 + { 0x10460b6 } OP_EQUALVERIFY // 813838427 + { 0x1c72a34f } OP_EQUALVERIFY // 119318739 + { 0x2d522d0 } OP_EQUALVERIFY // 542811226 + { 0x1585d978 } OP_EQUALVERIFY // 22568343 + { 0x2db40c0 } OP_EQUALVERIFY // 18274822 + { 0xa6e141 } OP_EQUALVERIFY // 436378501 + { 0xe5c2634 } OP_EQUALVERIFY // 329037900 + { 0x30644e } OP_EQUAL // 12388 + }); + } + + // test the extract window fn + #[test] + fn test_extract_window(){ + let mut prng = ChaCha20Rng::seed_from_u64(8); + + for _ in 0..100{ + // generate random start_index and window + let start_index = prng.gen_range(1..=31); + let window = prng.gen_range(1..=start_index); + + // generate a random u32 + let random_u32: u32 = prng.gen(); + + // compute the values by shifting + let initial_limb = random_u32 >> (32u32 - start_index); + let expected_window = initial_limb >> (start_index - window); + let modified_limb = if start_index == window {0} else {(initial_limb << (32u32 - start_index + window)) >> (32u32 - start_index + window)}; + + let script = script!( + {initial_limb} + + {extract_digits(start_index,window)} + + {modified_limb} + OP_EQUALVERIFY + + {expected_window} + OP_EQUAL + ); + + let res = crate::execute_script(script.clone()); + assert!(res.success); + } + } + + // manual test of transform to and from U256. + #[test] + fn test_transform_to_and_from_u256() { + type U256 = BigIntImpl<256, 29>; + let script = script!( + {0b010101010010101010100101} + {0b10000000100000011111111011111} + {0b00000101000000100000000000000} + {0b01010101001010101000000000000} + {0b11010101001010101001010111111} + {0b11111111111000000000000000000} + {0b01010010101001010010010101001} + {0b00000000000000000000000000000} + {0b11111111111111111111111111111} + {U256::transform_limbsize(29, 4)} + {U256::transform_limbsize(4, 1)} + {U256::transform_limbsize(1, 31)} + {U256::transform_limbsize(31, 2)} + {U256::transform_limbsize(2, 10)} + {U256::transform_limbsize(10, 31)} + {U256::transform_limbsize(31, 27)} + {U256::transform_limbsize(27, 8)} + {U256::transform_limbsize(8, 9)} + {U256::transform_limbsize(9, 9)} + {U256::transform_limbsize(9, 4)} + {U256::transform_limbsize(4, 4)} + {U256::transform_limbsize(4,29)} + {0b010101010010101010100101} + {0b10000000100000011111111011111} + {0b00000101000000100000000000000} + {0b01010101001010101000000000000} + {0b11010101001010101001010111111} + {0b11111111111000000000000000000} + {0b01010010101001010010010101001} + {0b00000000000000000000000000000} + {0b11111111111111111111111111111} + + + for i in (2..10).rev(){ + {i} + OP_ROLL + OP_EQUALVERIFY + } + OP_EQUAL + ); + let res = crate::execute_script(script.clone()); + assert!(res.success); + } + + // Testing all ones manually for U1773 + #[test] + fn test_transform_allones_to_and_from_u1773() { + type U1773 = BigIntImpl<1773, 21>; + let script = script!( + // push all ones in U1773 assuming limb size of 23 + {0b11} + for _ in 0..77{ + {0b11111111111111111111111} + } + + {U1773::transform_limbsize(23,21)} + {U1773::transform_limbsize(21,2)} + {U1773::transform_limbsize(2,3)} + {U1773::transform_limbsize(3,19)} + {U1773::transform_limbsize(19,23)} + + for _ in 0..77{ + {0b11111111111111111111111} + OP_EQUALVERIFY + } + {0b11} + OP_EQUAL + + ); + let res = crate::execute_script(script.clone()); + assert!(res.success); + } + + // Testing all ones manually for U1773 + #[test] + fn test_transform_allzeros_to_and_from_u1773() { + type U1773 = BigIntImpl<1773, 21>; + let script = script!( + // push all ones in U1773 assuming limb size of 23 + {0b11} + for _ in 0..77{ + {0b11111111111111111111111} + } + + {U1773::transform_limbsize(23,21)} + {U1773::transform_limbsize(21,2)} + {U1773::transform_limbsize(2,3)} + {U1773::transform_limbsize(3,19)} + {U1773::transform_limbsize(19,23)} + + // push the same input in reverse and verify + for _ in 0..77{ + {0b11111111111111111111111} + OP_EQUALVERIFY + } + {0b11} + OP_EQUAL + + ); + let res = crate::execute_script(script.clone()); + assert!(res.success); + } + + // Testing all ones manually for U1773 + #[test] + fn test_transform_allzeros_to_and_from_u876() { + type U876 = BigIntImpl<876, 14>; + let script = script!( + // push all zeros in U876 assuming limb size of 14 + {0b00000000} + for _ in 0..62{ + {0b00000000000000} + } + + {U876::transform_limbsize(14, 9)} + {U876::transform_limbsize(9, 10)} + {U876::transform_limbsize(10, 31)} + {U876::transform_limbsize(31, 1)} + {U876::transform_limbsize(1, 2)} + {U876::transform_limbsize(2, 4)} + {U876::transform_limbsize(4, 8)} + {U876::transform_limbsize(8, 19)} + {U876::transform_limbsize(19, 27)} + {U876::transform_limbsize(27, 14)} + + //push the same input in reverse and verify + for _ in 0..62{ + {0b00000000000000} + OP_EQUALVERIFY + } + {0b00000000} + OP_EQUAL + + ); + let res = crate::execute_script(script.clone()); + assert!(res.success); + } + + #[test] + #[should_panic(expected = "source limb size must lie between 1 and 31 inclusive")] + fn test_source_limbsize_too_high() { + script!({ U254::transform_limbsize(32, 3) }); + } + + #[test] + #[should_panic(expected = "source limb size must lie between 1 and 31 inclusive")] + fn test_source_limbsize_too_low() { + script!({ U254::transform_limbsize(0, 29) }); + } + + #[test] + #[should_panic(expected = "target limb size must lie between 1 and 31 inclusive")] + fn test_target_limbsize_too_high() { + script!({ U254::transform_limbsize(29, 32) }); + } + + #[test] + #[should_panic(expected = "target limb size must lie between 1 and 31 inclusive")] + fn test_target_limbsize_too_low() { + script!({ U254::transform_limbsize(29, 0) }); + } + + // test for properties that gen_transform_steps must satisfy + // sum of extracts window must be equal to the number of bits + // count of drop_current_limb must be equal to number of limbs in source representation + // count of initiate_targetlimb must be equal to number of limbs in target representation + #[test] + fn test_generate_steps_sum_of_extarct_windows() { + type U256 = BigIntImpl<256, 29>; + let mut prng = ChaCha20Rng::seed_from_u64(1); + for _ in 0..100 { + // generate random source and target limbsizes + let source = prng.gen_range(1..=31); + let target = prng.gen_range(1..=31); + + let steps = U256::get_transform_steps(source, target); + + let mut extract_windows_sum = 0; + let mut drop_currentlimb_count = 0; + let mut initiate_targetlimb_count = 0; + for step in steps { + extract_windows_sum += step.extract_window; + drop_currentlimb_count += if step.drop_currentlimb { 1 } else { 0 }; + initiate_targetlimb_count+= if step.initiate_targetlimb { 1 } else { 0 }; + } + assert_eq!(extract_windows_sum, U256::N_BITS); + assert_eq!(drop_currentlimb_count, U256::N_BITS.div_ceil(source)); + assert_eq!(initiate_targetlimb_count, U256::N_BITS.div_ceil(target)); + } + } + + #[test] + fn test_transform_limbsize_u256_random_vals(){ + type U256 = BigIntImpl<256,29>; + let mut prng = ChaCha20Rng::seed_from_u64(1); + + for _ in 0..100{ + + // create a vector to store the inputs + let mut input_vals: Vec = Vec::new(); + + // generate random u32 for input + for i in 0..9{ + let input_val:u32 = prng.gen(); + // ensure that the initial bits are zero as needed + if i == 0{ + input_vals.push(input_val >> 8); + }else{ + input_vals.push(input_val >> 3); + } + } + + // generate random source and target limbsizes + let source = prng.gen_range(1..=31); + let target = prng.gen_range(1..=31); + + let script = script!( + + // insert the values + for val in input_vals.clone(){ + {val} + } + + // do random transforms + {U256::transform_limbsize(29,source)} + {U256::transform_limbsize(source,target)} + {U256::transform_limbsize(target,29)} + + // verify that the transformation and its inverse leaves the input unchanged + for val in input_vals.iter().rev(){ + {*val} + OP_EQUALVERIFY + } + OP_TRUE + ); + let res = crate::execute_script(script.clone()); + assert!(res.success); + } + } +} diff --git a/src/bigint/sub.rs b/bitvm/src/bigint/sub.rs similarity index 90% rename from src/bigint/sub.rs rename to bitvm/src/bigint/sub.rs index 9daf336ee..537632aa2 100644 --- a/src/bigint/sub.rs +++ b/bitvm/src/bigint/sub.rs @@ -94,8 +94,7 @@ mod test { { U254::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); let script = script! { { U254::push_u32_le(&b.to_u32_digits()) } @@ -105,8 +104,7 @@ mod test { { U254::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } for _ in 0..100 { @@ -123,8 +121,7 @@ mod test { { U64::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); let script = script! { { U64::push_u32_le(&b.to_u32_digits()) } @@ -134,8 +131,7 @@ mod test { { U64::equalverify(1, 0) } OP_TRUE }; - let exec_result = execute_script(script); - assert!(exec_result.success); + run(script); } } } diff --git a/src/bn254/ell_coeffs.rs b/bitvm/src/bn254/ell_coeffs.rs similarity index 51% rename from src/bn254/ell_coeffs.rs rename to bitvm/src/bn254/ell_coeffs.rs index fadbbe215..5c1631695 100644 --- a/src/bn254/ell_coeffs.rs +++ b/bitvm/src/bn254/ell_coeffs.rs @@ -2,12 +2,16 @@ // Cannot directly obtain G2 because of visibility use ark_ec::bn::g2::G2Prepared as ark_G2Prepared; +use ark_bn254::Config; use ark_ec::bn::{BnConfig, TwistType}; +use ark_ec::pairing::{MillerLoopOutput, Pairing, PairingOutput}; use ark_ec::short_weierstrass::Affine; use ark_ec::short_weierstrass::SWCurveConfig; use ark_ec::{AffineRepr, CurveGroup}; -use ark_ff::AdditiveGroup; use ark_ff::Field; +use ark_ff::{AdditiveGroup, CyclotomicMultSubgroup}; +use ark_std::cfg_chunks_mut; +use itertools::Itertools; use num_traits::One; pub type G2Affine

= Affine<

::G2Config>; @@ -35,43 +39,43 @@ impl G2HomProjective { // Formula for line function when working with // homogeneous projective coordinates. - let mut a = self.x * &self.y; + let mut a = self.x * self.y; a.mul_assign_by_fp(two_inv); let b = self.y.square(); let c = self.z.square(); - let e = ark_bn254::g2::Config::COEFF_B * &(c.double() + &c); - let f = e.double() + &e; - let mut g = b + &f; + let e = ark_bn254::g2::Config::COEFF_B * (c.double() + c); + let f = e.double() + e; + let mut g = b + f; g.mul_assign_by_fp(two_inv); - let h = (self.y + &self.z).square() - &(b + &c); - let i = e - &b; + let h = (self.y + self.z).square() - (b + c); + let i = e - b; let j = self.x.square(); let e_square = e.square(); - self.x = a * &(b - &f); - self.y = g.square() - &(e_square.double() + &e_square); - self.z = b * &h; + self.x = a * (b - f); + self.y = g.square() - (e_square.double() + e_square); + self.z = b * h; match ark_bn254::Config::TWIST_TYPE { - TwistType::M => (i, j.double() + &j, -h), - TwistType::D => (-h, j.double() + &j, i), + TwistType::M => (i, j.double() + j, -h), + TwistType::D => (-h, j.double() + j, i), } } fn add_in_place(&mut self, q: &ark_bn254::G2Affine) -> EllCoeff { // Formula for line function when working with // homogeneous projective coordinates. - let theta = self.y - &(q.y * &self.z); - let lambda = self.x - &(q.x * &self.z); + let theta = self.y - (q.y * self.z); + let lambda = self.x - (q.x * self.z); let c = theta.square(); let d = lambda.square(); - let e = lambda * &d; - let f = self.z * &c; - let g = self.x * &d; - let h = e + &f - &g.double(); - self.x = lambda * &h; - self.y = theta * &(g - &h) - &(e * &self.y); - self.z *= &e; - let j = theta * &q.x - &(lambda * &q.y); + let e = lambda * d; + let f = self.z * c; + let g = self.x * d; + let h = e + f - g.double(); + self.x = lambda * h; + self.y = theta * (g - h) - (e * self.y); + self.z *= e; + let j = theta * q.x - (lambda * q.y); match ark_bn254::Config::TWIST_TYPE { TwistType::M => (j, -theta, lambda), @@ -96,7 +100,7 @@ impl G2Prepared { // intercept: bias = y - alpha * x let mut alpha = t.x.square(); alpha /= t.y; - alpha.mul_assign_by_fp(&three_div_two); + alpha.mul_assign_by_fp(three_div_two); let bias = t.y - alpha * t.x; // update T @@ -125,6 +129,7 @@ impl G2Prepared { (ark_bn254::Fq2::ONE, alpha, -bias) } + /// !!! this method cannot be used directly for users, so we need reuse the `from` trait already exists pub fn from_affine(q: ark_bn254::G2Affine) -> Self { if q.infinity { G2Prepared { @@ -136,7 +141,7 @@ impl G2Prepared { let three_div_two = (ark_bn254::Fq::one().double() + ark_bn254::Fq::one()) * two_inv; let mut ell_coeffs = vec![]; - let mut r = q.clone(); + let mut r = q; let neg_q = -q; @@ -179,38 +184,7 @@ impl From for G2Prepared { infinity: true, } } else { - let two_inv = ark_bn254::Fq::one().double().inverse().unwrap(); - let mut ell_coeffs = vec![]; - let mut r = G2HomProjective { - x: q.x, - y: q.y, - z: ark_bn254::Fq2::one(), - }; - - let neg_q = -q; - - for bit in ark_bn254::Config::ATE_LOOP_COUNT.iter().rev().skip(1) { - ell_coeffs.push(r.double_in_place(&two_inv)); - - match bit { - 1 => ell_coeffs.push(r.add_in_place(&q)), - -1 => ell_coeffs.push(r.add_in_place(&neg_q)), - _ => continue, - } - } - - let q1 = mul_by_char(q); - let mut q2 = mul_by_char(q1); - - q2.y = -q2.y; - - ell_coeffs.push(r.add_in_place(&q1)); - ell_coeffs.push(r.add_in_place(&q2)); - - Self { - ell_coeffs, - infinity: false, - } + Self::from_affine(q) } } } @@ -258,6 +232,10 @@ impl<'a> From<&'a ark_G2Prepared> for G2Prepared { } } +impl G2Prepared { + pub fn is_zero(&self) -> bool { self.infinity } +} + pub fn mul_by_char(r: ark_bn254::G2Affine) -> ark_bn254::G2Affine { // multiply by field characteristic @@ -270,8 +248,147 @@ pub fn mul_by_char(r: ark_bn254::G2Affine) -> ark_bn254::G2Affine { s } +// Define the AffinePairing trait for our affine mode operations +pub trait AffinePairing { + /// Computes the product of Miller loops for some number of (G1, G2) pairs, where the line functions are in affine mode + fn multi_miller_loop_affine( + &self, + a: impl IntoIterator>>, + b: impl IntoIterator>, + ) -> MillerLoopOutput; + + /// Performs multiple pairing operations, where the line functions are in affine mode + fn multi_pairing_affine( + &self, + a: impl IntoIterator>>, + b: impl IntoIterator>, + ) -> PairingOutput; + + /// Performs a single pairing operation, where the line functions are in affine mode + fn pairing_affine( + &self, + p: impl Into>, + q: impl Into, + ) -> PairingOutput; +} + +// Create a struct to implement AffinePairing +pub struct BnAffinePairing; + +// Helper function to perform line function evaluation in affine coordinates +fn ell_affine( + f: &mut ark_bn254::Fq12, + coeffs: &EllCoeff, + xx: &ark_bn254::Fq, + yy: &ark_bn254::Fq, +) { + // c0 is a trivial value 1 + let c0 = coeffs.0; + let mut c1 = coeffs.1; + let mut c2 = coeffs.2; + + match Config::TWIST_TYPE { + TwistType::M => { + c1.mul_assign_by_fp(xx); + c2.mul_assign_by_fp(yy); + f.mul_by_014(&c0, &c1, &c2); + }, + // line evaluation is y' * f_Q(P), coefficients are (1, x' * lambda, -y' * bias) + TwistType::D => { + c1.mul_assign_by_fp(xx); + c2.mul_assign_by_fp(yy); + f.mul_by_034(&c0, &c1, &(c2)); + }, + } +} + +impl AffinePairing for BnAffinePairing { + fn multi_miller_loop_affine( + &self, + a: impl IntoIterator>>, + b: impl IntoIterator>, + ) -> MillerLoopOutput { + let mut pairs = a + .into_iter() + .zip_eq(b) + .filter_map(|(p, q)| { + // if input q is projective coordinates, then we will enter `into` computing pairing mode + // otherwise if input q is affine coordinates, then we will enter `into` verifying pairing mode + let (p, q) = (p.into(), q.into()); + match !p.is_zero() && !q.is_zero() { + true => Some(( + -p.0.x / p.0.y, + p.0.y.inverse().unwrap(), + q.ell_coeffs.into_iter(), + )), + false => None, + } + }) + .collect::>(); + + let mut f = cfg_chunks_mut!(pairs, 4) + .map(|pairs| { + let mut f = ark_bn254::Fq12::one(); + for i in (1..Config::ATE_LOOP_COUNT.len()).rev() { + if i != Config::ATE_LOOP_COUNT.len() - 1 { + f.square_in_place(); + } + + for (coeff_1, coeff_2, coeffs) in pairs.iter_mut() { + ell_affine(&mut f, &coeffs.next().unwrap(), coeff_1, coeff_2); + } + + let bit = Config::ATE_LOOP_COUNT[i - 1]; + if bit == 1 || bit == -1 { + for (coeff_1, coeff_2, coeffs) in pairs.iter_mut() { + ell_affine( + &mut f, + &coeffs.next().unwrap(), + coeff_1, + coeff_2, + ); + } + } + } + f + }) + .product::(); + + if Config::X_IS_NEGATIVE { + f.cyclotomic_inverse_in_place(); + } + + for (coeff_1, coeff_2, coeffs) in &mut pairs { + ell_affine(&mut f, &coeffs.next().unwrap(), coeff_1, coeff_2); + } + + for (coeff_1, coeff_2, coeffs) in &mut pairs { + ell_affine(&mut f, &coeffs.next().unwrap(), coeff_1, coeff_2); + } + + MillerLoopOutput(f) + } + + fn multi_pairing_affine( + &self, + a: impl IntoIterator>>, + b: impl IntoIterator>, + ) -> PairingOutput { + ark_bn254::Bn254::final_exponentiation(self.multi_miller_loop_affine(a, b)).unwrap() + } + + fn pairing_affine( + &self, + p: impl Into>, + q: impl Into, + ) -> PairingOutput { + self.multi_pairing_affine([p], [q]) + } +} + #[cfg(test)] mod tests { + use super::*; use ark_bn254::{Fq, Fq2}; use ark_ec::short_weierstrass::SWCurveConfig; @@ -293,9 +410,7 @@ mod tests { }; println!("1/2 = {:?}\n\n", two_inv.to_string()); - println!("COEFF_B = {}\n\n", ark_bn254::g2::Config::COEFF_B); - println!("before double line:"); println!("r.x = {:?}", r.x.to_string()); println!("r.y = {:?}", r.y.to_string()); @@ -311,4 +426,24 @@ mod tests { println!("s.1 = {:?}", s.1.to_string()); println!("s.2 = {:?}", s.2.to_string()); } + + #[test] + fn test_affine_vs_projective() { + let mut rng = test_rng(); + + // Generate random points + let g1 = ark_bn254::G1Projective::rand(&mut rng).into_affine(); + let g2 = ark_bn254::G2Projective::rand(&mut rng).into_affine(); + + // Compute pairing using standard method + let result1 = ark_bn254::Bn254::pairing(g1, g2); + + // Compute pairing using our affine method + let affine_pairing = BnAffinePairing; + let g2_prepared = G2Prepared::from_affine(g2); + let result2 = affine_pairing.pairing_affine(g1, g2_prepared); + + // Results should be equal + assert_eq!(result1, result2); + } } diff --git a/bitvm/src/bn254/fp254impl.rs b/bitvm/src/bn254/fp254impl.rs new file mode 100644 index 000000000..5a564c770 --- /dev/null +++ b/bitvm/src/bn254/fp254impl.rs @@ -0,0 +1,836 @@ +use crate::bigint::add::limb_add_carry; +use crate::bigint::sub::limb_sub_borrow; +use crate::bigint::U254; +use crate::bn254::fq::Fq; +use crate::bn254::utils::Hint; +use crate::treepp::*; +use ark_ff::PrimeField; +use bitcoin_script::script; +use num_bigint::{BigInt, BigUint}; +use num_traits::Num; +use std::str::FromStr; +use std::sync::OnceLock; + +#[allow(clippy::declare_interior_mutable_const)] +pub trait Fp254Impl { + const N_LIMBS: u32 = U254::N_LIMBS; + const N_BITS: u32 = U254::N_BITS; + + const MODULUS: &'static str; + const MODULUS_LIMBS: [u32; U254::N_LIMBS as usize]; + + const P_PLUS_ONE_DIV2: &'static str; + const TWO_P_PLUS_ONE_DIV3: &'static str; + const P_PLUS_TWO_DIV3: &'static str; + + const ADD_ONCELOCK: OnceLock