diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 832e55097..4fd437cf7 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -69,8 +69,13 @@ jobs: steps: - uses: actions/checkout@v3 - uses: rui314/setup-mold@v1 + - name: Install Protoc + uses: arduino/setup-protoc@v2 + with: + version: "23.2" + repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Install Rust - run: rustup show && rustup install nightly && rustup component add rustfmt --toolchain nightly-x86_64-unknown-linux-gnu # Nightly is needed for our configuration of cargo fmt + run: rustup show && rustup install nightly && rustup component add rustfmt --toolchain nightly-x86_64-unknown-linux-gnu # Nightly is needed for our configuration of cargo fmt - name: Install cargo-risc0 # Risc0 v0.17 and higher require a cargo extension to build the guest code run: cargo install cargo-risczero - name: Install risc0-zkvm toolchain # Use the risc0 cargo extension to install the risc0 std library for the current toolchain @@ -80,6 +85,9 @@ jobs: cache-provider: "buildjet" shared-key: cargo-check save-if: ${{ github.ref == 'refs/heads/nightly' }} + workspaces: | + . + fuzz - name: Run lint run: | if ! make lint ; then @@ -100,6 +108,11 @@ jobs: steps: - uses: actions/checkout@v3 - uses: rui314/setup-mold@v1 + - name: Install Protoc + uses: arduino/setup-protoc@v2 + with: + version: "23.2" + repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Install Rust run: rustup show - name: cargo install cargo-hack @@ -109,30 +122,59 @@ jobs: cache-provider: "buildjet" shared-key: cargo-check save-if: ${{ github.ref == 'refs/heads/nightly' }} + workspaces: | + . + fuzz # intentionally no target specifier; see https://github.com/jonhoo/rust-ci-conf/pull/4 - name: cargo hack run: make check-features - test: - name: test + nextest: + name: nextest runs-on: buildjet-4vcpu-ubuntu-2204 timeout-minutes: 60 steps: - uses: actions/checkout@v3 - uses: rui314/setup-mold@v1 + - name: Install Protoc + uses: arduino/setup-protoc@v2 + with: + version: "23.2" + repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Install Rust run: rustup show - # `cargo-nextest` is much faster than standard `cargo test`. - name: Install cargo-risc0 # Risc0 v0.17 and higher require a cargo extension to build the guest code run: cargo install cargo-risczero - name: Install risc0-zkvm toolchain # Use the risc0 cargo extension to install the risc0 std library for the current toolchain run: cargo risczero install + # `cargo-nextest` is much faster than standard `cargo test`. - uses: taiki-e/install-action@nextest - uses: Swatinem/rust-cache@v2 with: cache-provider: "buildjet" - shared-key: cargo-build save-if: ${{ github.ref == 'refs/heads/nightly' }} - run: cargo nextest run --workspace --all-features + test: + name: test + runs-on: buildjet-4vcpu-ubuntu-2204 + timeout-minutes: 60 + steps: + - uses: actions/checkout@v3 + - uses: rui314/setup-mold@v1 + - name: Install Protoc + uses: arduino/setup-protoc@v2 + with: + version: "23.2" + repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: Install Rust + run: rustup show + - name: Install cargo-risc0 # Risc0 v0.17 and higher require a cargo extension to build the guest code + run: cargo install cargo-risczero + - name: Install risc0-zkvm toolchain # Use the risc0 cargo extension to install the risc0 std library for the current toolchain + run: cargo risczero install + - uses: Swatinem/rust-cache@v2 + with: + cache-provider: "buildjet" + save-if: ${{ github.ref == 'refs/heads/nightly' }} # `cargo-nextest` does not support doctests (yet?), so we have to run them # separately. # TODO: https://github.com/nextest-rs/nextest/issues/16 @@ -146,6 +188,11 @@ jobs: with: submodules: true - uses: rui314/setup-mold@v1 + - name: Install Protoc + uses: arduino/setup-protoc@v2 + with: + version: "23.2" + repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Install Rust run: rustup show - name: Install cargo-risc0 # Risc0 v0.17 and higher require a cargo extension to build the guest code @@ -189,6 +236,11 @@ jobs: # `check` job does and their caches are shared, so it's best to keep # things as similar as possible. - uses: rui314/setup-mold@v1 + - name: Install Protoc + uses: arduino/setup-protoc@v2 + with: + version: "23.2" + repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Install Rust run: rustup show - uses: Swatinem/rust-cache@v2 @@ -249,6 +301,11 @@ jobs: steps: - uses: actions/checkout@v3 - uses: rui314/setup-mold@v1 + - name: Install Protoc + uses: arduino/setup-protoc@v2 + with: + version: "23.2" + repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Install Rust run: rustup show - name: Install cargo-risc0 # Risc0 v0.17 and higher require a cargo extension to build the guest code diff --git a/.gitignore b/.gitignore index c484edb21..183badd0d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,7 @@ fuzz/Cargo.lock demo_data/ /.vscode/* + +/docker/credentials/* +!/docker/credentials/bridge-0.addr +!/docker/credentials/bridge-0.key diff --git a/Cargo.lock b/Cargo.lock index 8d7dd54a4..13f865241 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,19 +23,28 @@ dependencies = [ "num-traits", ] +[[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli 0.27.3", +] + [[package]] name = "addr2line" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" dependencies = [ - "cpp_demangle", + "cpp_demangle 0.4.3", "fallible-iterator", "gimli 0.27.3", "memmap2", "object 0.31.1", "rustc-demangle", - "smallvec", + "smallvec 1.11.1", ] [[package]] @@ -59,7 +68,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -72,7 +81,7 @@ dependencies = [ "cipher 0.3.0", "cpufeatures", "ctr 0.8.0", - "opaque-debug", + "opaque-debug 0.3.0", ] [[package]] @@ -118,6 +127,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ "cfg-if", + "getrandom 0.2.10", "once_cell", "version_check", ] @@ -139,11 +149,11 @@ checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] name = "alloy-rlp" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f938f00332d63a5b0ac687bd6f46d03884638948921d9f8b50c59563d421ae25" +checksum = "cc0fac0fc16baf1f63f78b47c3d24718f3619b0714076f6a02957d808d52cbef" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", "bytes", "smol_str", ] @@ -169,11 +179,20 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anstream" -version = "0.5.0" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle", "anstyle-parse", @@ -185,15 +204,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" dependencies = [ "utf8parse", ] @@ -204,17 +223,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "anstyle-wincon" -version = "2.1.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -316,7 +335,7 @@ checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ "num-bigint 0.4.4", "num-traits", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -362,6 +381,39 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "array-bytes" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" + +[[package]] +name = "array-bytes" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b1c5a481ec30a5abd8dfbd94ab5cf1bb4e9a66be7f1b3b322f2f1170c200fd" + +[[package]] +name = "array-init" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23589ecb866b460d3a0f1278834750268c607e8e28a1b982c907219f3178cd72" +dependencies = [ + "nodrop", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "arrayvec" version = "0.7.4" @@ -413,7 +465,7 @@ version = "0.1.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -459,6 +511,17 @@ dependencies = [ "wildmatch", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + [[package]] name = "auto_impl" version = "1.1.0" @@ -466,7 +529,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" dependencies = [ "proc-macro-error", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -486,6 +549,29 @@ dependencies = [ "cc", ] +[[package]] +name = "avail-subxt" +version = "0.3.0" +source = "git+https://github.com/availproject/avail.git?tag=v1.6.3#b4feb4aef5af12931287247c73edb44fd8a72811" +dependencies = [ + "anyhow", + "curve25519-dalek 2.1.3", + "derive_more", + "futures", + "hex", + "jsonrpsee 0.16.3", + "num_enum 0.5.11", + "parity-scale-codec", + "scale-info", + "schnorrkel", + "serde", + "serde-hex", + "sp-core 24.0.0", + "structopt", + "subxt", + "tokio", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -501,12 +587,24 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + [[package]] name = "base16ct" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base58" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" + [[package]] name = "base64" version = "0.13.1" @@ -529,7 +627,7 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" name = "bashtestmd" version = "0.2.0" dependencies = [ - "clap", + "clap 4.4.6", "markdown", "shell-escape", ] @@ -599,7 +697,7 @@ dependencies = [ "lazycell", "peeking_take_while", "prettyplease", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "regex", "rustc-hash", @@ -621,7 +719,7 @@ dependencies = [ "log", "peeking_take_while", "prettyplease", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "regex", "rustc-hash", @@ -642,7 +740,7 @@ dependencies = [ "lazy_static", "lazycell", "peeking_take_while", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "regex", "rustc-hash", @@ -702,13 +800,36 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "blake2b_simd" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" +dependencies = [ + "arrayref", + "arrayvec 0.7.4", + "constant_time_eq 0.3.0", +] + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding 0.1.5", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + [[package]] name = "block-buffer" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -717,7 +838,16 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array", + "generic-array 0.14.7", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", ] [[package]] @@ -726,7 +856,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -743,23 +873,23 @@ dependencies = [ [[package]] name = "boa_ast" -version = "0.17.0" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c261398db3b2f9ba05f76872721d6a8a142d10ae6c0a58d3ddc5c2853cc02d" +checksum = "73498e9b2f0aa7db74977afa4d594657611e90587abf0dd564c0b55b4a130163" dependencies = [ "bitflags 2.4.0", "boa_interner", "boa_macros", - "indexmap 2.0.0", + "indexmap 2.0.2", "num-bigint 0.4.4", "rustc-hash", ] [[package]] name = "boa_engine" -version = "0.17.0" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31e7a37b855625f1615a07414fb341361475950e57bb9396afe1389bbc2ccdc" +checksum = "16377479d5d6d33896e7acdd1cc698d04a8f72004025bbbddf47558cd29146a6" dependencies = [ "bitflags 2.4.0", "boa_ast", @@ -773,7 +903,7 @@ dependencies = [ "dashmap", "fast-float", "icu_normalizer", - "indexmap 2.0.0", + "indexmap 2.0.2", "itertools 0.11.0", "num-bigint 0.4.4", "num-integer", @@ -796,9 +926,9 @@ dependencies = [ [[package]] name = "boa_gc" -version = "0.17.0" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2346f8ac7b736236de0608a7c75a9a32bac0a1137b98574cfebde6343e4ff6b7" +checksum = "c97b44beaef9d4452342d117d94607fdfa8d474280f1ba0fd97853834e3a49b2" dependencies = [ "boa_macros", "boa_profiler", @@ -807,28 +937,29 @@ dependencies = [ [[package]] name = "boa_icu_provider" -version = "0.17.0" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07652c6f1ca97bbe16bd2ab1ebc39313ac81568d2671aeb24a4a45964d2291a4" +checksum = "b30e52e34e451dd0bfc2c654a9a43ed34b0073dbd4ae3394b40313edda8627aa" dependencies = [ "icu_collections", "icu_normalizer", "icu_properties", "icu_provider", + "icu_provider_adapters", + "icu_provider_blob", "once_cell", - "zerovec", ] [[package]] name = "boa_interner" -version = "0.17.0" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b968bd467737cace9723a5d01a3d32fe95471526d36db9654a1779c4b766fb6" +checksum = "f3e5afa991908cfbe79bd3109b824e473a1dc5f74f31fab91bb44c9e245daa77" dependencies = [ "boa_gc", "boa_macros", - "hashbrown 0.14.0", - "indexmap 2.0.0", + "hashbrown 0.14.1", + "indexmap 2.0.2", "once_cell", "phf", "rustc-hash", @@ -837,11 +968,11 @@ dependencies = [ [[package]] name = "boa_macros" -version = "0.17.0" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3de43b7806061fccfba716fef51eea462d636de36803b62d10f902608ffef4" +checksum = "005fa0c5bd20805466dda55eb34cd709bb31a2592bb26927b47714eeed6914d8" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", "synstructure 0.13.0", @@ -849,9 +980,9 @@ dependencies = [ [[package]] name = "boa_parser" -version = "0.17.0" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ff1108bda6d573049191b6452490844c5ba4b12f7bdcc512a33e5c3f5037196" +checksum = "9e09afb035377a9044443b598187a7d34cd13164617182a4d7c348522ee3f052" dependencies = [ "bitflags 2.4.0", "boa_ast", @@ -860,19 +991,23 @@ dependencies = [ "boa_macros", "boa_profiler", "fast-float", + "icu_locid", "icu_properties", + "icu_provider", + "icu_provider_macros", "num-bigint 0.4.4", "num-traits", "once_cell", "regress", "rustc-hash", + "tinystr", ] [[package]] name = "boa_profiler" -version = "0.17.0" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a24f6aa1ecc56e797506437b1f9a172e4a5f207894e74196c682cb656d2c2d60" +checksum = "3190f92dfe48224adc92881c620f08ccf37ff62b91a094bb357fe53bd5e84647" [[package]] name = "bonsai-sdk" @@ -905,7 +1040,7 @@ dependencies = [ "borsh-derive-internal", "borsh-schema-derive-internal", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "syn 1.0.109", ] @@ -915,7 +1050,7 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -926,29 +1061,37 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] [[package]] -name = "bs58" -version = "0.5.0" +name = "bounded-collections" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +checksum = "eb5b05133427c07c4776906f673ccf36c21b102c9829c641a5b56bd151d44fd6" dependencies = [ - "sha2 0.10.7", - "tinyvec", + "log", + "parity-scale-codec", + "scale-info", + "serde", ] [[package]] -name = "bstr" -version = "1.6.2" +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bs58" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2f7349907b712260e64b0afe2f84692af14a454be26187d9df565c7f69266a" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" dependencies = [ - "memchr", - "serde", + "sha2 0.10.8", + "tinyvec", ] [[package]] @@ -963,6 +1106,12 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + [[package]] name = "bytemuck" version = "1.14.0" @@ -978,16 +1127,16 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" @@ -1036,7 +1185,7 @@ dependencies = [ [[package]] name = "c-kzg" version = "0.1.0" -source = "git+https://github.com/ethereum/c-kzg-4844#fbef59a3f9e8fa998bdb5069d212daf83d586aa5" +source = "git+https://github.com/ethereum/c-kzg-4844#b2e41491ad1859f1792964a2432a419b64dc6fb2" dependencies = [ "bindgen 0.66.1", "blst", @@ -1072,7 +1221,7 @@ checksum = "e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592" dependencies = [ "camino", "cargo-platform", - "semver 1.0.18", + "semver 1.0.19", "serde", "serde_json", "thiserror", @@ -1094,6 +1243,56 @@ dependencies = [ "libc", ] +[[package]] +name = "celestia-proto" +version = "0.1.0" +source = "git+https://github.com/eigerco/celestia-node-rs.git?rev=dfe8f2f#dfe8f2f20737d9a6556e43e4dfefd63c4824f936" +dependencies = [ + "anyhow", + "prost 0.12.1", + "prost-build", + "prost-types 0.12.1", + "serde", + "tendermint-proto 0.32.0", +] + +[[package]] +name = "celestia-rpc" +version = "0.1.0" +source = "git+https://github.com/eigerco/celestia-node-rs.git?rev=dfe8f2f#dfe8f2f20737d9a6556e43e4dfefd63c4824f936" +dependencies = [ + "celestia-types", + "http", + "jsonrpsee 0.20.1", + "serde", + "thiserror", + "tracing", +] + +[[package]] +name = "celestia-types" +version = "0.1.0" +source = "git+https://github.com/eigerco/celestia-node-rs.git?rev=dfe8f2f#dfe8f2f20737d9a6556e43e4dfefd63c4824f936" +dependencies = [ + "base64 0.21.4", + "bech32", + "bytes", + "celestia-proto", + "cid", + "const_format", + "enum_dispatch", + "libp2p-identity", + "multiaddr", + "nmt-rs", + "ruint", + "serde", + "serde_repr", + "sha2 0.10.8", + "tendermint 0.32.0", + "tendermint-proto 0.32.0", + "thiserror", +] + [[package]] name = "cexpr" version = "0.6.0" @@ -1121,7 +1320,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -1151,13 +1350,26 @@ dependencies = [ "half", ] +[[package]] +name = "cid" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd94671561e36e4e7de75f753f577edafb0e7c05d6e4547229fdf7938fbcd2c3" +dependencies = [ + "core2", + "multibase", + "multihash 0.18.1", + "serde", + "unsigned-varint", +] + [[package]] name = "cipher" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -1183,9 +1395,24 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.4" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim 0.8.0", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "4.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d7b8d5ec32af0fadc644bf1fd509a688c2103b185644bb1e29d164e0703136" +checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" dependencies = [ "clap_builder", "clap_derive", @@ -1193,9 +1420,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.4" +version = "4.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5179bb514e4d7c2051749d8fcefa2ed6d06a9f4e6d69faf3805f5d80b8cf8d56" +checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" dependencies = [ "anstream", "anstyle", @@ -1209,8 +1436,8 @@ version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" dependencies = [ - "heck", - "proc-macro2 1.0.67", + "heck 0.4.1", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -1234,7 +1461,7 @@ source = "git+https://github.com/paradigmxyz/reth?rev=e83d3aa#e83d3aa704f87825ca dependencies = [ "convert_case 0.6.0", "parity-scale-codec", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "serde", "syn 2.0.37", @@ -1246,13 +1473,13 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" dependencies = [ - "bs58", + "bs58 0.5.0", "coins-core", "digest 0.10.7", - "hmac", + "hmac 0.12.1", "k256", "serde", - "sha2 0.10.7", + "sha2 0.10.8", "thiserror", ] @@ -1264,11 +1491,11 @@ checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ "bitvec", "coins-bip32", - "hmac", + "hmac 0.12.1", "once_cell", "pbkdf2 0.12.2", "rand 0.8.5", - "sha2 0.10.7", + "sha2 0.10.8", "thiserror", ] @@ -1280,14 +1507,14 @@ checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" dependencies = [ "base64 0.21.4", "bech32", - "bs58", + "bs58 0.5.0", "digest 0.10.7", - "generic-array", + "generic-array 0.14.7", "hex", "ripemd", "serde", "serde_derive", - "sha2 0.10.7", + "sha2 0.10.8", "sha3", "thiserror", ] @@ -1300,18 +1527,18 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "concurrent-queue" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" dependencies = [ "crossbeam-utils", ] [[package]] name = "const-hex" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa72a10d0e914cad6bcad4e7409e68d230c1c2db67896e19a37f758b1fcbdab5" +checksum = "c37be52ef5e3b394db27a2341010685ad5103c72ac15ce2e9420a7e8f93f342c" dependencies = [ "cfg-if", "cpufeatures", @@ -1329,12 +1556,38 @@ checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" name = "const-rollup-config" version = "0.2.0" +[[package]] +name = "const_format" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c990efc7a285731f9a4378d81aff2f0e85a2c8781a05ef0f8baa8dac54d0ff48" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e026b6ce194a874cb9cf32cd5772d1ef9767cc8fcb5765948d74f37a9d8b2bf6" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "unicode-xid 0.2.4", +] + [[package]] name = "constant_time_eq" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + [[package]] name = "convert_case" version = "0.4.0" @@ -1366,6 +1619,24 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpp_demangle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +dependencies = [ + "cfg-if", +] + [[package]] name = "cpp_demangle" version = "0.4.3" @@ -1384,6 +1655,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cranelift-entity" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40099d38061b37e505e63f89bab52199037a72b931ad4868d9089ff7268660b0" +dependencies = [ + "serde", +] + [[package]] name = "crc" version = "3.0.1" @@ -1417,7 +1697,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap", + "clap 4.4.6", "criterion-plot", "is-terminal", "itertools 0.10.5", @@ -1470,7 +1750,7 @@ dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset", + "memoffset 0.9.0", "scopeguard", ] @@ -1495,7 +1775,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" dependencies = [ - "generic-array", + "generic-array 0.14.7", "rand_core 0.6.4", "subtle", "zeroize", @@ -1507,15 +1787,35 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array", + "generic-array 0.14.7", "typenum", ] +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array 0.14.7", + "subtle", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array 0.14.7", + "subtle", +] + [[package]] name = "csv" -version = "1.2.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626ae34994d3d8d668f4269922248239db4ae42d538b14c398b74a52208e8086" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" dependencies = [ "csv-core", "itoa", @@ -1525,9 +1825,9 @@ dependencies = [ [[package]] name = "csv-core" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" dependencies = [ "memchr", ] @@ -1552,33 +1852,59 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.0" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622178105f911d937a42cdb140730ba4a3ed2becd8ae6ce39c7d28b5d75d4588" +checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "platforms", - "rustc_version 0.4.0", + "byteorder", + "digest 0.8.1", + "rand_core 0.5.1", "subtle", "zeroize", ] [[package]] -name = "curve25519-dalek-derive" -version = "0.1.0" +name = "curve25519-dalek" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" dependencies = [ - "proc-macro2 1.0.67", - "quote 1.0.33", - "syn 2.0.37", -] - -[[package]] + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "platforms", + "rustc_version 0.4.0", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.37", +] + +[[package]] name = "curve25519-dalek-ng" version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1601,6 +1927,16 @@ dependencies = [ "darling_macro 0.10.2", ] +[[package]] +name = "darling" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +dependencies = [ + "darling_core 0.14.4", + "darling_macro 0.14.4", +] + [[package]] name = "darling" version = "0.20.3" @@ -1619,12 +1955,26 @@ checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "strsim 0.9.3", "syn 1.0.109", ] +[[package]] +name = "darling_core" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2 1.0.69", + "quote 1.0.33", + "strsim 0.10.0", + "syn 1.0.109", +] + [[package]] name = "darling_core" version = "0.20.3" @@ -1633,7 +1983,7 @@ checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "strsim 0.10.0", "syn 2.0.37", @@ -1650,6 +2000,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "darling_macro" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +dependencies = [ + "darling_core 0.14.4", + "quote 1.0.33", + "syn 1.0.109", +] + [[package]] name = "darling_macro" version = "0.20.3" @@ -1668,7 +2029,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.0", + "hashbrown 0.14.1", "lock_api", "once_cell", "parking_lot_core 0.9.8", @@ -1680,6 +2041,26 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +[[package]] +name = "data-encoding-macro" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c904b33cc60130e1aeea4956ab803d08a3f4a0ca82d64ed757afac3891f2bb99" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fdf3fce3ce863539ec1d7fd1b6dcc3c645663376b43ed376bbf887733e4f772" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] + [[package]] name = "deadpool" version = "0.9.5" @@ -1695,9 +2076,9 @@ dependencies = [ [[package]] name = "deadpool-runtime" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa37046cc0f6c3cc6090fbdbf73ef0b8ef4cfcc37f6befc0020f63e8cf121e1" +checksum = "63dfa964fe2a66f3fde91fc70b267fe193d822c7e603e2a675a49a7f46ad3f49" [[package]] name = "delay_map" @@ -1716,7 +2097,7 @@ dependencies = [ "anyhow", "hex", "serde", - "sha2 0.10.7", + "sha2 0.10.8", "sov-rollup-interface", ] @@ -1726,14 +2107,15 @@ version = "0.2.0" dependencies = [ "anyhow", "borsh", - "clap", + "clap 4.4.6", "demo-stf", "hex", - "jsonrpsee", + "jsonrpsee 0.20.1", "rand 0.8.5", "reth-primitives", "serde", "serde_json", + "simple-nft-module", "sov-accounts", "sov-bank", "sov-blob-storage", @@ -1752,7 +2134,7 @@ dependencies = [ "sov-value-setter", "tempfile", "tokio", - "toml 0.8.0", + "toml 0.8.2", "tracing", ] @@ -1781,7 +2163,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -1792,7 +2174,7 @@ version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -1805,7 +2187,7 @@ checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" dependencies = [ "darling 0.10.2", "derive_builder_core", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -1817,7 +2199,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" dependencies = [ "darling 0.10.2", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -1829,7 +2211,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "convert_case 0.4.0", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "rustc_version 0.4.0", "syn 1.0.109", @@ -1847,13 +2229,22 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + [[package]] name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -1905,7 +2296,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1926,7 +2317,7 @@ source = "git+https://github.com/sigp/discv5?rev=d2e30e04ee62418b9e57278cee907c0 dependencies = [ "aes 0.7.5", "aes-gcm", - "arrayvec", + "arrayvec 0.7.4", "delay_map", "enr", "fnv", @@ -1940,11 +2331,11 @@ dependencies = [ "parking_lot 0.11.2", "rand 0.8.5", "rlp", - "smallvec", + "smallvec 1.11.1", "socket2 0.4.9", "tokio", "tracing", - "tracing-subscriber", + "tracing-subscriber 0.3.17", "uint", "zeroize", ] @@ -1955,7 +2346,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -1984,6 +2375,27 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +[[package]] +name = "dyn-clonable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +dependencies = [ + "dyn-clonable-impl", + "dyn-clone", +] + +[[package]] +name = "dyn-clonable-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + [[package]] name = "dyn-clone" version = "1.0.14" @@ -2000,10 +2412,19 @@ dependencies = [ "digest 0.10.7", "elliptic-curve", "rfc6979", - "signature", + "signature 2.1.0", "spki", ] +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature 1.6.4", +] + [[package]] name = "ed25519" version = "2.2.2" @@ -2012,7 +2433,7 @@ checksum = "60f6d271ca33075c88028be6f04d502853d63a5ece419d269c15315d4fc1cf1d" dependencies = [ "pkcs8", "serde", - "signature", + "signature 2.1.0", ] [[package]] @@ -2028,17 +2449,43 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek 3.2.0", + "ed25519 1.5.3", + "sha2 0.9.9", + "zeroize", +] + [[package]] name = "ed25519-dalek" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" dependencies = [ - "curve25519-dalek", - "ed25519", + "curve25519-dalek 4.1.1", + "ed25519 2.2.2", "rand_core 0.6.4", "serde", - "sha2 0.10.7", + "sha2 0.10.8", + "zeroize", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek 3.2.0", + "hashbrown 0.12.3", + "hex", + "rand_core 0.6.4", + "sha2 0.9.9", "zeroize", ] @@ -2049,7 +2496,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" dependencies = [ "enum-ordinalize", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -2068,15 +2515,15 @@ checksum = "e2b183d6ce6ca4cf30e3db37abf5b52568b5f9015c97d9fbdd7026aa5dcdd758" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" dependencies = [ "base16ct", "crypto-bigint", "digest 0.10.7", "ff", - "generic-array", + "generic-array 0.14.7", "group", "pkcs8", "rand_core 0.6.4", @@ -2085,6 +2532,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + [[package]] name = "ena" version = "0.14.2" @@ -2123,13 +2576,13 @@ checksum = "fe81b5c06ecfdbc71dd845216f225f53b62a10cb8a16c946836a3467f701d05b" dependencies = [ "base64 0.21.4", "bytes", - "ed25519-dalek", + "ed25519-dalek 2.0.0", "hex", "k256", "log", "rand 0.8.5", "rlp", - "secp256k1", + "secp256k1 0.27.0", "serde", "sha3", "zeroize", @@ -2141,21 +2594,33 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "570d109b813e904becc80d8d5da38376818a143348413f7149f1340fe04754d4" dependencies = [ - "heck", - "proc-macro2 1.0.67", + "heck 0.4.1", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] [[package]] name = "enum-ordinalize" -version = "3.1.13" +version = "3.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4f76552f53cefc9a7f64987c3701b99d982f7690606fd67de1d09712fbf52f1" +checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" dependencies = [ "num-bigint 0.4.4", "num-traits", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.37", +] + +[[package]] +name = "enum_dispatch" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" +dependencies = [ + "once_cell", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -2166,7 +2631,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2ad8cef1d801a4686bfd8919f0b30eac4c8e48968c437a6405ded4fb5272d2b" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -2184,6 +2649,12 @@ dependencies = [ "termcolor", ] +[[package]] +name = "environmental" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" + [[package]] name = "equivalent" version = "1.0.1" @@ -2201,13 +2672,13 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" +checksum = "add4f07d43996f76ef320709726a556a9d4f965d9410d8d0271132d2f8293480" dependencies = [ "errno-dragonfly", "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2230,13 +2701,13 @@ dependencies = [ "ctr 0.9.2", "digest 0.10.7", "hex", - "hmac", + "hmac 0.12.1", "pbkdf2 0.11.0", "rand 0.8.5", "scrypt", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "sha3", "thiserror", "uuid", @@ -2350,7 +2821,7 @@ dependencies = [ "ethers-etherscan", "eyre", "prettyplease", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "regex", "reqwest", @@ -2371,7 +2842,7 @@ dependencies = [ "const-hex", "ethers-contract-abigen", "ethers-core", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "serde_json", "syn 2.0.37", @@ -2383,14 +2854,14 @@ version = "2.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0a17f0708692024db9956b31d7a20163607d2745953f5ae8125ab368ba280ad" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", "bytes", "cargo_metadata", "chrono", "const-hex", "elliptic-curve", "ethabi", - "generic-array", + "generic-array 0.14.7", "k256", "num_enum 0.7.0", "once_cell", @@ -2399,7 +2870,7 @@ dependencies = [ "rlp", "serde", "serde_json", - "strum", + "strum 0.25.0", "syn 2.0.37", "tempfile", "thiserror", @@ -2415,7 +2886,7 @@ checksum = "0e53451ea4a8128fbce33966da71132cf9e1040dcfd2a2084fd7733ada7b2045" dependencies = [ "ethers-core", "reqwest", - "semver 1.0.18", + "semver 1.0.19", "serde", "serde_json", "thiserror", @@ -2500,7 +2971,7 @@ dependencies = [ "eth-keystore", "ethers-core", "rand 0.8.5", - "sha2 0.10.7", + "sha2 0.10.8", "thiserror", "tracing", ] @@ -2524,7 +2995,7 @@ dependencies = [ "path-slash", "rayon", "regex", - "semver 1.0.18", + "semver 1.0.19", "serde", "serde_json", "solang-parser", @@ -2553,6 +3024,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -2576,9 +3053,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fastrlp" @@ -2586,7 +3063,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", "auto_impl", "bytes", ] @@ -2615,7 +3092,7 @@ dependencies = [ "num-bigint 0.3.3", "num-integer", "num-traits", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -2700,6 +3177,18 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "frame-metadata" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" +dependencies = [ + "cfg-if", + "parity-scale-codec", + "scale-info", + "serde", +] + [[package]] name = "fs2" version = "0.4.3" @@ -2756,6 +3245,7 @@ dependencies = [ "futures-core", "futures-task", "futures-util", + "num_cpus", ] [[package]] @@ -2795,7 +3285,7 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -2849,6 +3339,15 @@ dependencies = [ "byteorder", ] +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -2878,8 +3377,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -2888,7 +3389,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" dependencies = [ - "opaque-debug", + "opaque-debug 0.3.0", "polyval", ] @@ -2899,6 +3400,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" dependencies = [ "fallible-iterator", + "indexmap 1.9.3", "stable_deref_trait", ] @@ -2915,28 +3417,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] -name = "globset" -version = "0.4.13" +name = "gloo-net" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" +checksum = "9902a044653b26b99f7e3693a42f171312d9be8b26b5697bd1e43ad1f8a35e10" dependencies = [ - "aho-corasick", - "bstr", - "fnv", - "log", - "regex", + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils 0.1.7", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] name = "gloo-net" -version = "0.2.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9902a044653b26b99f7e3693a42f171312d9be8b26b5697bd1e43ad1f8a35e10" +checksum = "8ac9e8288ae2c632fa9f8657ac70bfe38a1530f345282d7ba66a1f70b72b7dc4" dependencies = [ "futures-channel", "futures-core", "futures-sink", - "gloo-utils", + "gloo-utils 0.2.0", + "http", "js-sys", "pin-project", "serde", @@ -2972,6 +3482,19 @@ dependencies = [ "web-sys", ] +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "group" version = "0.13.0" @@ -3014,6 +3537,21 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" +[[package]] +name = "hash-db" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" + +[[package]] +name = "hash256-std-hasher" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" +dependencies = [ + "crunchy", +] + [[package]] name = "hash32" version = "0.2.1" @@ -3052,9 +3590,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" dependencies = [ "ahash 0.8.3", "allocator-api2", @@ -3093,12 +3631,30 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + [[package]] name = "hermit-abi" version = "0.3.3" @@ -3126,7 +3682,27 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" dependencies = [ - "hmac", + "hmac 0.12.1", +] + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac 0.8.0", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac 0.11.1", + "digest 0.9.0", ] [[package]] @@ -3138,13 +3714,24 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array 0.14.7", + "hmac 0.8.1", +] + [[package]] name = "home" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -3246,6 +3833,7 @@ dependencies = [ "rustls-native-certs", "tokio", "tokio-rustls", + "webpki-roots 0.23.1", ] [[package]] @@ -3311,7 +3899,7 @@ dependencies = [ "prost 0.11.9", "ripemd", "serde", - "sha2 0.10.7", + "sha2 0.10.8", "sha3", ] @@ -3322,6 +3910,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef8302d8dfd6044d3ddb3f807a5ef3d7bbca9a574959c6d6e4dc39aa7012d0d5" dependencies = [ "displaydoc", + "serde", "yoke", "zerofrom", "zerovec", @@ -3335,8 +3924,10 @@ checksum = "3003f85dccfc0e238ff567693248c59153a46f4e6125ba4020b973cef4d1d335" dependencies = [ "displaydoc", "litemap", + "serde", "tinystr", "writeable", + "zerovec", ] [[package]] @@ -3349,7 +3940,8 @@ dependencies = [ "icu_collections", "icu_properties", "icu_provider", - "smallvec", + "serde", + "smallvec 1.11.1", "utf16_iter", "utf8_iter", "write16", @@ -3365,6 +3957,7 @@ dependencies = [ "displaydoc", "icu_collections", "icu_provider", + "serde", "tinystr", "zerovec", ] @@ -3378,6 +3971,7 @@ dependencies = [ "displaydoc", "icu_locid", "icu_provider_macros", + "postcard", "serde", "stable_deref_trait", "writeable", @@ -3386,13 +3980,41 @@ dependencies = [ "zerovec", ] +[[package]] +name = "icu_provider_adapters" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ae1e2bd0c41728b77e7c46e9afdec5e2127d1eedacc684724667d50c126bd3" +dependencies = [ + "icu_locid", + "icu_provider", + "serde", + "tinystr", + "yoke", + "zerovec", +] + +[[package]] +name = "icu_provider_blob" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd364c9a01f791a4bc04a74cf2a1d01d9f6926a40fd5ae1c28004e1e70d8338b" +dependencies = [ + "icu_provider", + "postcard", + "serde", + "writeable", + "yoke", + "zerovec", +] + [[package]] name = "icu_provider_macros" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b728b9421e93eff1d9f8681101b78fa745e0748c95c655c83f337044a7e10" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -3474,7 +4096,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -3498,12 +4120,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.1", "serde", ] @@ -3529,8 +4151,8 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "block-padding", - "generic-array", + "block-padding 0.3.3", + "generic-array 0.14.7", ] [[package]] @@ -3542,6 +4164,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + [[package]] name = "integration-tests" version = "0.2.0" @@ -3566,6 +4197,17 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1be380c410bf0595e94992a648ea89db4dd3f3354ba54af206fd2a68cf5ac8e" +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.3", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "ipnet" version = "2.8.0" @@ -3578,9 +4220,9 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi", - "rustix", - "windows-sys", + "hermit-abi 0.3.3", + "rustix 0.38.15", + "windows-sys 0.48.0", ] [[package]] @@ -3623,7 +4265,7 @@ dependencies = [ "num-derive 0.3.3", "num-traits", "serde", - "sha2 0.10.7", + "sha2 0.10.8", "thiserror", "tracing", ] @@ -3648,32 +4290,52 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.18.2" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "367a292944c07385839818bb71c8d76611138e2dedb0677d035b8da21d29c78b" +dependencies = [ + "jsonrpsee-client-transport 0.16.3", + "jsonrpsee-core 0.16.3", + "jsonrpsee-http-client 0.16.3", + "jsonrpsee-proc-macros 0.16.3", + "jsonrpsee-types 0.16.3", + "jsonrpsee-wasm-client 0.16.3", + "jsonrpsee-ws-client 0.16.3", + "tracing", +] + +[[package]] +name = "jsonrpsee" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1822d18e4384a5e79d94dc9e4d1239cfa9fad24e55b44d2efeff5b394c9fece4" +checksum = "9ad9b31183a8bcbe843e32ca8554ad2936633548d95a7bb6a8e14c767dea6b05" dependencies = [ - "jsonrpsee-client-transport", - "jsonrpsee-core", - "jsonrpsee-http-client", - "jsonrpsee-proc-macros", + "jsonrpsee-client-transport 0.20.1", + "jsonrpsee-core 0.20.1", + "jsonrpsee-http-client 0.20.1", + "jsonrpsee-proc-macros 0.20.1", "jsonrpsee-server", - "jsonrpsee-types 0.18.2", - "jsonrpsee-wasm-client", - "jsonrpsee-ws-client", + "jsonrpsee-types 0.20.1", + "jsonrpsee-wasm-client 0.20.1", + "jsonrpsee-ws-client 0.20.1", + "tokio", "tracing", ] [[package]] name = "jsonrpsee-client-transport" -version = "0.18.2" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11aa5766d5c430b89cb26a99b88f3245eb91534be8126102cea9e45ee3891b22" +checksum = "c8b3815d9f5d5de348e5f162b316dc9cdf4548305ebb15b4eb9328e66cf27d7a" dependencies = [ + "anyhow", "futures-channel", + "futures-timer", "futures-util", - "gloo-net", + "gloo-net 0.2.6", "http", - "jsonrpsee-core", + "jsonrpsee-core 0.16.3", + "jsonrpsee-types 0.16.3", "pin-project", "rustls-native-certs", "soketto", @@ -3682,14 +4344,61 @@ dependencies = [ "tokio-rustls", "tokio-util", "tracing", - "webpki-roots 0.23.1", + "webpki-roots 0.25.2", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97f2743cad51cc86b0dbfe316309eeb87a9d96a3d7f4dd7a99767c4b5f065335" +dependencies = [ + "futures-channel", + "futures-util", + "gloo-net 0.4.0", + "http", + "jsonrpsee-core 0.20.1", + "pin-project", + "rustls-native-certs", + "soketto", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "url", + "webpki-roots 0.25.2", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5dde66c53d6dcdc8caea1874a45632ec0fcf5b437789f1e45766a1512ce803" +dependencies = [ + "anyhow", + "async-lock", + "async-trait", + "beef", + "futures-channel", + "futures-timer", + "futures-util", + "hyper", + "jsonrpsee-types 0.16.3", + "rustc-hash", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "wasm-bindgen-futures", ] [[package]] name = "jsonrpsee-core" -version = "0.18.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c6832a55f662b5a6ecc844db24b8b9c387453f923de863062c60ce33d62b81" +checksum = "35dc957af59ce98373bcdde0c1698060ca6c2d2e9ae357b459c7158b6df33330" dependencies = [ "anyhow", "async-lock", @@ -3697,9 +4406,8 @@ dependencies = [ "beef", "futures-timer", "futures-util", - "globset", "hyper", - "jsonrpsee-types 0.18.2", + "jsonrpsee-types 0.20.1", "parking_lot 0.12.1", "rand 0.8.5", "rustc-hash", @@ -3708,56 +4416,91 @@ dependencies = [ "soketto", "thiserror", "tokio", - "tokio-stream", "tracing", "wasm-bindgen-futures", ] [[package]] name = "jsonrpsee-http-client" -version = "0.18.2" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e5f9fabdd5d79344728521bb65e3106b49ec405a78b66fbff073b72b389fa43" +dependencies = [ + "async-trait", + "hyper", + "hyper-rustls", + "jsonrpsee-core 0.16.3", + "jsonrpsee-types 0.16.3", + "rustc-hash", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1705c65069729e3dccff6fd91ee431d5d31cabcf00ce68a62a2c6435ac713af9" +checksum = "0dd865d0072764cb937b0110a92b5f53e995f7101cb346beca03d93a2dea79de" dependencies = [ "async-trait", "hyper", "hyper-rustls", - "jsonrpsee-core", - "jsonrpsee-types 0.18.2", + "jsonrpsee-core 0.20.1", + "jsonrpsee-types 0.20.1", "serde", "serde_json", "thiserror", "tokio", "tower", "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44e8ab85614a08792b9bff6c8feee23be78c98d0182d4c622c05256ab553892a" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 1.1.3", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", ] [[package]] name = "jsonrpsee-proc-macros" -version = "0.18.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6027ac0b197ce9543097d02a290f550ce1d9432bf301524b013053c0b75cc94" +checksum = "cef91b1017a4edb63f65239381c18de39f88d0e0760ab626d806e196f7f51477" dependencies = [ - "heck", - "proc-macro-crate 1.3.1", - "proc-macro2 1.0.67", + "heck 0.4.1", + "proc-macro-crate 1.1.3", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] [[package]] name = "jsonrpsee-server" -version = "0.18.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f06661d1a6b6e5b85469dc9c29acfbb9b3bb613797a6fd10a3ebb8a70754057" +checksum = "24f4e2f3d223d810e363fb8b5616ec4c6254243ee7f452d05ac281cdc9cf76b2" dependencies = [ "futures-util", + "http", "hyper", - "jsonrpsee-core", - "jsonrpsee-types 0.18.2", + "jsonrpsee-core 0.20.1", + "jsonrpsee-types 0.20.1", + "route-recognizer", "serde", "serde_json", "soketto", + "thiserror", "tokio", "tokio-stream", "tokio-util", @@ -3767,9 +4510,9 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.18.2" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5bf6c75ce2a4217421154adfc65a24d2b46e77286e59bba5d9fa6544ccc8f4" +checksum = "245ba8e5aa633dd1c1e4fae72bce06e71f42d34c14a2767c6b4d173b57bee5e5" dependencies = [ "anyhow", "beef", @@ -3795,25 +4538,49 @@ dependencies = [ [[package]] name = "jsonrpsee-wasm-client" -version = "0.18.2" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5df77c8f625d36e4cfb583c5a674eccebe32403fcfe42f7ceff7fac9324dd" +dependencies = [ + "jsonrpsee-client-transport 0.16.3", + "jsonrpsee-core 0.16.3", + "jsonrpsee-types 0.16.3", +] + +[[package]] +name = "jsonrpsee-wasm-client" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "010306151579898dc1000bab239ef7a73a73f04cb8ef267ee28b9a000267e813" +dependencies = [ + "jsonrpsee-client-transport 0.20.1", + "jsonrpsee-core 0.20.1", + "jsonrpsee-types 0.20.1", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34e6ea7c6d862e60f8baebd946c037b70c6808a4e4e31e792a4029184e3ce13a" +checksum = "4e1b3975ed5d73f456478681a417128597acd6a2487855fdb7b4a3d4d195bf5e" dependencies = [ - "jsonrpsee-client-transport", - "jsonrpsee-core", - "jsonrpsee-types 0.18.2", + "http", + "jsonrpsee-client-transport 0.16.3", + "jsonrpsee-core 0.16.3", + "jsonrpsee-types 0.16.3", ] [[package]] name = "jsonrpsee-ws-client" -version = "0.18.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64b2589680ba1ad7863f279cd2d5083c1dc0a7c0ea959d22924553050f8ab9f" +checksum = "d88e35e9dfa89248ae3e92f689c1f0a190ce12d377eba7d2d08e5a7f6cc5694a" dependencies = [ "http", - "jsonrpsee-client-transport", - "jsonrpsee-core", - "jsonrpsee-types 0.18.2", + "jsonrpsee-client-transport 0.20.1", + "jsonrpsee-core 0.20.1", + "jsonrpsee-types 0.20.1", + "url", ] [[package]] @@ -3840,8 +4607,8 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2 0.10.7", - "signature", + "sha2 0.10.8", + "signature 2.1.0", ] [[package]] @@ -3898,7 +4665,7 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8edfc11b8f56ce85e207e62ea21557cfa09bb24a8f6b04ae181b086ff8611c22" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "regex", "syn 1.0.109", @@ -3941,6 +4708,22 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" +[[package]] +name = "libp2p-identity" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57bf6e730ec5e7022958da53ffb03b326e681b7316939012ae9b3c7449a812d4" +dependencies = [ + "bs58 0.5.0", + "hkdf", + "log", + "multihash 0.19.1", + "quick-protobuf", + "rand 0.8.5", + "sha2 0.10.8", + "thiserror", +] + [[package]] name = "librocksdb-sys" version = "0.11.0+8.1.1" @@ -3957,6 +4740,54 @@ dependencies = [ "zstd-sys", ] +[[package]] +name = "libsecp256k1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +dependencies = [ + "arrayref", + "base64 0.13.1", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.8.5", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core", +] + [[package]] name = "libz-sys" version = "1.1.12" @@ -3976,15 +4807,21 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.7" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + +[[package]] +name = "linux-raw-sys" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" +checksum = "3852614a3bd9ca9804678ba6be5e3b8ce76dfc902cae004e3e0c44051b6e88db" [[package]] name = "litemap" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a04a5b2b6f54acba899926491d0a6c59d98012938ca2ab5befb281c034e8f94" +checksum = "77a1a2647d5b7134127971a6de0d533c49de2159167e7f259c427195f87168a1" [[package]] name = "lock_api" @@ -4056,6 +4893,15 @@ dependencies = [ "libc", ] +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + [[package]] name = "markdown" version = "1.0.0-alpha.14" @@ -4065,6 +4911,15 @@ dependencies = [ "unicode-id", ] +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matchers" version = "0.1.0" @@ -4082,28 +4937,44 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "matrixmultiply" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" dependencies = [ "autocfg", "rawpointer", ] +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + [[package]] name = "md-5" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ + "cfg-if", "digest 0.10.7", ] [[package]] name = "memchr" -version = "2.6.3" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "memfd" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +dependencies = [ + "rustix 0.38.15", +] [[package]] name = "memmap2" @@ -4116,38 +4987,61 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.9.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" dependencies = [ "autocfg", ] [[package]] -name = "methods" -version = "0.2.0" +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ - "risc0-build", + "autocfg", ] [[package]] -name = "metrics" -version = "0.21.1" +name = "memory-db" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" +checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" dependencies = [ - "ahash 0.8.3", - "metrics-macros", - "portable-atomic", + "hash-db 0.16.0", ] [[package]] -name = "metrics-macros" -version = "0.7.0" +name = "merlin" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" +checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" dependencies = [ - "proc-macro2 1.0.67", + "byteorder", + "keccak", + "rand_core 0.5.1", + "zeroize", +] + +[[package]] +name = "metrics" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" +dependencies = [ + "ahash 0.8.3", + "metrics-macros", + "portable-atomic", +] + +[[package]] +name = "metrics-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" +dependencies = [ + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -4181,7 +5075,7 @@ checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -4206,7 +5100,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -4235,6 +5129,71 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" +[[package]] +name = "multiaddr" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92a651988b3ed3ad1bc8c87d016bb92f6f395b84ed1db9b926b32b1fc5a2c8b5" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "libp2p-identity", + "multibase", + "multihash 0.19.1", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd8a792c1694c6da4f68db0a9d707c72bd260994da179e6030a5dcee00bb815" +dependencies = [ + "core2", + "multihash-derive", + "unsigned-varint", +] + +[[package]] +name = "multihash" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" +dependencies = [ + "core2", + "unsigned-varint", +] + +[[package]] +name = "multihash-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" +dependencies = [ + "proc-macro-crate 1.1.3", + "proc-macro-error", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", + "synstructure 0.12.6", +] + [[package]] name = "multimap" version = "0.8.3" @@ -4279,39 +5238,38 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" -[[package]] -name = "nft-utils" -version = "0.2.0" -dependencies = [ - "borsh", - "demo-stf", - "sov-modules-api", - "sov-nft-module", - "sov-rollup-interface", - "sov-sequencer", - "tokio", -] - [[package]] name = "nibble_vec" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" dependencies = [ - "smallvec", + "smallvec 1.11.1", ] [[package]] name = "nmt-rs" version = "0.1.0" -source = "git+https://github.com/Sovereign-Labs/nmt-rs.git?rev=dd37588444fca72825d11fe4a46838f66525c49f#dd37588444fca72825d11fe4a46838f66525c49f" +source = "git+https://github.com/Sovereign-Labs/nmt-rs.git?rev=d821332#d821332baa03aea625d23060dc239af57b9121f5" dependencies = [ "borsh", "bytes", "serde", - "sha2 0.10.7", + "sha2 0.10.8", ] +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + [[package]] name = "nom" version = "7.1.3" @@ -4384,7 +5342,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -4395,11 +5353,21 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e6a0fd4f737c707bd9086cc16c925f294943eb62eb71499e9fd4cf71f8b9f4e" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec 0.7.4", + "itoa", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -4449,10 +5417,19 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.3", "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -4471,14 +5448,26 @@ dependencies = [ "num_enum_derive 0.7.0", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.1.3", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2 1.0.67", + "proc-macro-crate 1.1.3", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -4489,8 +5478,8 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ea360eafe1022f7cc56cd7b869ed57330fb2453d0c7831d99b74c65d2f5597" dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2 1.0.67", + "proc-macro-crate 1.1.3", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -4504,6 +5493,18 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.30.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" +dependencies = [ + "crc32fast", + "hashbrown 0.13.2", + "indexmap 1.9.3", + "memchr", +] + [[package]] name = "object" version = "0.31.1" @@ -4540,6 +5541,12 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + [[package]] name = "opaque-debug" version = "0.3.0" @@ -4552,7 +5559,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", "auto_impl", "bytes", "ethereum-types", @@ -4566,7 +5573,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" dependencies = [ "bytes", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -4592,7 +5599,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -4652,7 +5659,7 @@ version = "3.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", "bitvec", "byte-slice-cast", "bytes", @@ -4667,17 +5674,17 @@ version = "3.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2 1.0.67", + "proc-macro-crate 1.1.3", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] [[package]] name = "parking" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" +checksum = "e52c774a4c39359c1d1c52e43f73dd91a75a614652c825408eec30c95a9b2067" [[package]] name = "parking_lot" @@ -4710,7 +5717,7 @@ dependencies = [ "instant", "libc", "redox_syscall 0.2.16", - "smallvec", + "smallvec 1.11.1", "winapi", ] @@ -4723,8 +5730,8 @@ dependencies = [ "cfg-if", "libc", "redox_syscall 0.3.5", - "smallvec", - "windows-targets", + "smallvec 1.11.1", + "windows-targets 0.48.5", ] [[package]] @@ -4750,6 +5757,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" +[[package]] +name = "pbkdf2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +dependencies = [ + "crypto-mac 0.11.1", +] + [[package]] name = "pbkdf2" version = "0.11.0" @@ -4757,9 +5773,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ "digest 0.10.7", - "hmac", + "hmac 0.12.1", "password-hash", - "sha2 0.10.7", + "sha2 0.10.8", ] [[package]] @@ -4769,7 +5785,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", - "hmac", + "hmac 0.12.1", ] [[package]] @@ -4795,9 +5811,9 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.3" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a4d085fd991ac8d5b05a147b437791b4260b76326baf0fc60cf7c9c27ecd33" +checksum = "c022f1e7b65d6a24c0dbbd5fb344c66881bc01f3e5ae74a1c8100f2f985d98a4" dependencies = [ "memchr", "thiserror", @@ -4811,7 +5827,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.0.0", + "indexmap 2.0.2", ] [[package]] @@ -4852,7 +5868,7 @@ checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ "phf_generator", "phf_shared 0.11.2", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -4890,7 +5906,7 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -4980,7 +5996,7 @@ checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" dependencies = [ "cfg-if", "cpufeatures", - "opaque-debug", + "opaque-debug 0.3.0", "universal-hash", ] @@ -4992,11 +6008,12 @@ checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b" [[package]] name = "postcard" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d534c6e61df1c7166e636ca612d9820d486fe96ddad37f7abc671517b297488e" +checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" dependencies = [ "cobs", + "embedded-io", "heapless", "serde", ] @@ -5025,11 +6042,11 @@ dependencies = [ "byteorder", "bytes", "fallible-iterator", - "hmac", + "hmac 0.12.1", "md-5", "memchr", "rand 0.8.5", - "sha2 0.10.7", + "sha2 0.10.8", "stringprep", ] @@ -5062,7 +6079,7 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "syn 2.0.37", ] @@ -5105,12 +6122,12 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" dependencies = [ - "once_cell", - "toml_edit 0.19.15", + "thiserror", + "toml 0.5.11", ] [[package]] @@ -5120,7 +6137,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", "version_check", @@ -5132,7 +6149,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "version_check", ] @@ -5148,9 +6165,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] @@ -5186,19 +6203,19 @@ dependencies = [ [[package]] name = "proptest" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" +checksum = "7c003ac8c77cb07bb74f5f198bce836a689bcd5a42574612bf14d17bfd08c20e" dependencies = [ "bit-set", - "bitflags 1.3.2", - "byteorder", + "bit-vec", + "bitflags 2.4.0", "lazy_static", "num-traits", "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.6.29", + "regex-syntax 0.7.5", "rusty-fork", "tempfile", "unarray", @@ -5242,7 +6259,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bdf592881d821b83d471f8af290226c8d51402259e9bb5be7f9f8bdebbb11ac" dependencies = [ "bytes", - "heck", + "heck 0.4.1", "itertools 0.11.0", "log", "multimap", @@ -5265,7 +6282,7 @@ checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", "itertools 0.10.5", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -5278,7 +6295,7 @@ checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" dependencies = [ "anyhow", "itertools 0.11.0", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -5316,6 +6333,52 @@ dependencies = [ "autotools", ] +[[package]] +name = "provers" +version = "0.2.0" +dependencies = [ + "anyhow", + "bincode", + "borsh", + "const-rollup-config", + "demo-stf", + "env_logger", + "hex", + "jsonrpsee 0.20.1", + "log", + "log4rs", + "once_cell", + "parking_lot 0.12.1", + "prettytable-rs", + "regex", + "risc0", + "risc0-zkvm", + "serde", + "serde_json", + "sha2 0.10.8", + "sov-celestia-adapter", + "sov-demo-rollup", + "sov-modules-api", + "sov-risc0-adapter", + "sov-rollup-interface", + "sov-state", + "sov-stf-runner", + "sov-zk-cycle-macros", + "tempfile", + "tokio", + "tracing", + "tracing-subscriber 0.3.17", +] + +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + [[package]] name = "public-ip" version = "0.2.2" @@ -5343,6 +6406,15 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quick-protobuf" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" +dependencies = [ + "byteorder", +] + [[package]] name = "quote" version = "0.6.13" @@ -5358,7 +6430,7 @@ version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", ] [[package]] @@ -5512,15 +6584,35 @@ dependencies = [ "thiserror", ] +[[package]] +name = "ref-cast" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acde58d073e9c79da00f2b5b84eed919c8326832648a5b109b3fce1bb1175280" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.37", +] + [[package]] name = "regex" -version = "1.9.5" +version = "1.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" +checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.8", + "regex-automata 0.3.9", "regex-syntax 0.7.5", ] @@ -5535,9 +6627,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" +checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" dependencies = [ "aho-corasick", "memchr", @@ -5568,9 +6660,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.20" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ "base64 0.21.4", "bytes", @@ -5596,6 +6688,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", @@ -5669,7 +6762,7 @@ source = "git+https://github.com/paradigmxyz/reth?rev=e83d3aa#e83d3aa704f87825ca dependencies = [ "discv5", "enr", - "generic-array", + "generic-array 0.14.7", "hex", "parking_lot 0.12.1", "reth-net-common", @@ -5677,7 +6770,7 @@ dependencies = [ "reth-primitives", "reth-rlp", "reth-rlp-derive", - "secp256k1", + "secp256k1 0.27.0", "serde", "thiserror", "tokio", @@ -5691,22 +6784,22 @@ version = "0.1.0-alpha.8" source = "git+https://github.com/paradigmxyz/reth?rev=e83d3aa#e83d3aa704f87825ca8cab6f593ab4d4adbf6792" dependencies = [ "aes 0.8.3", - "block-padding", + "block-padding 0.3.3", "byteorder", "cipher 0.4.4", "ctr 0.9.2", "digest 0.10.7", "educe", "futures", - "generic-array", - "hmac", + "generic-array 0.14.7", + "hmac 0.12.1", "pin-project", "rand 0.8.5", "reth-net-common", "reth-primitives", "reth-rlp", - "secp256k1", - "sha2 0.10.7", + "secp256k1 0.27.0", + "sha2 0.10.8", "sha3", "thiserror", "tokio", @@ -5775,7 +6868,7 @@ dependencies = [ "bitflags 2.4.0", "byteorder", "derive_more", - "indexmap 2.0.0", + "indexmap 2.0.2", "libc", "parking_lot 0.12.1", "reth-mdbx-sys", @@ -5807,7 +6900,7 @@ version = "0.1.0-alpha.8" source = "git+https://github.com/paradigmxyz/reth?rev=e83d3aa#e83d3aa704f87825ca8cab6f593ab4d4adbf6792" dependencies = [ "once_cell", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "regex", "syn 2.0.37", @@ -5864,7 +6957,7 @@ dependencies = [ "derive_more", "ethers-core", "fixed-hash", - "hash-db", + "hash-db 0.15.2", "hex", "hex-literal", "impl-serde", @@ -5878,12 +6971,12 @@ dependencies = [ "reth-rlp-derive", "revm-primitives", "ruint", - "secp256k1", + "secp256k1 0.27.0", "serde", "serde_json", "serde_with", - "sha2 0.10.7", - "strum", + "sha2 0.10.8", + "strum 0.25.0", "sucds", "tempfile", "thiserror", @@ -5938,7 +7031,7 @@ source = "git+https://github.com/paradigmxyz/reth?rev=e83d3aa#e83d3aa704f87825ca dependencies = [ "boa_engine", "boa_gc", - "hashbrown 0.14.0", + "hashbrown 0.14.1", "reth-primitives", "reth-rpc-types", "revm", @@ -5962,7 +7055,7 @@ name = "reth-rlp" version = "0.1.0-alpha.8" source = "git+https://github.com/paradigmxyz/reth?rev=e83d3aa#e83d3aa704f87825ca8cab6f593ab4d4adbf6792" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", "auto_impl", "bytes", "c-kzg 0.1.0 (git+https://github.com/ethereum/c-kzg-4844?rev=f5f6f863d475847876a2bd5ee252058d37c3a15d)", @@ -5977,7 +7070,7 @@ name = "reth-rlp-derive" version = "0.1.0-alpha.8" source = "git+https://github.com/paradigmxyz/reth?rev=e83d3aa#e83d3aa704f87825ca8cab6f593ab4d4adbf6792" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -6055,8 +7148,8 @@ dependencies = [ "once_cell", "revm-primitives", "ripemd", - "secp256k1", - "sha2 0.10.7", + "secp256k1 0.27.0", + "sha2 0.10.8", "sha3", "substrate-bn", ] @@ -6074,7 +7167,7 @@ dependencies = [ "derive_more", "enumn", "fixed-hash", - "hashbrown 0.14.0", + "hashbrown 0.14.1", "hex", "hex-literal", "once_cell", @@ -6091,7 +7184,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac", + "hmac 0.12.1", "subtle", ] @@ -6119,6 +7212,13 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "risc0" +version = "0.2.0" +dependencies = [ + "risc0-build", +] + [[package]] name = "risc0-binfmt" version = "0.18.0" @@ -6157,7 +7257,7 @@ dependencies = [ "directories", "glob", "hex", - "sha2 0.10.7", + "sha2 0.10.8", "tempfile", ] @@ -6236,7 +7336,7 @@ dependencies = [ "risc0-sys", "risc0-zkvm-platform", "serde", - "sha2 0.10.7", + "sha2 0.10.8", "tracing", ] @@ -6254,7 +7354,7 @@ dependencies = [ "bytes", "cfg-if", "crypto-bigint", - "generic-array", + "generic-array 0.14.7", "getrandom 0.2.10", "hex", "lazy-regex", @@ -6274,7 +7374,7 @@ dependencies = [ "risc0-zkvm-platform", "rrs-lib", "serde", - "sha2 0.10.7", + "sha2 0.10.8", "tempfile", "thiserror", "tracing", @@ -6304,7 +7404,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -6319,6 +7419,12 @@ dependencies = [ "librocksdb-sys", ] +[[package]] +name = "route-recognizer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" + [[package]] name = "rrs-lib" version = "0.1.0" @@ -6391,20 +7497,34 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.18", + "semver 1.0.19", +] + +[[package]] +name = "rustix" +version = "0.36.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c37f1bd5ef1b5422177b7646cba67430579cfe2ace80f284fee876bca52ad941" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.1.4", + "windows-sys 0.45.0", ] [[package]] name = "rustix" -version = "0.38.13" +version = "0.38.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662" +checksum = "d2f9da0cbd88f9f09e7814e388301c8414c51c62aa6ce1e4b5c551d49d96e531" dependencies = [ "bitflags 2.4.0", "errno", "libc", - "linux-raw-sys", - "windows-sys", + "linux-raw-sys 0.4.8", + "windows-sys 0.48.0", ] [[package]] @@ -6415,7 +7535,7 @@ checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" dependencies = [ "log", "ring", - "rustls-webpki 0.101.5", + "rustls-webpki 0.101.6", "sct", ] @@ -6452,9 +7572,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.5" +version = "0.101.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a27e3b59326c16e23d30aeb7a36a24cc0d29e71d68ff611cdfb4a01d013bed" +checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" dependencies = [ "ring", "untrusted", @@ -6520,41 +7640,130 @@ dependencies = [ ] [[package]] -name = "scale-info" -version = "2.9.0" +name = "scale-bits" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" +checksum = "8dd7aca73785181cc41f0bbe017263e682b585ca660540ba569133901d013ecf" dependencies = [ - "cfg-if", - "derive_more", "parity-scale-codec", - "scale-info-derive", + "scale-info", + "serde", ] [[package]] -name = "scale-info-derive" -version = "2.9.0" +name = "scale-decode" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" +checksum = "f0459d00b0dbd2e765009924a78ef36b2ff7ba116292d732f00eb0ed8e465d15" +dependencies = [ + "parity-scale-codec", + "primitive-types", + "scale-bits", + "scale-decode-derive", + "scale-info", + "smallvec 1.11.1", + "thiserror", +] + +[[package]] +name = "scale-decode-derive" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4391f0dfbb6690f035f6d2a15d6a12f88cc5395c36bcc056db07ffa2a90870ec" dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2 1.0.67", + "darling 0.14.4", + "proc-macro-crate 1.1.3", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] [[package]] -name = "schannel" -version = "0.1.22" +name = "scale-encode" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "b0401b7cdae8b8aa33725f3611a051358d5b32887ecaa0fda5953a775b2d4d76" dependencies = [ - "windows-sys", + "parity-scale-codec", + "primitive-types", + "scale-bits", + "scale-encode-derive", + "scale-info", + "smallvec 1.11.1", + "thiserror", ] [[package]] -name = "schemars" -version = "0.8.15" +name = "scale-encode-derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "316e0fb10ec0fee266822bd641bab5e332a4ab80ef8c5b5ff35e5401a394f5a6" +dependencies = [ + "darling 0.14.4", + "proc-macro-crate 1.1.3", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "scale-info" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" +dependencies = [ + "bitvec", + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", + "serde", +] + +[[package]] +name = "scale-info-derive" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" +dependencies = [ + "proc-macro-crate 1.1.3", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "scale-value" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2096d36e94ce9bf87d8addb752423b6b19730dc88edd7cc452bb2b90573f7a7" +dependencies = [ + "base58", + "blake2", + "either", + "frame-metadata", + "parity-scale-codec", + "scale-bits", + "scale-decode", + "scale-encode", + "scale-info", + "serde", + "thiserror", + "yap", +] + +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "schemars" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c" dependencies = [ @@ -6570,12 +7779,41 @@ version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "serde_derive_internals", "syn 1.0.109", ] +[[package]] +name = "schnellru" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" +dependencies = [ + "ahash 0.8.3", + "cfg-if", + "hashbrown 0.13.2", +] + +[[package]] +name = "schnorrkel" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "curve25519-dalek 2.1.3", + "getrandom 0.1.16", + "merlin", + "rand 0.7.3", + "rand_core 0.5.1", + "sha2 0.8.2", + "subtle", + "zeroize", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -6588,10 +7826,10 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" dependencies = [ - "hmac", + "hmac 0.12.1", "pbkdf2 0.11.0", "salsa20", - "sha2 0.10.7", + "sha2 0.10.8", ] [[package]] @@ -6612,12 +7850,21 @@ checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", - "generic-array", + "generic-array 0.14.7", "pkcs8", "subtle", "zeroize", ] +[[package]] +name = "secp256k1" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" +dependencies = [ + "secp256k1-sys 0.6.1", +] + [[package]] name = "secp256k1" version = "0.27.0" @@ -6625,10 +7872,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" dependencies = [ "rand 0.8.5", - "secp256k1-sys", + "secp256k1-sys 0.8.1", "serde", ] +[[package]] +name = "secp256k1-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" +dependencies = [ + "cc", +] + [[package]] name = "secp256k1-sys" version = "0.8.1" @@ -6638,6 +7894,15 @@ dependencies = [ "cc", ] +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "zeroize", +] + [[package]] name = "security-framework" version = "2.9.2" @@ -6672,9 +7937,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" dependencies = [ "serde", ] @@ -6709,6 +7974,17 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-hex" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca37e3e4d1b39afd7ff11ee4e947efae85adfddf4841787bfa47c470e96dc26d" +dependencies = [ + "array-init", + "serde", + "smallvec 0.6.14", +] + [[package]] name = "serde-value" version = "0.7.0" @@ -6734,7 +8010,7 @@ version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -6745,7 +8021,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -6778,7 +8054,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -6814,7 +8090,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.0.0", + "indexmap 2.0.2", "serde", "serde_json", "serde_with_macros", @@ -6828,7 +8104,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e6be15c453eb305019bfa438b1593c731f36a289a7853f7707ee29e870b3b3c" dependencies = [ "darling 0.20.3", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -6855,20 +8131,32 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.9.0", - "opaque-debug", + "opaque-debug 0.3.0", ] [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", "digest 0.10.7", ] +[[package]] +name = "sha2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + [[package]] name = "sha2" version = "0.9.9" @@ -6879,14 +8167,14 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.9.0", - "opaque-debug", + "opaque-debug 0.3.0", ] [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -6905,9 +8193,9 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "c1b21f559e07218024e7e9f90f96f601825397de0e25420135f7f952453fed0b" dependencies = [ "lazy_static", ] @@ -6933,6 +8221,12 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + [[package]] name = "signature" version = "2.1.0" @@ -6949,8 +8243,11 @@ version = "0.2.0" dependencies = [ "anyhow", "borsh", - "jsonrpsee", + "clap 4.4.6", + "jsonrpsee 0.20.1", + "schemars", "serde", + "serde_json", "simple-nft-module", "sov-modules-api", "sov-rollup-interface", @@ -6987,9 +8284,18 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.0" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" +dependencies = [ + "maybe-uninit", +] + +[[package]] +name = "smallvec" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "smol_str" @@ -7023,7 +8329,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -7061,7 +8367,7 @@ name = "sov-accessory-state" version = "0.2.0" dependencies = [ "borsh", - "jsonrpsee", + "jsonrpsee 0.20.1", "serde", "sov-modules-api", "sov-state", @@ -7075,8 +8381,8 @@ dependencies = [ "anyhow", "arbitrary", "borsh", - "clap", - "jsonrpsee", + "clap 4.4.6", + "jsonrpsee 0.20.1", "schemars", "serde", "serde_json", @@ -7107,14 +8413,39 @@ dependencies = [ "thiserror", ] +[[package]] +name = "sov-avail-adapter" +version = "0.2.0" +dependencies = [ + "anyhow", + "async-trait", + "avail-subxt", + "borsh", + "bytes", + "parity-scale-codec", + "primitive-types", + "reqwest", + "serde", + "serde_json", + "sov-rollup-interface", + "sp-core 21.0.0", + "sp-core-hashing 12.0.0", + "sp-keyring", + "subxt", + "thiserror", + "tokio", + "tracing", + "tracing-subscriber 0.3.17", +] + [[package]] name = "sov-bank" version = "0.2.0" dependencies = [ "anyhow", "borsh", - "clap", - "jsonrpsee", + "clap 4.4.6", + "jsonrpsee 0.20.1", "schemars", "serde", "serde_json", @@ -7133,9 +8464,9 @@ dependencies = [ "anyhow", "bincode", "borsh", - "clap", + "clap 4.4.6", "hex", - "jsonrpsee", + "jsonrpsee 0.20.1", "schemars", "serde", "serde_json", @@ -7159,25 +8490,25 @@ dependencies = [ "base64 0.21.4", "bech32", "borsh", + "celestia-proto", + "celestia-rpc", + "celestia-types", "hex", - "hex-literal", - "jsonrpsee", + "jsonrpsee 0.20.1", "nmt-rs", "postcard", "proptest", - "prost 0.11.9", - "prost-build", - "prost-types 0.11.9", + "prost 0.12.1", "risc0-zkvm", "risc0-zkvm-platform", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "sov-celestia-adapter", "sov-rollup-interface", "sov-zk-cycle-macros", - "tendermint", - "tendermint-proto", + "tendermint 0.32.0", + "tendermint-proto 0.32.0", "thiserror", "tokio", "tracing", @@ -7190,7 +8521,7 @@ version = "0.2.0" dependencies = [ "anyhow", "borsh", - "jsonrpsee", + "jsonrpsee 0.20.1", "serde", "serde_json", "sov-chain-state", @@ -7210,7 +8541,7 @@ dependencies = [ "demo-stf", "directories", "hex", - "jsonrpsee", + "jsonrpsee 0.20.1", "serde", "serde_json", "sov-accounts", @@ -7254,51 +8585,15 @@ dependencies = [ "tokio", ] -[[package]] -name = "sov-demo-prover-host" -version = "0.2.0" -dependencies = [ - "anyhow", - "bincode", - "borsh", - "const-rollup-config", - "demo-stf", - "env_logger", - "hex", - "jsonrpsee", - "log", - "log4rs", - "methods", - "once_cell", - "parking_lot 0.12.1", - "prettytable-rs", - "regex", - "risc0-zkvm", - "serde", - "serde_json", - "sha2 0.10.7", - "sov-celestia-adapter", - "sov-demo-rollup", - "sov-modules-api", - "sov-risc0-adapter", - "sov-rollup-interface", - "sov-state", - "sov-stf-runner", - "sov-zk-cycle-macros", - "tempfile", - "tokio", - "tracing", - "tracing-subscriber", -] - [[package]] name = "sov-demo-rollup" version = "0.2.0" dependencies = [ "anyhow", "async-trait", + "bincode", "borsh", - "clap", + "clap 4.4.6", "const-rollup-config", "criterion", "demo-stf", @@ -7310,18 +8605,21 @@ dependencies = [ "ethers-providers", "ethers-signers", "hex", - "jsonrpsee", - "methods", + "jsonrpsee 0.20.1", + "log", + "log4rs", "prettytable-rs", "prometheus 0.11.0", "proptest", + "regex", "reqwest", "reth-primitives", "revm", - "secp256k1", + "risc0", + "secp256k1 0.27.0", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "sov-bank", "sov-celestia-adapter", "sov-cli", @@ -7331,16 +8629,18 @@ dependencies = [ "sov-evm", "sov-modules-api", "sov-modules-stf-template", + "sov-nft-module", "sov-risc0-adapter", "sov-rollup-interface", "sov-sequencer", "sov-state", "sov-stf-runner", + "sov-zk-cycle-macros", "tempfile", - "tendermint", + "tendermint 0.32.2", "tokio", "tracing", - "tracing-subscriber", + "tracing-subscriber 0.3.17", ] [[package]] @@ -7351,7 +8651,7 @@ dependencies = [ "borsh", "demo-stf", "ethers", - "jsonrpsee", + "jsonrpsee 0.20.1", "reth-primitives", "reth-rpc-types", "serde_json", @@ -7368,7 +8668,7 @@ dependencies = [ "anyhow", "borsh", "bytes", - "clap", + "clap 4.4.6", "derive_more", "ethereum-types", "ethers", @@ -7377,7 +8677,7 @@ dependencies = [ "ethers-middleware", "ethers-signers", "hex", - "jsonrpsee", + "jsonrpsee 0.20.1", "lazy_static", "reth-interfaces", "reth-primitives", @@ -7386,7 +8686,7 @@ dependencies = [ "reth-rpc-types-compat", "revm", "schemars", - "secp256k1", + "secp256k1 0.27.0", "serde", "serde_json", "sov-evm", @@ -7429,25 +8729,24 @@ dependencies = [ "bech32", "bincode", "borsh", - "clap", + "clap 4.4.6", "derive_more", - "ed25519-dalek", + "ed25519-dalek 2.0.0", "hex", "jmt", - "jsonrpsee", + "jsonrpsee 0.20.1", "rand 0.8.5", "risc0-zkvm", "risc0-zkvm-platform", "schemars", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "sov-bank", "sov-first-read-last-write-cache", "sov-modules-api", "sov-modules-macros", "sov-rollup-interface", - "sov-sequencer", "sov-state", "sov-zk-cycle-macros", "tempfile", @@ -7460,9 +8759,9 @@ version = "0.2.0" dependencies = [ "anyhow", "borsh", - "clap", - "jsonrpsee", - "proc-macro2 1.0.67", + "clap 4.4.6", + "jsonrpsee 0.20.1", + "proc-macro2 1.0.69", "quote 1.0.33", "schemars", "serde", @@ -7502,7 +8801,7 @@ version = "0.2.0" dependencies = [ "anyhow", "borsh", - "jsonrpsee", + "jsonrpsee 0.20.1", "postgres", "schemars", "serde", @@ -7569,7 +8868,7 @@ dependencies = [ "proptest-derive", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "thiserror", "tokio", ] @@ -7596,9 +8895,14 @@ dependencies = [ "async-trait", "borsh", "hex", - "jsonrpsee", + "jsonrpsee 0.20.1", + "rand 0.8.5", "serde", + "sov-modules-api", "sov-rollup-interface", + "sov-state", + "sov-value-setter", + "tempfile", "tokio", "tracing", ] @@ -7609,8 +8913,8 @@ version = "0.2.0" dependencies = [ "anyhow", "borsh", - "clap", - "jsonrpsee", + "clap 4.4.6", + "jsonrpsee 0.20.1", "risc0-zkvm", "risc0-zkvm-platform", "schemars", @@ -7641,7 +8945,7 @@ dependencies = [ "risc0-zkvm-platform", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "sov-db", "sov-first-read-last-write-cache", "sov-rollup-interface", @@ -7658,8 +8962,7 @@ dependencies = [ "borsh", "futures", "hex", - "jsonrpsee", - "rand 0.8.5", + "jsonrpsee 0.20.1", "serde", "sov-accounts", "sov-bank", @@ -7668,12 +8971,12 @@ dependencies = [ "sov-modules-api", "sov-modules-stf-template", "sov-rollup-interface", + "sov-sequencer", "sov-sequencer-registry", "sov-state", - "sov-value-setter", "tempfile", "tokio", - "toml 0.8.0", + "toml 0.8.2", "tracing", ] @@ -7683,8 +8986,8 @@ version = "0.2.0" dependencies = [ "anyhow", "borsh", - "clap", - "jsonrpsee", + "clap 4.4.6", + "jsonrpsee 0.20.1", "schemars", "serde", "serde_json", @@ -7701,8 +9004,8 @@ version = "0.2.0" dependencies = [ "anyhow", "borsh", - "clap", - "jsonrpsee", + "clap 4.4.6", + "jsonrpsee 0.20.1", "schemars", "serde", "serde_json", @@ -7719,7 +9022,7 @@ version = "0.2.0" dependencies = [ "anyhow", "borsh", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "risc0-zkvm", "risc0-zkvm-platform", @@ -7738,39 +9041,555 @@ dependencies = [ ] [[package]] -name = "spin" -version = "0.5.2" +name = "sp-application-crypto" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "899492ea547816d5dfe9a5a2ecc32f65a7110805af6da3380aa4902371b31dc2" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-core 21.0.0", + "sp-io", + "sp-std 8.0.0", +] [[package]] -name = "spin" -version = "0.9.8" +name = "sp-arithmetic" +version = "16.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "bb6020576e544c6824a51d651bc8df8e6ab67cd59f1c9ac09868bb81a5199ded" dependencies = [ - "lock_api", + "integer-sqrt", + "num-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sp-std 8.0.0", + "static_assertions", ] [[package]] -name = "spki" -version = "0.7.2" +name = "sp-core" +version = "21.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "f18d9e2f67d8661f9729f35347069ac29d92758b59135176799db966947a7336" dependencies = [ - "base64ct", - "der", + "array-bytes 4.2.0", + "bitflags 1.3.2", + "blake2", + "bounded-collections", + "bs58 0.4.0", + "dyn-clonable", + "ed25519-zebra", + "futures", + "hash-db 0.16.0", + "hash256-std-hasher", + "impl-serde", + "lazy_static", + "libsecp256k1", + "log", + "merlin", + "parity-scale-codec", + "parking_lot 0.12.1", + "paste", + "primitive-types", + "rand 0.8.5", + "regex", + "scale-info", + "schnorrkel", + "secp256k1 0.24.3", + "secrecy", + "serde", + "sp-core-hashing 9.0.0", + "sp-debug-derive 8.0.0", + "sp-externalities 0.19.0", + "sp-runtime-interface 17.0.0", + "sp-std 8.0.0", + "sp-storage 13.0.0", + "ss58-registry", + "substrate-bip39", + "thiserror", + "tiny-bip39", + "zeroize", ] [[package]] -name = "sptr" -version = "0.3.2" +name = "sp-core" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" +checksum = "7921d278ed2aebbb21a644c96e09663dc49a6139d1e2e063c059dc9f866e149b" +dependencies = [ + "array-bytes 6.1.0", + "bitflags 1.3.2", + "blake2", + "bounded-collections", + "bs58 0.5.0", + "dyn-clonable", + "ed25519-zebra", + "futures", + "hash-db 0.16.0", + "hash256-std-hasher", + "impl-serde", + "lazy_static", + "libsecp256k1", + "log", + "merlin", + "parity-scale-codec", + "parking_lot 0.12.1", + "paste", + "primitive-types", + "rand 0.8.5", + "regex", + "scale-info", + "schnorrkel", + "secp256k1 0.24.3", + "secrecy", + "serde", + "sp-core-hashing 12.0.0", + "sp-debug-derive 11.0.0", + "sp-externalities 0.22.0", + "sp-runtime-interface 20.0.0", + "sp-std 11.0.0", + "sp-storage 16.0.0", + "ss58-registry", + "substrate-bip39", + "thiserror", + "tiny-bip39", + "tracing", + "zeroize", +] [[package]] -name = "stable_deref_trait" -version = "1.2.0" +name = "sp-core-hashing" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee599a8399448e65197f9a6cee338ad192e9023e35e31f22382964c3c174c68" +dependencies = [ + "blake2b_simd", + "byteorder", + "digest 0.10.7", + "sha2 0.10.8", + "sha3", + "sp-std 8.0.0", + "twox-hash", +] + +[[package]] +name = "sp-core-hashing" +version = "12.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7cb5c31aa385d6997a5b73fdc9837c1c0145559205198555c3000739a474767" +dependencies = [ + "blake2b_simd", + "byteorder", + "digest 0.10.7", + "sha2 0.10.8", + "sha3", + "twox-hash", +] + +[[package]] +name = "sp-debug-derive" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f531814d2f16995144c74428830ccf7d94ff4a7749632b83ad8199b181140c" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.37", +] + +[[package]] +name = "sp-debug-derive" +version = "11.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f7d375610590566e11882bf5b5a4b8d0666a96ba86808b2650bbbd9be50bf8" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.37", +] + +[[package]] +name = "sp-externalities" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0f71c671e01a8ca60da925d43a1b351b69626e268b8837f8371e320cf1dd100" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std 8.0.0", + "sp-storage 13.0.0", +] + +[[package]] +name = "sp-externalities" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede074871514ca7c5d2eca9563515d858c6220b47ae815714ed4393a4e99db4a" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std 11.0.0", + "sp-storage 16.0.0", +] + +[[package]] +name = "sp-io" +version = "23.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d597e35a9628fe7454b08965b2442e3ec0f264b0a90d41328e87422cec02e99" +dependencies = [ + "bytes", + "ed25519 1.5.3", + "ed25519-dalek 1.0.1", + "futures", + "libsecp256k1", + "log", + "parity-scale-codec", + "rustversion", + "secp256k1 0.24.3", + "sp-core 21.0.0", + "sp-externalities 0.19.0", + "sp-keystore", + "sp-runtime-interface 17.0.0", + "sp-state-machine", + "sp-std 8.0.0", + "sp-tracing 10.0.0", + "sp-trie", + "tracing", + "tracing-core", +] + +[[package]] +name = "sp-keyring" +version = "24.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4673405248580504a8bc4e09615ab25ccb182dfaccd27e000fda9dcb2ca1dab1" +dependencies = [ + "lazy_static", + "sp-core 21.0.0", + "sp-runtime", + "strum 0.24.1", +] + +[[package]] +name = "sp-keystore" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be3cdd67cc1d9c1db17c5cbc4ec4924054a8437009d167f21f6590797e4aa45" +dependencies = [ + "futures", + "parity-scale-codec", + "parking_lot 0.12.1", + "sp-core 21.0.0", + "sp-externalities 0.19.0", + "thiserror", +] + +[[package]] +name = "sp-panic-handler" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd2de46003fa8212426838ca71cd42ee36a26480ba9ffea983506ce03131033" +dependencies = [ + "backtrace", + "lazy_static", + "regex", +] + +[[package]] +name = "sp-runtime" +version = "24.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21c5bfc764a1a8259d7e8f7cfd22c84006275a512c958d3ff966c92151e134d5" +dependencies = [ + "either", + "hash256-std-hasher", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "paste", + "rand 0.8.5", + "scale-info", + "serde", + "sp-application-crypto", + "sp-arithmetic", + "sp-core 21.0.0", + "sp-io", + "sp-std 8.0.0", + "sp-weights", +] + +[[package]] +name = "sp-runtime-interface" +version = "17.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e676128182f90015e916f806cba635c8141e341e7abbc45d25525472e1bbce8" +dependencies = [ + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec", + "primitive-types", + "sp-externalities 0.19.0", + "sp-runtime-interface-proc-macro 11.0.0", + "sp-std 8.0.0", + "sp-storage 13.0.0", + "sp-tracing 10.0.0", + "sp-wasm-interface 14.0.0", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface" +version = "20.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17a4030ad93f05c93f2cc294c74bc5fea227f90fb3d1426d4a6f165e017fb7ea" +dependencies = [ + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec", + "primitive-types", + "sp-externalities 0.22.0", + "sp-runtime-interface-proc-macro 14.0.0", + "sp-std 11.0.0", + "sp-storage 16.0.0", + "sp-tracing 13.0.0", + "sp-wasm-interface 17.0.0", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "11.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d5bd5566fe5633ec48dfa35ab152fd29f8a577c21971e1c6db9f28afb9bbb9" +dependencies = [ + "Inflector", + "proc-macro-crate 1.1.3", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.37", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "14.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b232943ee7ca83a6d56face33b8af12e9fb470a15a53835f4e12a6e452a41c1c" +dependencies = [ + "Inflector", + "proc-macro-crate 1.1.3", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.37", +] + +[[package]] +name = "sp-state-machine" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ef45d31f9e7ac648f8899a0cd038a3608f8499028bff55b6c799702592325b6" +dependencies = [ + "hash-db 0.16.0", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "rand 0.8.5", + "smallvec 1.11.1", + "sp-core 21.0.0", + "sp-externalities 0.19.0", + "sp-panic-handler", + "sp-std 8.0.0", + "sp-trie", + "thiserror", + "tracing", +] + +[[package]] +name = "sp-std" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53458e3c57df53698b3401ec0934bea8e8cfce034816873c0b0abbd83d7bac0d" + +[[package]] +name = "sp-std" +version = "11.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c91d32e165d08a14098ce5ec923eaec59d1d0583758a18a770beec1b780b0d0" + +[[package]] +name = "sp-storage" +version = "13.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94294be83f11d4958cfea89ed5798f0b6605f5defc3a996948848458abbcc18e" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive 8.0.0", + "sp-std 8.0.0", +] + +[[package]] +name = "sp-storage" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac9660ecd48314443e73ad0f44d58b76426666a1343d72f6f65664e174da9244" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive 11.0.0", + "sp-std 11.0.0", +] + +[[package]] +name = "sp-tracing" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357f7591980dd58305956d32f8f6646d0a8ea9ea0e7e868e46f53b68ddf00cec" +dependencies = [ + "parity-scale-codec", + "sp-std 8.0.0", + "tracing", + "tracing-core", + "tracing-subscriber 0.2.25", +] + +[[package]] +name = "sp-tracing" +version = "13.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69a61948986d2a9f8d67d60884ff0277d910df09ebe08d0e1f309da777516453" +dependencies = [ + "parity-scale-codec", + "sp-std 11.0.0", + "tracing", + "tracing-core", + "tracing-subscriber 0.2.25", +] + +[[package]] +name = "sp-trie" +version = "22.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4eeb7ef23f79eba8609db79ef9cef242f994f1f87a3c0387b4b5f177fda74" +dependencies = [ + "ahash 0.8.3", + "hash-db 0.16.0", + "hashbrown 0.13.2", + "lazy_static", + "memory-db", + "nohash-hasher", + "parity-scale-codec", + "parking_lot 0.12.1", + "scale-info", + "schnellru", + "sp-core 21.0.0", + "sp-std 8.0.0", + "thiserror", + "tracing", + "trie-db", + "trie-root", +] + +[[package]] +name = "sp-wasm-interface" +version = "14.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19c122609ca5d8246be6386888596320d03c7bc880959eaa2c36bcd5acd6846" +dependencies = [ + "anyhow", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-std 8.0.0", + "wasmtime", +] + +[[package]] +name = "sp-wasm-interface" +version = "17.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf43bb0c8eb76dc41057ce0fb6b744b94c9aec28b31dff53a1efc4f04ef25384" +dependencies = [ + "anyhow", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-std 11.0.0", + "wasmtime", +] + +[[package]] +name = "sp-weights" +version = "20.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45d084c735544f70625b821c3acdbc7a2fc1893ca98b85f1942631284692c75b" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "smallvec 1.11.1", + "sp-arithmetic", + "sp-core 21.0.0", + "sp-debug-derive 8.0.0", + "sp-std 8.0.0", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sptr" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" + +[[package]] +name = "ss58-registry" +version = "1.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6915280e2d0db8911e5032a5c275571af6bdded2916abd691a659be25d3439" +dependencies = [ + "Inflector", + "num-format", + "proc-macro2 1.0.69", + "quote 1.0.33", + "serde", + "serde_json", + "unicode-xid 0.2.4", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" @@ -7804,6 +9623,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + [[package]] name = "strsim" version = "0.9.3" @@ -7816,13 +9641,59 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "structopt" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" +dependencies = [ + "clap 2.34.0", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +dependencies = [ + "heck 0.3.3", + "proc-macro-error", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +dependencies = [ + "strum_macros 0.24.3", +] + [[package]] name = "strum" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" dependencies = [ - "strum_macros", + "strum_macros 0.25.2", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck 0.4.1", + "proc-macro2 1.0.69", + "quote 1.0.33", + "rustversion", + "syn 1.0.109", ] [[package]] @@ -7831,13 +9702,26 @@ version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad8d03b598d3d0fff69bf533ee3ef19b8eeb342729596df84bcc7e1f96ec4059" dependencies = [ - "heck", - "proc-macro2 1.0.67", + "heck 0.4.1", + "proc-macro2 1.0.69", "quote 1.0.33", "rustversion", "syn 2.0.37", ] +[[package]] +name = "substrate-bip39" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49eee6965196b32f882dd2ee85a92b1dbead41b04e53907f269de3b0dc04733c" +dependencies = [ + "hmac 0.11.0", + "pbkdf2 0.8.0", + "schnorrkel", + "sha2 0.9.9", + "zeroize", +] + [[package]] name = "substrate-bn" version = "0.6.0" @@ -7853,9 +9737,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "subtle-encoding" @@ -7872,6 +9756,85 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" +[[package]] +name = "subxt" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31a734d66fa935fbda56ba6a71d7e969f424c8c5608d416ba8499d71d8cbfc1f" +dependencies = [ + "base58", + "blake2", + "derivative", + "either", + "frame-metadata", + "futures", + "getrandom 0.2.10", + "hex", + "impl-serde", + "jsonrpsee 0.16.3", + "parity-scale-codec", + "primitive-types", + "scale-bits", + "scale-decode", + "scale-encode", + "scale-info", + "scale-value", + "serde", + "serde_json", + "sp-core 21.0.0", + "sp-core-hashing 9.0.0", + "sp-runtime", + "subxt-macro", + "subxt-metadata", + "thiserror", + "tracing", +] + +[[package]] +name = "subxt-codegen" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2f231d97c145c564bd544212c0cc0c29c09ff516af199f4ce00c8e055f8138" +dependencies = [ + "frame-metadata", + "heck 0.4.1", + "hex", + "jsonrpsee 0.16.3", + "parity-scale-codec", + "proc-macro2 1.0.69", + "quote 1.0.33", + "scale-info", + "subxt-metadata", + "syn 2.0.37", + "thiserror", + "tokio", +] + +[[package]] +name = "subxt-macro" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e544e41e1c84b616632cd2f86862342868f62e11e4cd9062a9e3dbf5fc871f64" +dependencies = [ + "darling 0.20.3", + "proc-macro-error", + "subxt-codegen", + "syn 2.0.37", +] + +[[package]] +name = "subxt-metadata" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01ce5044c81db3404d38c56f1e69d72eff72c54e5913c9bba4c0b58d376031f" +dependencies = [ + "frame-metadata", + "parity-scale-codec", + "scale-info", + "sp-core-hashing 9.0.0", + "thiserror", +] + [[package]] name = "sucds" version = "0.6.0" @@ -7892,10 +9855,10 @@ dependencies = [ "hex", "once_cell", "reqwest", - "semver 1.0.18", + "semver 1.0.19", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "thiserror", "url", "zip", @@ -7918,7 +9881,7 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "unicode-ident", ] @@ -7929,7 +9892,7 @@ version = "2.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "unicode-ident", ] @@ -7940,7 +9903,7 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", "unicode-xid 0.2.4", @@ -7952,18 +9915,45 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "285ba80e733fac80aa4270fbcdf83772a79b80aa35c97075320abfee4a915b06" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", "unicode-xid 0.2.4", ] +[[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 = "target-lexicon" +version = "0.12.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" + [[package]] name = "tempfile" version = "3.8.0" @@ -7971,10 +9961,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", - "fastrand 2.0.0", + "fastrand 2.0.1", "redox_syscall 0.3.5", - "rustix", - "windows-sys", + "rustix 0.38.15", + "windows-sys 0.48.0", +] + +[[package]] +name = "tendermint" +version = "0.32.0" +source = "git+https://github.com/eigerco/celestia-tendermint-rs.git?rev=1f8b574#1f8b574809a43b892f4beb59b887919b484fe232" +dependencies = [ + "bytes", + "digest 0.10.7", + "ed25519 2.2.2", + "ed25519-consensus", + "flex-error", + "futures", + "num-traits", + "once_cell", + "prost 0.12.1", + "prost-types 0.12.1", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "sha2 0.10.8", + "signature 2.1.0", + "subtle", + "subtle-encoding", + "tendermint-proto 0.32.0", + "time", + "zeroize", ] [[package]] @@ -7985,7 +10003,7 @@ checksum = "3f0a7d05cf78524782337f8edd55cbc578d159a16ad4affe2135c92f7dbac7f0" dependencies = [ "bytes", "digest 0.10.7", - "ed25519", + "ed25519 2.2.2", "ed25519-consensus", "flex-error", "futures", @@ -7997,15 +10015,32 @@ dependencies = [ "serde_bytes", "serde_json", "serde_repr", - "sha2 0.10.7", - "signature", + "sha2 0.10.8", + "signature 2.1.0", "subtle", "subtle-encoding", - "tendermint-proto", + "tendermint-proto 0.32.2", "time", "zeroize", ] +[[package]] +name = "tendermint-proto" +version = "0.32.0" +source = "git+https://github.com/eigerco/celestia-tendermint-rs.git?rev=1f8b574#1f8b574809a43b892f4beb59b887919b484fe232" +dependencies = [ + "bytes", + "flex-error", + "num-derive 0.3.3", + "num-traits", + "prost 0.12.1", + "prost-types 0.12.1", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + [[package]] name = "tendermint-proto" version = "0.32.2" @@ -8044,6 +10079,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "thin-vec" version = "0.2.12" @@ -8052,20 +10096,20 @@ checksum = "aac81b6fd6beb5884b0cf3321b8117e6e5d47ecb6fc89f414cfdcca8b2fe2dd8" [[package]] name = "thiserror" -version = "1.0.48" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" +checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.48" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" +checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -8102,9 +10146,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" +checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe" dependencies = [ "deranged", "itoa", @@ -8117,19 +10161,38 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] +[[package]] +name = "tiny-bip39" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" +dependencies = [ + "anyhow", + "hmac 0.12.1", + "once_cell", + "pbkdf2 0.11.0", + "rand 0.8.5", + "rustc-hash", + "sha2 0.10.8", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -8141,11 +10204,12 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ac3f5b6856e931e15e07b478e98c8045239829a65f9156d4fa7e7788197a5ef" +checksum = "8faa444297615a4e020acb64146b0603c9c395c03a97c17fd9028816d3b4d63e" dependencies = [ "displaydoc", + "serde", "zerovec", ] @@ -8176,9 +10240,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.32.0" +version = "1.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" +checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" dependencies = [ "backtrace", "bytes", @@ -8190,7 +10254,7 @@ dependencies = [ "signal-hook-registry", "socket2 0.5.4", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -8199,7 +10263,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -8264,9 +10328,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2dbec703c26b00d74844519606ef15d09a7d6857860f84ad223dec002ddea2" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", @@ -8274,14 +10338,14 @@ dependencies = [ "tokio", "tokio-rustls", "tungstenite", - "webpki-roots 0.23.1", + "webpki-roots 0.25.2", ] [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" dependencies = [ "bytes", "futures-core", @@ -8316,14 +10380,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c226a7bba6d859b63c92c4b4fe69c5b6b72d0cb897dbc8e6012298e6154cb56e" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.20.0", + "toml_edit 0.20.2", ] [[package]] @@ -8341,7 +10405,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.0.2", "serde", "serde_spanned", "toml_datetime", @@ -8350,11 +10414,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ff63e60a958cefbb518ae1fd6566af80d9d4be430a33f3723dfc47d1d411d95" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.0.2", "serde", "serde_spanned", "toml_datetime", @@ -8407,7 +10471,7 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -8445,31 +10509,85 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "ansi_term", + "chrono", + "lazy_static", + "matchers 0.0.1", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec 1.11.1", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + [[package]] name = "tracing-subscriber" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" dependencies = [ - "matchers", + "matchers 0.1.0", "nu-ansi-term", "once_cell", "regex", "sharded-slab", - "smallvec", + "smallvec 1.11.1", "thread_local", "tracing", "tracing-core", "tracing-log", ] +[[package]] +name = "trie-db" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "767abe6ffed88a1889671a102c2861ae742726f52e0a5a425b92c9fbfa7e9c85" +dependencies = [ + "hash-db 0.16.0", + "hashbrown 0.13.2", + "log", + "rustc-hex", + "smallvec 1.11.1", +] + +[[package]] +name = "trie-root" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ed310ef5ab98f5fa467900ed906cb9232dd5376597e00fd4cba2a449d06c0b" +dependencies = [ + "hash-db 0.16.0", +] + [[package]] name = "triehash" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1631b201eb031b563d2e85ca18ec8092508e262a3196ce9bd10a67ec87b9f5c" dependencies = [ - "hash-db", + "hash-db 0.15.2", "rlp", ] @@ -8511,7 +10629,7 @@ dependencies = [ "lazy_static", "log", "rand 0.8.5", - "smallvec", + "smallvec 1.11.1", "thiserror", "tinyvec", "tokio", @@ -8566,6 +10684,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", + "digest 0.10.7", + "rand 0.8.5", "static_assertions", ] @@ -8603,7 +10723,7 @@ version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfc13d450dc4a695200da3074dacf43d449b968baee95e341920e47f61a3b40f" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] @@ -8689,7 +10809,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" dependencies = [ - "generic-array", + "generic-array 0.14.7", "subtle", ] @@ -8702,6 +10822,12 @@ dependencies = [ "destructure_traitobject", ] +[[package]] +name = "unsigned-varint" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" + [[package]] name = "untrusted" version = "0.7.1" @@ -8766,6 +10892,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "vergen" version = "8.2.5" @@ -8794,9 +10926,9 @@ dependencies = [ [[package]] name = "waker-fn" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" [[package]] name = "walkdir" @@ -8848,7 +10980,7 @@ dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", "wasm-bindgen-shared", @@ -8882,7 +11014,7 @@ version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", "wasm-bindgen-backend", @@ -8895,6 +11027,148 @@ version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +[[package]] +name = "wasmparser" +version = "0.102.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" +dependencies = [ + "indexmap 1.9.3", + "url", +] + +[[package]] +name = "wasmtime" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f907fdead3153cb9bfb7a93bbd5b62629472dc06dee83605358c64c52ed3dda9" +dependencies = [ + "anyhow", + "bincode", + "cfg-if", + "indexmap 1.9.3", + "libc", + "log", + "object 0.30.4", + "once_cell", + "paste", + "psm", + "serde", + "target-lexicon", + "wasmparser", + "wasmtime-environ", + "wasmtime-jit", + "wasmtime-runtime", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b9daa7c14cd4fa3edbf69de994408d5f4b7b0959ac13fa69d465f6597f810d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-environ" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a990198cee4197423045235bf89d3359e69bd2ea031005f4c2d901125955c949" +dependencies = [ + "anyhow", + "cranelift-entity", + "gimli 0.27.3", + "indexmap 1.9.3", + "log", + "object 0.30.4", + "serde", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "wasmtime-jit" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de48df552cfca1c9b750002d3e07b45772dd033b0b206d5c0968496abf31244" +dependencies = [ + "addr2line 0.19.0", + "anyhow", + "bincode", + "cfg-if", + "cpp_demangle 0.3.5", + "gimli 0.27.3", + "log", + "object 0.30.4", + "rustc-demangle", + "serde", + "target-lexicon", + "wasmtime-environ", + "wasmtime-jit-icache-coherence", + "wasmtime-runtime", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0554b84c15a27d76281d06838aed94e13a77d7bf604bbbaf548aa20eb93846" +dependencies = [ + "once_cell", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aecae978b13f7f67efb23bd827373ace4578f2137ec110bbf6a4a7cde4121bbd" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-runtime" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658cf6f325232b6760e202e5255d823da5e348fdea827eff0a2a22319000b441" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "indexmap 1.9.3", + "libc", + "log", + "mach", + "memfd", + "memoffset 0.8.0", + "paste", + "rand 0.8.5", + "rustix 0.36.15", + "wasmtime-asm-macros", + "wasmtime-environ", + "wasmtime-jit-debug", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-types" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f6fffd2a1011887d57f07654dd112791e872e3ff4a2e626aee8059ee17f06f" +dependencies = [ + "cranelift-entity", + "serde", + "thiserror", + "wasmparser", +] + [[package]] name = "web-sys" version = "0.3.64" @@ -8929,7 +11203,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix", + "rustix 0.38.15", ] [[package]] @@ -8966,9 +11240,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -8985,7 +11259,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", ] [[package]] @@ -8994,7 +11277,22 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] @@ -9003,51 +11301,93 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "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_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[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_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[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_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[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_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[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_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -9070,7 +11410,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -9103,9 +11443,9 @@ checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] name = "writeable" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60e49e42bdb1d5dc76f4cd78102f8f0714d32edfa3efb82286eb0f0b1fc0da0f" +checksum = "c0af0c3d13faebf8dda0b5256fa7096a2d5ccb662f7b9f54a40fe201077ab1c2" [[package]] name = "ws_stream_wasm" @@ -9137,9 +11477,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.18" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab77e97b50aee93da431f2cee7cd0f43b4d1da3c408042f2d7d164187774f0a" +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" [[package]] name = "xmltree" @@ -9165,11 +11505,17 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +[[package]] +name = "yap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2a7eb6d82a11e4d0b8e6bda8347169aff4ccd8235d039bba7c47482d977dcf7" + [[package]] name = "yoke" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1848075a23a28f9773498ee9a0f2cf58fcbad4f8c0ccf84a210ab33c6ae495de" +checksum = "61e38c508604d6bbbd292dadb3c02559aa7fff6b654a078a36217cad871636e4" dependencies = [ "serde", "stable_deref_trait", @@ -9179,35 +11525,35 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af46c169923ed7516eef0aa32b56d2651b229f57458ebe46b49ddd6efef5b7a2" +checksum = "d5e19fb6ed40002bab5403ffa37e53e0e56f914a4450c8765f533018db1db35f" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 1.0.109", - "synstructure 0.12.6", + "syn 2.0.37", + "synstructure 0.13.0", ] [[package]] name = "zerofrom" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df54d76c3251de27615dfcce21e636c172dafb2549cd7fd93e21c66f6ca6bea2" +checksum = "655b0814c5c0b19ade497851070c640773304939a6c0fd5f5fb43da0696d05b7" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eae7c1f7d4b8eafce526bc0771449ddc2f250881ae31c50d22c032b5a1c499" +checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 1.0.109", - "synstructure 0.12.6", + "syn 2.0.37", + "synstructure 0.13.0", ] [[package]] @@ -9225,17 +11571,18 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 2.0.37", ] [[package]] name = "zerovec" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198f54134cd865f437820aa3b43d0ad518af4e68ee161b444cdd15d8e567c8ea" +checksum = "591691014119b87047ead4dcf3e6adfbf73cb7c38ab6980d4f18a32138f35d46" dependencies = [ + "serde", "yoke", "zerofrom", "zerovec-derive", @@ -9243,14 +11590,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486558732d5dde10d0f8cb2936507c1bb21bc539d924c949baf5f36a58e51bac" +checksum = "7a4a1638a1934450809c2266a70362bfc96cd90550c073f5b8a55014d1010157" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 1.0.109", - "synstructure 0.12.6", + "syn 2.0.37", ] [[package]] @@ -9262,11 +11608,11 @@ dependencies = [ "aes 0.8.3", "byteorder", "bzip2", - "constant_time_eq", + "constant_time_eq 0.1.5", "crc32fast", "crossbeam-utils", "flate2", - "hmac", + "hmac 0.12.1", "pbkdf2 0.11.0", "sha1", "time", diff --git a/Cargo.toml b/Cargo.toml index aa556b226..c3563059d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,14 +2,15 @@ resolver = "2" members = [ "rollup-interface", + "adapters/avail", "adapters/risc0", "adapters/celestia", "examples/const-rollup-config", "examples/demo-stf", "examples/demo-simple-stf", "examples/demo-rollup", + "examples/demo-rollup/provers", "examples/simple-nft-module", - "examples/demo-prover", "full-node/db/sov-db", "full-node/sov-sequencer", @@ -18,9 +19,7 @@ members = [ "utils/zk-cycle-macros", "utils/zk-cycle-utils", - "utils/nft-utils", "utils/bashtestmd", - "utils/nft-utils", "module-system/sov-cli", "module-system/sov-modules-stf-template", @@ -69,13 +68,13 @@ borsh = { version = "0.10.3", features = ["rc", "bytes"] } # https://github.com/Sovereign-Labs/sovereign-sdk/issues/283 bincode = "1.3.3" bcs = "0.1.5" -byteorder = "1.4.3" +byteorder = "1.5.0" bytes = "1.2.1" futures = "0.3" hex = "0.4.3" once_cell = "1.10.0" prometheus = { version = "0.13.3", default-features = false } -proptest = "1.0.0" +proptest = "1.3.1" proptest-derive = "0.3.0" rand = "0.8" rayon = "1.8.0" @@ -91,7 +90,7 @@ bech32 = "0.9.1" derive_more = "0.99.11" clap = { version = "4.2.7", features = ["derive"] } toml = "0.8.0" -jsonrpsee = { version = "0.18.2", features = ["jsonrpsee-types"] } +jsonrpsee = { version = "0.20.1", features = ["jsonrpsee-types"] } schemars = { version = "0.8.12", features = ["derive"] } tempfile = "3.5" tokio = { version = "1", features = ["full"] } @@ -125,3 +124,14 @@ secp256k1 = { version = "0.27.0", default-features = false, features = [ "rand-std", "recovery", ] } + +[patch.'https://github.com/eigerco/celestia-node-rs.git'] +# Uncomment to apply local changes +# celestia-proto = { path = "../celestia-node-rs/proto" } +# celestia-rpc = { path = "../celestia-node-rs/rpc" } +# celestia-types = { path = "../celestia-node-rs/types" } + +[patch.'https://github.com/eigerco/celestia-tendermint-rs.git'] +# Uncomment to apply local changes +# tendermint = { path = "../celestia-tendermint-rs/tendermint" } +# tendermint-proto = { path = "../celestia-tendermint-rs/proto" } diff --git a/Makefile b/Makefile index 959aeda41..1febb49de 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,7 @@ lint: ## cargo check and clippy. Skip clippy on guest code since it's not suppo ## fmt first, because it's the cheapest cargo +nightly fmt --all --check cargo check --all-targets --all-features + $(MAKE) check-fuzz CI_SKIP_GUEST_BUILD=1 cargo clippy --all-targets --all-features lint-fix: ## cargo fmt, fix and clippy. Skip clippy on guest code since it's not supported by risc0 diff --git a/adapters/avail/Cargo.toml b/adapters/avail/Cargo.toml new file mode 100644 index 000000000..4dc6f3b7c --- /dev/null +++ b/adapters/avail/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "sov-avail-adapter" +version.workspace = true +edition.workspace = true +license.workspace = true +authors.workspace = true +homepage.workspace = true +publish.workspace = true +repository.workspace = true +rust-version.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +borsh = { workspace = true, features = ["bytes"] } +sov-rollup-interface = { path = "../../rollup-interface" } +bytes = { version = "1.2.1", features = ["serde"]} +primitive-types = { version = "0.12.1", features = ["serde"]} +sp-core-hashing = "12.0.0" +subxt = { version = "0.29", optional = true } +avail-subxt = { git = "https://github.com/availproject/avail.git", tag = "v1.6.3", features = ["std"], optional = true } +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "full", "bit-vec"], optional = true } + +#Convenience +tokio = { workspace = true, optional = true } +tracing = { workspace = true } +tracing-subscriber = { version = "0.3.17", features = ["fmt"] } +async-trait = { workspace = true } +anyhow = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +reqwest = { version = "0.11", features = ["json"], optional = true } +thiserror = { workspace = true } +sp-keyring = { version = "24", optional = true } +sp-core = { version = "21", optional = true } + +[features] +default = ["native"] +native = ["dep:tokio", "dep:codec", "dep:reqwest", "dep:avail-subxt", "dep:subxt", "dep:sp-keyring", "dep:sp-core", "sov-rollup-interface/native"] +verifier = [] diff --git a/adapters/avail/README.md b/adapters/avail/README.md new file mode 100644 index 000000000..ce54aac1a --- /dev/null +++ b/adapters/avail/README.md @@ -0,0 +1,8 @@ +# Avail Sovereign DA adapter (presence) + +This is a _research-only_ adapter making Avail compatible with the Sovereign SDK. + +> **_NOTE:_** None of its code is suitable for production use. + +This adapter was originally written by Vibhu Rajeev, Aleksandar Terentić and the Avail team, but is +provided as part of the Sovereign SDK under the Apache 2.0 and MIT licenses. diff --git a/adapters/avail/src/avail.rs b/adapters/avail/src/avail.rs new file mode 100644 index 000000000..05351659e --- /dev/null +++ b/adapters/avail/src/avail.rs @@ -0,0 +1,15 @@ +use avail_subxt::primitives::AppUncheckedExtrinsic; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct Confidence { + pub block: u32, + pub confidence: f64, + pub serialised_confidence: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ExtrinsicsData { + pub block: u32, + pub extrinsics: Vec, +} diff --git a/adapters/avail/src/lib.rs b/adapters/avail/src/lib.rs new file mode 100644 index 000000000..10b076213 --- /dev/null +++ b/adapters/avail/src/lib.rs @@ -0,0 +1,10 @@ +#[cfg(feature = "native")] +mod avail; +#[cfg(feature = "native")] +pub mod service; +pub mod spec; +pub mod verifier; + +// NOTE: Remove once dependency to the node is removed +#[cfg(feature = "native")] +pub use avail_subxt::build_client; diff --git a/adapters/avail/src/service.rs b/adapters/avail/src/service.rs new file mode 100644 index 000000000..f195a6829 --- /dev/null +++ b/adapters/avail/src/service.rs @@ -0,0 +1,254 @@ +use core::time::Duration; + +use anyhow::anyhow; +use async_trait::async_trait; +use avail_subxt::api::runtime_types::sp_core::bounded::bounded_vec::BoundedVec; +use avail_subxt::primitives::AvailExtrinsicParams; +use avail_subxt::{api, AvailConfig}; +use reqwest::StatusCode; +use sov_rollup_interface::da::DaSpec; +use sov_rollup_interface::services::da::DaService; +use sp_core::crypto::Pair as PairTrait; +use sp_keyring::sr25519::sr25519::Pair; +use subxt::tx::PairSigner; +use subxt::OnlineClient; +use tracing::info; + +use crate::avail::{Confidence, ExtrinsicsData}; +use crate::spec::block::AvailBlock; +use crate::spec::header::AvailHeader; +use crate::spec::transaction::AvailBlobTransaction; +use crate::spec::DaLayerSpec; +use crate::verifier::Verifier; + +/// Runtime configuration for the DA service +#[derive(Clone, PartialEq, serde::Deserialize, serde::Serialize)] +pub struct DaServiceConfig { + pub light_client_url: String, + pub node_client_url: String, + //TODO: Safer strategy to load seed so it is not accidentally revealed. + pub seed: String, + pub polling_timeout: Option, + pub polling_interval: Option, + pub app_id: u32, +} + +const DEFAULT_POLLING_TIMEOUT: Duration = Duration::from_secs(60); +const DEFAULT_POLLING_INTERVAL: Duration = Duration::from_secs(1); + +#[derive(Clone)] +pub struct DaProvider { + pub node_client: OnlineClient, + pub light_client_url: String, + signer: PairSigner, + polling_timeout: Duration, + polling_interval: Duration, + app_id: u32, +} + +impl DaProvider { + fn appdata_url(&self, block_num: u64) -> String { + let light_client_url = self.light_client_url.clone(); + format!("{light_client_url}/v1/appdata/{block_num}") + } + + fn confidence_url(&self, block_num: u64) -> String { + let light_client_url = self.light_client_url.clone(); + format!("{light_client_url}/v1/confidence/{block_num}") + } + + pub async fn new(config: DaServiceConfig) -> Self { + let pair = Pair::from_string_with_seed(&config.seed, None).unwrap(); + let signer = PairSigner::::new(pair.0.clone()); + + let node_client = avail_subxt::build_client(config.node_client_url.to_string(), false) + .await + .unwrap(); + let light_client_url = config.light_client_url; + + DaProvider { + node_client, + light_client_url, + signer, + polling_timeout: match config.polling_timeout { + Some(i) => Duration::from_secs(i), + None => DEFAULT_POLLING_TIMEOUT, + }, + polling_interval: match config.polling_interval { + Some(i) => Duration::from_secs(i), + None => DEFAULT_POLLING_INTERVAL, + }, + app_id: config.app_id, + } + } +} + +// TODO: Is there a way to avoid coupling to tokio? + +async fn wait_for_confidence( + confidence_url: &str, + polling_timeout: Duration, + polling_interval: Duration, +) -> anyhow::Result<()> { + let start_time = std::time::Instant::now(); + + loop { + if start_time.elapsed() >= polling_timeout { + return Err(anyhow!( + "Confidence not received after timeout: {}s", + polling_timeout.as_secs() + )); + } + + let response = reqwest::get(confidence_url).await?; + if response.status() != StatusCode::OK { + info!("Confidence not received"); + tokio::time::sleep(polling_interval).await; + continue; + } + + let response: Confidence = serde_json::from_str(&response.text().await?)?; + if response.confidence < 92.5 { + info!("Confidence not reached"); + tokio::time::sleep(polling_interval).await; + continue; + } + + break; + } + + Ok(()) +} + +async fn wait_for_appdata( + appdata_url: &str, + block: u32, + polling_timeout: Duration, + polling_interval: Duration, +) -> anyhow::Result { + let start_time = std::time::Instant::now(); + + loop { + if start_time.elapsed() >= polling_timeout { + return Err(anyhow!( + "RPC call for filtered block to light client timed out. Timeout: {}s", + polling_timeout.as_secs() + )); + } + + let response = reqwest::get(appdata_url).await?; + if response.status() == StatusCode::NOT_FOUND { + return Ok(ExtrinsicsData { + block, + extrinsics: vec![], + }); + } + if response.status() != StatusCode::OK { + tokio::time::sleep(polling_interval).await; + continue; + } + + let appdata: ExtrinsicsData = serde_json::from_str(&response.text().await?)?; + return Ok(appdata); + } +} + +#[async_trait] +impl DaService for DaProvider { + type Spec = DaLayerSpec; + + type FilteredBlock = AvailBlock; + + type Verifier = Verifier; + + type Error = anyhow::Error; + + // Make an RPC call to the node to get the finalized block at the given height, if one exists. + // If no such block exists, block until one does. + async fn get_finalized_at(&self, height: u64) -> Result { + let node_client = self.node_client.clone(); + let confidence_url = self.confidence_url(height); + let appdata_url = self.appdata_url(height); + + wait_for_confidence(&confidence_url, self.polling_timeout, self.polling_interval).await?; + let appdata = wait_for_appdata( + &appdata_url, + height as u32, + self.polling_timeout, + self.polling_interval, + ) + .await?; + info!("Appdata: {:?}", appdata); + + let hash = match { node_client.rpc().block_hash(Some(height.into())).await? } { + Some(i) => i, + None => return Err(anyhow!("Hash for height: {} not found.", height)), + }; + + let header = match { node_client.rpc().header(Some(hash)).await? } { + Some(i) => i, + None => return Err(anyhow!("Header for hash: {} not found.", hash)), + }; + + let header = AvailHeader::new(header, hash); + let transactions: Result, anyhow::Error> = appdata + .extrinsics + .iter() + .map(AvailBlobTransaction::new) + .collect(); + + let transactions = transactions?; + Ok(AvailBlock { + header, + transactions, + }) + } + + // Make an RPC call to the node to get the block at the given height + // If no such block exists, block until one does. + async fn get_block_at(&self, height: u64) -> Result { + self.get_finalized_at(height).await + } + + // Extract the blob transactions relevant to a particular rollup from a block. + // NOTE: The avail light client is expected to be run in app specific mode, and hence the + // transactions in the block are already filtered and retrieved by light client. + fn extract_relevant_blobs( + &self, + block: &Self::FilteredBlock, + ) -> Vec<::BlobTransaction> { + block.transactions.clone() + } + + // Extract the inclusion and completenss proof for filtered block provided. + // The output of this method will be passed to the verifier. + // NOTE: The light client here has already completed DA sampling and verification of inclusion and soundness. + async fn get_extraction_proof( + &self, + _block: &Self::FilteredBlock, + _blobs: &[::BlobTransaction], + ) -> ( + ::InclusionMultiProof, + ::CompletenessProof, + ) { + ((), ()) + } + + async fn send_transaction(&self, blob: &[u8]) -> Result<(), Self::Error> { + let data_transfer = api::tx() + .data_availability() + .submit_data(BoundedVec(blob.to_vec())); + + let extrinsic_params = AvailExtrinsicParams::new_with_app_id(self.app_id.into()); + + let h = self + .node_client + .tx() + .sign_and_submit_then_watch(&data_transfer, &self.signer, extrinsic_params) + .await?; + + info!("Transaction submitted: {:#?}", h.extrinsic_hash()); + + Ok(()) + } +} diff --git a/adapters/avail/src/spec/address.rs b/adapters/avail/src/spec/address.rs new file mode 100644 index 000000000..d99b20748 --- /dev/null +++ b/adapters/avail/src/spec/address.rs @@ -0,0 +1,48 @@ +use core::fmt::{Display, Formatter}; +use std::hash::Hash; +use std::str::FromStr; + +use primitive_types::H256; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone, Eq, Hash)] +pub struct AvailAddress([u8; 32]); + +impl sov_rollup_interface::BasicAddress for AvailAddress {} + +impl Display for AvailAddress { + fn fmt(&self, f: &mut Formatter) -> core::fmt::Result { + let hash = H256(self.0); + write!(f, "{hash}") + } +} + +impl AsRef<[u8]> for AvailAddress { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} + +impl From<[u8; 32]> for AvailAddress { + fn from(value: [u8; 32]) -> Self { + Self(value) + } +} + +impl FromStr for AvailAddress { + type Err = ::Err; + + fn from_str(s: &str) -> Result { + let h_256 = H256::from_str(s)?; + + Ok(Self(h_256.to_fixed_bytes())) + } +} + +impl<'a> TryFrom<&'a [u8]> for AvailAddress { + type Error = anyhow::Error; + + fn try_from(value: &'a [u8]) -> Result { + Ok(Self(<[u8; 32]>::try_from(value)?)) + } +} diff --git a/adapters/avail/src/spec/block.rs b/adapters/avail/src/spec/block.rs new file mode 100644 index 000000000..8884f3360 --- /dev/null +++ b/adapters/avail/src/spec/block.rs @@ -0,0 +1,40 @@ +use serde::{Deserialize, Serialize}; +use sov_rollup_interface::da::BlockHeaderTrait; +use sov_rollup_interface::services::da::SlotData; + +use super::header::AvailHeader; +use super::transaction::AvailBlobTransaction; +use crate::verifier::ChainValidityCondition; + +#[derive(Serialize, Deserialize, PartialEq, Clone, Debug)] +pub struct AvailBlock { + pub header: AvailHeader, + pub transactions: Vec, +} + +impl SlotData for AvailBlock { + type BlockHeader = AvailHeader; + type Cond = ChainValidityCondition; + + fn hash(&self) -> [u8; 32] { + *self.header.hash().inner() + } + + fn header(&self) -> &Self::BlockHeader { + &self.header + } + + fn validity_condition(&self) -> ChainValidityCondition { + let mut txs_commitment: [u8; 32] = [0u8; 32]; + + for tx in &self.transactions { + txs_commitment = tx.combine_hash(txs_commitment); + } + + ChainValidityCondition { + prev_hash: *self.header().prev_hash().inner(), + block_hash: ::hash(self), + txs_commitment, + } + } +} diff --git a/adapters/avail/src/spec/hash.rs b/adapters/avail/src/spec/hash.rs new file mode 100644 index 000000000..aa0b1546c --- /dev/null +++ b/adapters/avail/src/spec/hash.rs @@ -0,0 +1,32 @@ +use primitive_types::H256; +use serde::{Deserialize, Serialize}; +use sov_rollup_interface::da::BlockHashTrait; + +#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)] +pub struct AvailHash(H256); + +impl AvailHash { + pub fn new(hash: H256) -> Self { + Self(hash) + } +} + +impl BlockHashTrait for AvailHash {} + +impl AsRef<[u8]> for AvailHash { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} + +impl From for [u8; 32] { + fn from(value: AvailHash) -> Self { + value.0.to_fixed_bytes() + } +} + +impl AvailHash { + pub fn inner(&self) -> &[u8; 32] { + self.0.as_fixed_bytes() + } +} diff --git a/adapters/avail/src/spec/header.rs b/adapters/avail/src/spec/header.rs new file mode 100644 index 000000000..058b6343e --- /dev/null +++ b/adapters/avail/src/spec/header.rs @@ -0,0 +1,65 @@ +#[cfg(feature = "native")] +use avail_subxt::primitives::Header as SubxtHeader; +use primitive_types::H256; +use serde::{Deserialize, Serialize}; +use sov_rollup_interface::da::BlockHeaderTrait; + +const KATE_START_TIME: i64 = 1686066440; +const KATE_SECONDS_PER_BLOCK: i64 = 20; + +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] +#[serde(rename_all = "camelCase")] +pub struct Header { + pub parent_hash: H256, + pub number: u32, + pub state_root: H256, + pub extrinsics_root: H256, + pub data_root: H256, +} + +use super::hash::AvailHash; + +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] +pub struct AvailHeader { + hash: AvailHash, + + pub header: Header, +} + +#[cfg(feature = "native")] +impl AvailHeader { + pub fn new(header: SubxtHeader, hash: H256) -> Self { + Self { + hash: AvailHash::new(hash), + header: Header { + parent_hash: header.parent_hash, + number: header.number, + state_root: header.state_root, + data_root: header.data_root(), + extrinsics_root: header.extrinsics_root, + }, + } + } +} + +impl BlockHeaderTrait for AvailHeader { + type Hash = AvailHash; + + fn prev_hash(&self) -> Self::Hash { + AvailHash::new(self.header.parent_hash) + } + + fn hash(&self) -> Self::Hash { + self.hash.clone() + } + + fn height(&self) -> u64 { + self.header.number as u64 + } + + fn time(&self) -> sov_rollup_interface::da::Time { + sov_rollup_interface::da::Time::from_secs( + KATE_START_TIME + (self.header.number as i64 * KATE_SECONDS_PER_BLOCK), + ) + } +} diff --git a/adapters/avail/src/spec/mod.rs b/adapters/avail/src/spec/mod.rs new file mode 100644 index 000000000..283b7ab67 --- /dev/null +++ b/adapters/avail/src/spec/mod.rs @@ -0,0 +1,30 @@ +use sov_rollup_interface::da::DaSpec; + +use crate::verifier::ChainValidityCondition; + +pub mod address; +pub mod block; +mod hash; +pub mod header; +pub mod transaction; + +#[derive(serde::Serialize, serde::Deserialize, PartialEq, Eq, Debug, Clone)] +pub struct DaLayerSpec; + +impl DaSpec for DaLayerSpec { + type ValidityCondition = ChainValidityCondition; + + type SlotHash = hash::AvailHash; + + type ChainParams = (); + + type BlockHeader = header::AvailHeader; + + type BlobTransaction = transaction::AvailBlobTransaction; + + type Address = address::AvailAddress; + + type InclusionMultiProof = (); + + type CompletenessProof = (); +} diff --git a/adapters/avail/src/spec/transaction.rs b/adapters/avail/src/spec/transaction.rs new file mode 100644 index 000000000..b09662dbb --- /dev/null +++ b/adapters/avail/src/spec/transaction.rs @@ -0,0 +1,87 @@ +#[cfg(feature = "native")] +use anyhow::anyhow; +#[cfg(feature = "native")] +use avail_subxt::{ + api::runtime_types::{da_control::pallet::Call, da_runtime::RuntimeCall::DataAvailability}, + primitives::AppUncheckedExtrinsic, +}; +use bytes::Bytes; +#[cfg(feature = "native")] +use codec::Encode; +use serde::{Deserialize, Serialize}; +use sov_rollup_interface::da::{BlobReaderTrait, CountedBufReader}; + +use super::address::AvailAddress; + +#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] + +pub struct AvailBlobTransaction { + blob: CountedBufReader, + hash: [u8; 32], + address: AvailAddress, +} + +impl BlobReaderTrait for AvailBlobTransaction { + type Address = AvailAddress; + + fn sender(&self) -> AvailAddress { + self.address.clone() + } + + fn hash(&self) -> [u8; 32] { + self.hash + } + + fn verified_data(&self) -> &[u8] { + self.blob.accumulator() + } + + #[cfg(feature = "native")] + fn advance(&mut self, num_bytes: usize) -> &[u8] { + self.blob.advance(num_bytes); + self.verified_data() + } + + fn total_len(&self) -> usize { + self.blob.total_len() + } +} + +impl AvailBlobTransaction { + #[cfg(feature = "native")] + pub fn new(unchecked_extrinsic: &AppUncheckedExtrinsic) -> anyhow::Result { + let address = match &unchecked_extrinsic.signature { + //TODO: Handle other types of MultiAddress. + Some((subxt::utils::MultiAddress::Id(id), _, _)) => AvailAddress::from(id.clone().0), + _ => { + return Err(anyhow!( + "Unsigned extrinsic being used to create AvailBlobTransaction." + )) + } + }; + let blob = match &unchecked_extrinsic.function { + DataAvailability(Call::submit_data { data }) => { + CountedBufReader::::new(Bytes::copy_from_slice(&data.0)) + } + _ => { + return Err(anyhow!( + "Invalid type of extrinsic being converted to AvailBlobTransaction." + )) + } + }; + + Ok(AvailBlobTransaction { + hash: sp_core_hashing::blake2_256(&unchecked_extrinsic.encode()), + address, + blob, + }) + } + + pub fn combine_hash(&self, hash: [u8; 32]) -> [u8; 32] { + let mut combined_hashes: Vec = Vec::with_capacity(64); + combined_hashes.extend_from_slice(hash.as_ref()); + combined_hashes.extend_from_slice(self.hash().as_ref()); + + sp_core_hashing::blake2_256(&combined_hashes) + } +} diff --git a/adapters/avail/src/verifier.rs b/adapters/avail/src/verifier.rs new file mode 100644 index 000000000..f225b71ba --- /dev/null +++ b/adapters/avail/src/verifier.rs @@ -0,0 +1,82 @@ +use borsh::{BorshDeserialize, BorshSerialize}; +use serde::{Deserialize, Serialize}; +use sov_rollup_interface::da::{BlockHeaderTrait, DaSpec, DaVerifier}; +use sov_rollup_interface::zk::ValidityCondition; +use thiserror::Error; + +use crate::spec::DaLayerSpec; + +#[derive(Error, Debug)] +pub enum ValidityConditionError { + #[error("conditions for validity can only be combined if the blocks are consecutive")] + BlocksNotConsecutive, +} + +#[derive( + Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Copy, BorshDeserialize, BorshSerialize, +)] +/// A validity condition expressing that a chain of DA layer blocks is contiguous and canonical +pub struct ChainValidityCondition { + pub prev_hash: [u8; 32], + pub block_hash: [u8; 32], + //Chained or batch txs commitment. + pub txs_commitment: [u8; 32], +} + +impl ValidityCondition for ChainValidityCondition { + type Error = ValidityConditionError; + + fn combine(&self, rhs: Self) -> Result { + let mut combined_hashes: Vec = Vec::with_capacity(64); + combined_hashes.extend_from_slice(self.txs_commitment.as_ref()); + combined_hashes.extend_from_slice(rhs.txs_commitment.as_ref()); + + let combined_root = sp_core_hashing::blake2_256(&combined_hashes); + + if self.block_hash != rhs.prev_hash { + return Err(ValidityConditionError::BlocksNotConsecutive); + } + + Ok(Self { + prev_hash: rhs.prev_hash, + block_hash: rhs.block_hash, + txs_commitment: combined_root, + }) + } +} + +pub struct Verifier; + +impl DaVerifier for Verifier { + type Spec = DaLayerSpec; + + type Error = ValidityConditionError; + + // Verify that the given list of blob transactions is complete and correct. + // NOTE: Function return unit since application client already verifies application data. + fn verify_relevant_tx_list( + &self, + block_header: &::BlockHeader, + txs: &[::BlobTransaction], + _inclusion_proof: ::InclusionMultiProof, + _completeness_proof: ::CompletenessProof, + ) -> Result<::ValidityCondition, Self::Error> { + let mut txs_commitment: [u8; 32] = [0u8; 32]; + + for tx in txs { + txs_commitment = tx.combine_hash(txs_commitment); + } + + let validity_condition = ChainValidityCondition { + prev_hash: *block_header.prev_hash().inner(), + block_hash: *block_header.hash().inner(), + txs_commitment, + }; + + Ok(validity_condition) + } + + fn new(_params: ::ChainParams) -> Self { + Verifier {} + } +} diff --git a/adapters/celestia/Cargo.toml b/adapters/celestia/Cargo.toml index 455311280..8baa79558 100644 --- a/adapters/celestia/Cargo.toml +++ b/adapters/celestia/Cargo.toml @@ -10,12 +10,19 @@ publish = false [dependencies] borsh = { workspace = true, features = ["bytes"] } bech32 = { workspace = true } -prost = "0.11" -prost-types = "0.11" +prost = "0.12" # I keep this commented as a reminder to opportunity to optimze this crate for non native compilation #tendermint = { version = "0.32", default-features = false, features = ["std"] } -tendermint = "0.32" -tendermint-proto = "0.32" + +celestia-proto = { git = "https://github.com/eigerco/celestia-node-rs.git", rev = "dfe8f2f" } +celestia-rpc = { git = "https://github.com/eigerco/celestia-node-rs.git", rev = "dfe8f2f", default-features = false, optional = true } +celestia-types = { git = "https://github.com/eigerco/celestia-node-rs.git", rev = "dfe8f2f" } +tendermint = { git = "https://github.com/eigerco/celestia-tendermint-rs.git", rev = "1f8b574", default-features = false } +tendermint-proto = { git = "https://github.com/eigerco/celestia-tendermint-rs.git", rev = "1f8b574" } +nmt-rs = { git = "https://github.com/Sovereign-Labs/nmt-rs.git", rev = "d821332", features = [ + "serde", + "borsh", +] } # Convenience async-trait = { workspace = true } @@ -23,7 +30,6 @@ anyhow = { workspace = true } sha2 = { workspace = true } base64 = "0.21.2" hex = { workspace = true, features = ["serde"] } -hex-literal = "0.4.1" jsonrpsee = { workspace = true, features = ["http-client"], optional = true } serde = { workspace = true } serde_json = { workspace = true, optional = true } @@ -31,28 +37,29 @@ tokio = { workspace = true, optional = true } thiserror = { workspace = true } tracing = { workspace = true } sov-zk-cycle-macros = { path = "../../utils/zk-cycle-macros", version = "0.2", optional = true } -risc0-zkvm = { workspace = true, default-features = false, features = ["std"], optional = true } +risc0-zkvm = { workspace = true, default-features = false, features = [ + "std", +], optional = true } risc0-zkvm-platform = { workspace = true, optional = true } sov-rollup-interface = { path = "../../rollup-interface", version = "0.2" } -nmt-rs = { git = "https://github.com/Sovereign-Labs/nmt-rs.git", rev = "dd37588444fca72825d11fe4a46838f66525c49f", features = [ - "serde", - "borsh", -] } [dev-dependencies] postcard = { version = "1", features = ["use-std"] } -proptest = { version = "1.2" } +proptest = { version = "1.3" } sov-celestia-adapter = { path = ".", features = ["native"] } wiremock = "0.5" - -[build-dependencies] -prost-build = { version = "0.12" } - [features] default = [] -native = ["dep:tokio", "dep:jsonrpsee", "dep:serde_json", "tendermint/default", "sov-rollup-interface/native"] +native = [ + "dep:tokio", + "dep:jsonrpsee", + "dep:serde_json", + "dep:celestia-rpc", + "tendermint/default", + "sov-rollup-interface/native", +] bench = ["sov-zk-cycle-macros/bench", "risc0-zkvm", "risc0-zkvm-platform"] verifier = [] diff --git a/adapters/celestia/src/celestia.rs b/adapters/celestia/src/celestia.rs index 1affaabcf..e77284e5d 100644 --- a/adapters/celestia/src/celestia.rs +++ b/adapters/celestia/src/celestia.rs @@ -1,10 +1,11 @@ use std::ops::Range; use std::sync::{Arc, Mutex}; -use base64::engine::general_purpose::STANDARD as B64_ENGINE; -use base64::Engine; +use anyhow::Context; use borsh::{BorshDeserialize, BorshSerialize}; -use nmt_rs::NamespacedHash; +use celestia_proto::celestia::blob::v1::MsgPayForBlobs; +use celestia_proto::cosmos::tx::v1beta1::Tx; +use celestia_types::DataAvailabilityHeader; use prost::bytes::Buf; use prost::Message; use serde::{Deserialize, Serialize}; @@ -16,24 +17,16 @@ use tendermint::crypto::default::Sha256; use tendermint::merkle::simple_hash_from_byte_vectors; use tendermint::Hash; pub use tendermint_proto::v0_34 as celestia_tm_version; +use tendermint_proto::v0_34::types::IndexWrapper; use tendermint_proto::Protobuf; use tracing::debug; -const NAMESPACED_HASH_LEN: usize = 48; - -pub const GENESIS_PLACEHOLDER_HASH: &[u8; 32] = &[255; 32]; - -use crate::pfb::{BlobTx, MsgPayForBlobs, Tx}; -use crate::shares::{read_varint, BlobIterator, BlobRefIterator, NamespaceGroup}; -use crate::utils::BoxError; +use crate::shares::{BlobIterator, BlobRefIterator, NamespaceGroup}; +use crate::utils::{read_varint, BoxError}; use crate::verifier::address::CelestiaAddress; use crate::verifier::{ChainValidityCondition, TmHash, PFB_NAMESPACE}; -#[derive(Deserialize, Serialize, PartialEq, Debug, Clone)] -pub struct MarshalledDataAvailabilityHeader { - pub row_roots: Vec, - pub column_roots: Vec, -} +pub const GENESIS_PLACEHOLDER_HASH: &[u8; 32] = &[255; 32]; /// A partially serialized tendermint header. Only fields which are actually inspected by /// Jupiter are included in their raw form. Other fields are pre-encoded as protobufs. @@ -42,7 +35,7 @@ pub struct MarshalledDataAvailabilityHeader { /// a tendermint::block::Header from being deserialized in most formats except JSON. However /// it also provides a significant efficiency benefit over the standard tendermint type, which /// performs a complete protobuf serialization every time `.hash()` is called. -#[derive(PartialEq, Eq, Debug, Clone, Serialize, Deserialize, BorshDeserialize, BorshSerialize)] +#[derive(PartialEq, Eq, Debug, Clone, Serialize, Deserialize)] // TODO: , BorshDeserialize, BorshSerialize)] pub struct CompactHeader { /// Header version pub version: Vec, @@ -93,13 +86,9 @@ trait EncodeTm34 { impl From for CompactHeader { fn from(value: TendermintHeader) -> Self { - let data_hash = if let Some(h) = value.data_hash { - match h { - Hash::Sha256(value) => Some(ProtobufHash(value)), - Hash::None => None, - } - } else { - None + let data_hash = match value.data_hash { + Hash::Sha256(value) => Some(ProtobufHash(value)), + Hash::None => None, }; Self { version: Protobuf::::encode_vec( @@ -113,26 +102,14 @@ impl From for CompactHeader { &value.last_block_id.unwrap_or_default(), ) .unwrap(), - last_commit_hash: value - .last_commit_hash - .unwrap_or_default() - .encode_vec() - .unwrap(), + last_commit_hash: value.last_commit_hash.encode_vec().unwrap(), data_hash, validators_hash: value.validators_hash.encode_vec().unwrap(), next_validators_hash: value.next_validators_hash.encode_vec().unwrap(), consensus_hash: value.consensus_hash.encode_vec().unwrap(), app_hash: value.app_hash.encode_vec().unwrap(), - last_results_hash: value - .last_results_hash - .unwrap_or_default() - .encode_vec() - .unwrap(), - evidence_hash: value - .evidence_hash - .unwrap_or_default() - .encode_vec() - .unwrap(), + last_results_hash: value.last_results_hash.encode_vec().unwrap(), + evidence_hash: value.evidence_hash.encode_vec().unwrap(), proposer_address: value.proposer_address.encode_vec().unwrap(), } } @@ -181,57 +158,11 @@ impl CompactHeader { } } -#[derive(PartialEq, Debug, Clone, Serialize, Deserialize, BorshSerialize, BorshDeserialize)] -pub struct DataAvailabilityHeader { - pub row_roots: Vec, - pub column_roots: Vec, -} - -// Danger! This method panics if the provided bas64 is longer than a namespaced hash -fn decode_to_ns_hash(b64: &str) -> Result { - let mut out = [0u8; NAMESPACED_HASH_LEN]; - B64_ENGINE.decode_slice(b64.as_bytes(), &mut out)?; - Ok(NamespacedHash(out)) -} - -impl TryFrom for DataAvailabilityHeader { - type Error = base64::DecodeSliceError; - - fn try_from(value: MarshalledDataAvailabilityHeader) -> Result { - let mut row_roots = Vec::with_capacity(value.row_roots.len()); - for root in value.row_roots { - row_roots.push(decode_to_ns_hash(&root)?); - } - let mut column_roots = Vec::with_capacity(value.column_roots.len()); - for root in value.column_roots { - column_roots.push(decode_to_ns_hash(&root)?); - } - Ok(Self { - row_roots, - column_roots, - }) - } -} - -/// The response from the celestia `/header` endpoint. Must be converted to a -/// [`CelestiaHeader`] before use. -#[derive(Deserialize, Serialize, PartialEq, Debug, Clone)] -pub struct CelestiaHeaderResponse { - pub header: tendermint::block::Header, - pub dah: MarshalledDataAvailabilityHeader, -} - -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -pub struct NamespacedSharesResponse { - pub shares: Option>, - pub height: u64, -} - -#[derive(Debug, Clone, Serialize, Deserialize, BorshSerialize, BorshDeserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] // TODO:, BorshSerialize, BorshDeserialize)] pub struct CelestiaHeader { pub dah: DataAvailabilityHeader, pub header: CompactHeader, - #[borsh_skip] + // #[borsh_skip] #[serde(skip)] cached_prev_hash: Arc>>, } @@ -256,7 +187,7 @@ impl CelestiaHeader { } } -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, BorshDeserialize, BorshSerialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] // TODO: , BorshDeserialize, BorshSerialize)] pub struct BlobWithSender { pub blob: CountedBufReader, pub sender: CelestiaAddress, @@ -388,31 +319,25 @@ pub struct TxPosition { } pub(crate) fn pfb_from_iter(data: impl Buf, pfb_len: usize) -> Result { - debug!("Decoding blob tx"); - let mut blob_tx = BlobTx::decode(data.take(pfb_len))?; - debug!("Decoding cosmos sdk tx"); - let cosmos_tx = Tx::decode(&mut blob_tx.tx)?; - let messages = cosmos_tx - .body - .ok_or(anyhow::format_err!("No body in cosmos tx"))? - .messages; - if messages.len() != 1 { - return Err(anyhow::format_err!("Expected 1 message in cosmos tx")); - } - debug!("Decoding PFB from blob tx value"); - Ok(MsgPayForBlobs::decode(&mut &messages[0].value[..])?) + let blob_tx = IndexWrapper::decode(data.take(pfb_len)).context("failed decoding blob tx")?; + let cosmos_tx = + Tx::decode(&blob_tx.tx[..]).context("failed decoding cosmos tx from blob tx")?; + let messages = cosmos_tx.body.context("No body in cosmos tx")?.messages; + + anyhow::ensure!(messages.len() == 1, "Expected 1 message in cosmos tx"); + MsgPayForBlobs::decode(&messages[0].value[..]).context("failed decoding PFB frob cosmos tx") } fn next_pfb(mut data: &mut BlobRefIterator) -> Result<(MsgPayForBlobs, TxPosition), BoxError> { let (start_idx, start_offset) = data.current_position(); - let (len, len_of_len) = read_varint(&mut data).expect("Varint must be valid"); + let (len, len_of_len) = read_varint(&mut data).context("failed decoding varint")?; debug!( "Decoding wrapped PFB of length {}. Stripped {} bytes of prefix metadata", len, len_of_len ); let current_share_idx = data.current_position().0; - let pfb = pfb_from_iter(&mut data, len as usize)?; + let pfb = pfb_from_iter(data, len as usize)?; Ok(( pfb, @@ -425,37 +350,87 @@ fn next_pfb(mut data: &mut BlobRefIterator) -> Result<(MsgPayForBlobs, TxPositio #[cfg(test)] mod tests { - use crate::{CelestiaHeaderResponse, CompactHeader}; + use celestia_types::ExtendedHeader; + use sov_rollup_interface::services::da::SlotData; + use sov_rollup_interface::zk::ValidityCondition; + + use crate::{CelestiaHeader, CompactHeader}; - const HEADER_RESPONSE_JSON: &[u8] = include_bytes!("./header_response.json"); + const HEADER_JSON_RESPONSES: &[&str] = &[ + include_str!("../test_data/block_with_rollup_data/header.json"), + include_str!("../test_data/block_without_rollup_data/header.json"), + ]; + + #[test] + fn test_validity_condition() { + let headers: Vec<_> = HEADER_JSON_RESPONSES + .iter() + .map(|header| { + let eh: ExtendedHeader = serde_json::from_str(header).unwrap(); + CelestiaHeader::new(eh.dah, eh.header.into()) + }) + .collect(); + + let former_validity_cond = headers[0].validity_condition(); + let latter_validity_cond = headers[1].validity_condition(); + + assert!(former_validity_cond + .combine::(latter_validity_cond) + .is_ok()); + assert!(latter_validity_cond + .combine::(former_validity_cond) + .is_err()); + } #[test] fn test_compact_header_serde() { - let original_header: CelestiaHeaderResponse = - serde_json::from_slice(HEADER_RESPONSE_JSON).unwrap(); + for header_json in HEADER_JSON_RESPONSES { + let original_header: ExtendedHeader = serde_json::from_str(header_json).unwrap(); - let header: CompactHeader = original_header.header.into(); + let header: CompactHeader = original_header.header.into(); - let serialized_header = postcard::to_stdvec(&header).unwrap(); - let deserialized_header: CompactHeader = postcard::from_bytes(&serialized_header).unwrap(); - assert_eq!(deserialized_header, header) + let serialized_header = postcard::to_stdvec(&header).unwrap(); + let deserialized_header: CompactHeader = + postcard::from_bytes(&serialized_header).unwrap(); + assert_eq!(deserialized_header, header) + } } #[test] fn test_compact_header_hash() { - let original_header: CelestiaHeaderResponse = - serde_json::from_slice(HEADER_RESPONSE_JSON).unwrap(); + let expected_hashes = [ + "C839E720DA55CC6E43EC7CE00744D6151D79E84C81D7F6995F3B13B7AE532456", + "F769490DC768E7678160384070727533B7AE809477EA5D191CF7AF5C917A7973", + ]; + for (header_json, expected_hash) in HEADER_JSON_RESPONSES.iter().zip(expected_hashes.iter()) + { + let original_header: ExtendedHeader = serde_json::from_str(header_json).unwrap(); + + let tm_header = original_header.header.clone(); + let compact_header: CompactHeader = original_header.header.into(); - let tm_header = original_header.header.clone(); - let compact_header: CompactHeader = original_header.header.into(); + assert_eq!(tm_header.hash(), compact_header.hash()); + assert_eq!( + hex::decode(expected_hash).unwrap(), + compact_header.hash().as_bytes() + ); - assert_eq!(tm_header.hash(), compact_header.hash()); - assert_eq!( - hex::decode("32381A0B7262F15F081ACEF769EE59E6BB4C42C1013A3EEE23967FBF32B86AE6") - .unwrap(), - compact_header.hash().as_bytes() - ); + assert_eq!(tm_header.hash(), compact_header.hash(),); + } + } - assert_eq!(tm_header.hash(), compact_header.hash(),); + #[test] + fn test_zkvm_serde_celestia_header() { + // regression https://github.com/eigerco/celestia-tendermint-rs/pull/12 + for header_json in HEADER_JSON_RESPONSES { + let original_header: ExtendedHeader = serde_json::from_str(header_json).unwrap(); + let cel_header = + CelestiaHeader::new(original_header.dah, original_header.header.into()); + + let serialized = risc0_zkvm::serde::to_vec(&cel_header).unwrap(); + let deserialized = risc0_zkvm::serde::from_slice(&serialized).unwrap(); + + assert_eq!(cel_header, deserialized); + } } } diff --git a/adapters/celestia/src/da_service.rs b/adapters/celestia/src/da_service.rs index e1eeb9e28..e90181b74 100644 --- a/adapters/celestia/src/da_service.rs +++ b/adapters/celestia/src/da_service.rs @@ -1,40 +1,34 @@ -use std::collections::HashMap; -use std::str::FromStr; - use async_trait::async_trait; -use base64::engine::general_purpose::STANDARD as B64_ENGINE; -use base64::Engine; -use jsonrpsee::core::client::ClientT; -use jsonrpsee::core::params::ArrayParams; +use celestia_rpc::prelude::*; +use celestia_types::blob::{Blob as JsonBlob, Commitment, SubmitOptions}; +use celestia_types::consts::appconsts::{ + CONTINUATION_SPARSE_SHARE_CONTENT_SIZE, FIRST_SPARSE_SHARE_CONTENT_SIZE, SHARE_SIZE, +}; +use celestia_types::nmt::Namespace; use jsonrpsee::http_client::{HeaderMap, HttpClient}; -use nmt_rs::NamespaceId; use sov_rollup_interface::da::CountedBufReader; use sov_rollup_interface::services::da::DaService; -use tracing::{debug, info, span, Level}; +use tracing::{debug, info, instrument, trace}; -use crate::share_commit::recreate_commitment; -use crate::shares::{Blob, NamespaceGroup, Share}; -use crate::types::{ExtendedDataSquare, FilteredCelestiaBlock, Row, RpcNamespacedSharesResponse}; +use crate::shares::Blob; +use crate::types::FilteredCelestiaBlock; use crate::utils::BoxError; -use crate::verifier::address::CelestiaAddress; use crate::verifier::proofs::{CompletenessProof, CorrectnessProof}; use crate::verifier::{CelestiaSpec, CelestiaVerifier, RollupParams, PFB_NAMESPACE}; -use crate::{ - parse_pfb_namespace, BlobWithSender, CelestiaHeader, CelestiaHeaderResponse, - DataAvailabilityHeader, -}; +use crate::BlobWithSender; // Approximate value, just to make it work. -const GAS_PER_BYTE: usize = 120; +const GAS_PER_BYTE: usize = 20; +const GAS_PRICE: usize = 1; #[derive(Debug, Clone)] pub struct CelestiaService { client: HttpClient, - rollup_namespace: NamespaceId, + rollup_namespace: Namespace, } impl CelestiaService { - pub fn with_client(client: HttpClient, nid: NamespaceId) -> Self { + pub fn with_client(client: HttpClient, nid: Namespace) -> Self { Self { client, rollup_namespace: nid, @@ -42,50 +36,6 @@ impl CelestiaService { } } -/// Fetch the rollup namespace shares and etx data. Returns a tuple `(rollup_shares, etx_shares)` -async fn fetch_needed_shares_by_header( - rollup_namespace: NamespaceId, - client: &HttpClient, - header: &serde_json::Value, -) -> Result<(NamespaceGroup, NamespaceGroup), BoxError> { - let dah = header - .get("dah") - .ok_or(BoxError::msg("missing dah in block header"))?; - let rollup_namespace_str = B64_ENGINE.encode(rollup_namespace).into(); - let rollup_shares_future = { - let params: Vec<&serde_json::Value> = vec![dah, &rollup_namespace_str]; - client.request::("share.GetSharesByNamespace", params) - }; - - let etx_namespace_str = B64_ENGINE.encode(PFB_NAMESPACE).into(); - let etx_shares_future = { - let params: Vec<&serde_json::Value> = vec![dah, &etx_namespace_str]; - client.request::("share.GetSharesByNamespace", params) - }; - - let (rollup_shares_resp, etx_shares_resp) = - tokio::join!(rollup_shares_future, etx_shares_future); - - let rollup_shares = NamespaceGroup::Sparse( - rollup_shares_resp? - .0 - .unwrap_or_default() - .into_iter() - .flat_map(|resp| resp.shares) - .collect(), - ); - let tx_data = NamespaceGroup::Compact( - etx_shares_resp? - .0 - .unwrap_or_default() - .into_iter() - .flat_map(|resp| resp.shares) - .collect(), - ); - - Ok((rollup_shares, tx_data)) -} - /// Runtime configuration for the DA service #[derive(Debug, Clone, PartialEq, serde::Deserialize, serde::Serialize)] pub struct DaServiceConfig { @@ -149,83 +99,51 @@ impl DaService for CelestiaService { type Error = BoxError; + #[instrument(skip(self), err)] async fn get_finalized_at(&self, height: u64) -> Result { let client = self.client.clone(); let rollup_namespace = self.rollup_namespace; - let _span = span!(Level::TRACE, "fetching finalized block", height = height); // Fetch the header and relevant shares via RPC - debug!("Fetching header at height={}...", height); - let header = client - .request::("header.GetByHeight", vec![height]) - .await?; - debug!(header_result = ?header); - debug!("Fetching shares..."); - let (rollup_shares, tx_data) = - fetch_needed_shares_by_header(rollup_namespace, &client, &header).await?; - - debug!("Fetching EDS..."); - // Fetch entire extended data square - let data_square = client - .request::( - "share.GetEDS", - vec![header - .get("dah") - .ok_or(BoxError::msg("missing 'dah' in block header"))?], - ) - .await?; - - let unmarshalled_header: CelestiaHeaderResponse = serde_json::from_value(header)?; - let dah: DataAvailabilityHeader = unmarshalled_header.dah.try_into()?; - debug!("Parsing namespaces..."); - // Parse out all of the rows containing etxs - let etx_rows = - get_rows_containing_namespace(PFB_NAMESPACE, &dah, data_square.rows()?.into_iter()) - .await?; - // Parse out all of the rows containing rollup data - let rollup_rows = - get_rows_containing_namespace(rollup_namespace, &dah, data_square.rows()?.into_iter()) - .await?; - - debug!("Decoding pfb protobufs..."); - // Parse out the pfds and store them for later retrieval - let pfds = parse_pfb_namespace(tx_data)?; - let mut pfd_map = HashMap::new(); - for tx in pfds { - for (idx, nid) in tx.0.namespace_ids.iter().enumerate() { - if nid == &rollup_namespace.0[..] { - // TODO: Retool this map to avoid cloning txs - pfd_map.insert(tx.0.share_commitments[idx].clone(), tx.clone()); - } - } - } - - let filtered_block = FilteredCelestiaBlock { - header: CelestiaHeader::new(dah, unmarshalled_header.header.into()), - rollup_data: rollup_shares, - relevant_pfbs: pfd_map, + debug!("Fetching header"); + let header = client.header_get_by_height(height).await?; + trace!(header_result = ?header); + + // Fetch the rollup namespace shares, etx data and extended data square + debug!("Fetching rollup data..."); + let rollup_rows_future = + client.share_get_shares_by_namespace(&header.dah, rollup_namespace); + let etx_rows_future = client.share_get_shares_by_namespace(&header.dah, PFB_NAMESPACE); + let data_square_future = client.share_get_eds(&header.dah); + + let (rollup_rows, etx_rows, data_square) = + tokio::try_join!(rollup_rows_future, etx_rows_future, data_square_future)?; + + FilteredCelestiaBlock::new( + self.rollup_namespace, + header, rollup_rows, - pfb_rows: etx_rows, - }; - - Ok::(filtered_block) + etx_rows, + data_square, + ) } async fn get_block_at(&self, height: u64) -> Result { self.get_finalized_at(height).await } - fn extract_relevant_txs( + fn extract_relevant_blobs( &self, block: &Self::FilteredBlock, ) -> Vec<::BlobTransaction> { let mut output = Vec::new(); for blob_ref in block.rollup_data.blobs() { - let commitment = recreate_commitment(block.square_size(), blob_ref.clone()) + let commitment = Commitment::from_shares(self.rollup_namespace, blob_ref.0) .expect("blob must be valid"); + info!("Blob: {:?}", commitment); let sender = block .relevant_pfbs - .get(&commitment[..]) + .get(&commitment.0[..]) .expect("blob must be relevant") .0 .signer @@ -235,8 +153,8 @@ impl DaService for CelestiaService { let blob_tx = BlobWithSender { blob: CountedBufReader::new(blob.into_iter()), - sender: CelestiaAddress::from_str(&sender).expect("Incorrect sender address"), - hash: commitment, + sender: sender.parse().expect("Incorrect sender address"), + hash: commitment.0, }; output.push(blob_tx) @@ -253,131 +171,97 @@ impl DaService for CelestiaService { ::CompletenessProof, ) { let etx_proofs = CorrectnessProof::for_block(block, blobs); - let rollup_row_proofs = - CompletenessProof::from_filtered_block(block, self.rollup_namespace); + let rollup_row_proofs = CompletenessProof::from_filtered_block(block); (etx_proofs.0, rollup_row_proofs.0) } + #[instrument(skip_all, err)] async fn send_transaction(&self, blob: &[u8]) -> Result<(), Self::Error> { - // https://node-rpc-docs.celestia.org/ - let client = self.client.clone(); debug!("Sending {} bytes of raw data to Celestia.", blob.len()); - let fee: u64 = 2000; - let namespace = self.rollup_namespace.0.to_vec(); - let blob = blob.to_vec(); - // We factor extra share to be occupied for namespace, which is pessimistic - let gas_limit = get_gas_limit_for_bytes(blob.len()); - let mut params = ArrayParams::new(); - params.insert(namespace)?; - params.insert(blob)?; - params.insert(fee.to_string())?; - params.insert(gas_limit)?; - // Note, we only deserialize what we can use, other fields might be left over - let response = client - .request::("state.SubmitPayForBlob", params) + let gas_limit = get_gas_limit_for_bytes(blob.len()) as u64; + let fee = gas_limit * GAS_PRICE as u64; + + let blob = JsonBlob::new(self.rollup_namespace, blob.to_vec())?; + info!("Submiting: {:?}", blob.commitment); + + let height = self + .client + .blob_submit( + &[blob], + SubmitOptions { + fee: Some(fee), + gas_limit: Some(gas_limit), + }, + ) .await?; - if !response.is_success() { - anyhow::bail!("Error returned from Celestia node: {:?}", response); - } - debug!("Response after submitting blob: {:?}", response); info!( - "Blob has been submitted to Celestia. tx-hash={}", - response.tx_hash, + "Blob has been submitted to Celestia. block-height={}", + height, ); - Ok::<(), BoxError>(()) + Ok(()) } } +// https://docs.celestia.org/learn/submit-data/#fees-and-gas-limits fn get_gas_limit_for_bytes(n: usize) -> usize { - (n + 512) * GAS_PER_BYTE + 1060 -} + let fixed_cost = 75000; -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] -struct CelestiaBasicResponse { - raw_log: String, - #[serde(rename = "code")] - error_code: Option, - #[serde(rename = "txhash")] - tx_hash: String, - gas_wanted: u64, - gas_used: u64, -} + let continuation_shares_needed = + n.saturating_sub(FIRST_SPARSE_SHARE_CONTENT_SIZE) / CONTINUATION_SPARSE_SHARE_CONTENT_SIZE; + let shares_needed = 1 + continuation_shares_needed + 1; // add one extra, pessimistic -impl CelestiaBasicResponse { - /// We assume that absence of `code` indicates that request was successful - pub fn is_success(&self) -> bool { - self.error_code.is_none() - } -} - -async fn get_rows_containing_namespace( - nid: NamespaceId, - dah: &DataAvailabilityHeader, - data_square_rows: impl Iterator, -) -> Result, BoxError> { - let mut output = vec![]; - - for (row, root) in data_square_rows.zip(dah.row_roots.iter()) { - if root.contains(nid) { - output.push(Row { - shares: row.to_vec(), - root: root.clone(), - }) - } - } - Ok(output) + fixed_cost + shares_needed * SHARE_SIZE * GAS_PER_BYTE } #[cfg(test)] mod tests { use std::time::Duration; - use nmt_rs::NamespaceId; + use celestia_types::nmt::Namespace; + use celestia_types::{Blob as JsonBlob, NamespacedShares}; use serde_json::json; + use sov_rollup_interface::da::{BlockHeaderTrait, DaVerifier}; use sov_rollup_interface::services::da::DaService; use wiremock::matchers::{bearer_token, body_json, method, path}; use wiremock::{Mock, MockServer, Request, ResponseTemplate}; use super::default_request_timeout_seconds; - use crate::da_service::{CelestiaService, DaServiceConfig}; + use crate::da_service::{get_gas_limit_for_bytes, CelestiaService, DaServiceConfig, GAS_PRICE}; use crate::parse_pfb_namespace; - use crate::shares::{NamespaceGroup, Share}; - use crate::verifier::RollupParams; + use crate::shares::NamespaceGroup; + use crate::types::tests::{with_rollup_data, without_rollup_data}; + use crate::verifier::{CelestiaVerifier, RollupParams}; - const SERIALIZED_PFB_SHARES: &str = r#"["AAAAAAAAAAQBAAABRQAAABHDAgq3AgqKAQqHAQogL2NlbGVzdGlhLmJsb2IudjEuTXNnUGF5Rm9yQmxvYnMSYwovY2VsZXN0aWExemZ2cnJmYXE5dWQ2Zzl0NGt6bXNscGYyNHlzYXhxZm56ZWU1dzkSCHNvdi10ZXN0GgEoIiCB8FoaUuOPrX2wFBbl4MnWY3qE72tns7sSY8xyHnQtr0IBABJmClAKRgofL2Nvc21vcy5jcnlwdG8uc2VjcDI1NmsxLlB1YktleRIjCiEDmXaTf6RVIgUVdG0XZ6bqecEn8jWeAi+LjzTis5QZdd4SBAoCCAEYARISCgwKBHV0aWESBDIwMDAQgPEEGkAhq2CzD1DqxsVXIriANXYyLAmJlnnt8YTNXiwHgMQQGUbl65QUe37UhnbNVrOzDVYK/nQV9TgI+5NetB2JbIz6EgEBGgRJTkRYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="]"#; - const SERIALIZED_ROLLUP_DATA_SHARES: &str = r#"["c292LXRlc3QBAAAAKHsia2V5IjogInRlc3RrZXkiLCAidmFsdWUiOiAidGVzdHZhbHVlIn0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="]"#; + const ROLLUP_ROWS_JSON: &str = with_rollup_data::ROLLUP_ROWS_JSON; + const ETX_ROWS_JSON: &str = with_rollup_data::ETX_ROWS_JSON; #[test] fn test_get_pfbs() { - // the following test case is taken from arabica-6, block 275345 - let shares: Vec = - serde_json::from_str(SERIALIZED_PFB_SHARES).expect("failed to deserialize pfb shares"); - - assert_eq!(shares.len(), 1); + let rows: NamespacedShares = + serde_json::from_str(ETX_ROWS_JSON).expect("failed to deserialize pfb shares"); - let pfb_ns = NamespaceGroup::Compact(shares); + let pfb_ns = NamespaceGroup::from(&rows); let pfbs = parse_pfb_namespace(pfb_ns).expect("failed to parse pfb shares"); - assert_eq!(pfbs.len(), 1); + assert_eq!(pfbs.len(), 3); } #[test] fn test_get_rollup_data() { - let shares: Vec = serde_json::from_str(SERIALIZED_ROLLUP_DATA_SHARES) - .expect("failed to deserialize pfb shares"); + let rows: NamespacedShares = + serde_json::from_str(ROLLUP_ROWS_JSON).expect("failed to deserialize pfb shares"); - let rollup_ns_group = NamespaceGroup::Sparse(shares); + let rollup_ns_group = NamespaceGroup::from(&rows); let mut blobs = rollup_ns_group.blobs(); let first_blob = blobs .next() .expect("iterator should contain exactly one blob"); - let found_data: Vec = first_blob.data().collect(); - assert_eq!( - found_data, - r#"{"key": "testkey", "value": "testvalue"}"#.as_bytes() - ); + // this is a batch submitted by sequencer, consisting of a single + // "CreateToken" transaction, but we verify only length there to + // not make this test depend on deserialization logic + assert_eq!(first_blob.data().count(), 252); assert!(blobs.next().is_none()); } @@ -385,7 +269,7 @@ mod tests { // Last return value is namespace async fn setup_service( timeout_sec: Option, - ) -> (MockServer, DaServiceConfig, CelestiaService, [u8; 8]) { + ) -> (MockServer, DaServiceConfig, CelestiaService, Namespace) { // Start a background HTTP server on a random local port let mock_server = MockServer::start().await; @@ -396,20 +280,14 @@ mod tests { max_celestia_response_body_size: 120_000, celestia_rpc_timeout_seconds: timeout_sec, }; - let namespace = [9u8; 8]; - let da_service = CelestiaService::new( - config.clone(), - RollupParams { - namespace: NamespaceId(namespace), - }, - ) - .await; + let namespace = Namespace::new_v0(b"sov-test").unwrap(); + let da_service = CelestiaService::new(config.clone(), RollupParams { namespace }).await; (mock_server, config, da_service, namespace) } #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] - struct BasicJsonRpcResponse { + struct BasicJsonRpcRequest { jsonrpc: String, id: u64, method: String, @@ -420,18 +298,20 @@ mod tests { async fn test_submit_blob_correct() -> anyhow::Result<()> { let (mock_server, config, da_service, namespace) = setup_service(None).await; - let blob: Vec = vec![1, 2, 3, 4, 5, 11, 12, 13, 14, 15]; + let blob = [1, 2, 3, 4, 5, 11, 12, 13, 14, 15]; + let gas_limit = get_gas_limit_for_bytes(blob.len()); // TODO: Fee is hardcoded for now let expected_body = json!({ "id": 0, "jsonrpc": "2.0", - "method": "state.SubmitPayForBlob", + "method": "blob.Submit", "params": [ - namespace, - blob, - "2000", - 63700 + [JsonBlob::new(namespace, blob.to_vec()).unwrap()], + { + "GasLimit": gas_limit, + "Fee": gas_limit * GAS_PRICE, + }, ] }); @@ -440,22 +320,11 @@ mod tests { .and(bearer_token(config.celestia_rpc_auth_token)) .and(body_json(&expected_body)) .respond_with(|req: &Request| { - let request: BasicJsonRpcResponse = serde_json::from_slice(&req.body).unwrap(); + let request: BasicJsonRpcRequest = serde_json::from_slice(&req.body).unwrap(); let response_json = json!({ "jsonrpc": "2.0", "id": request.id, - "result": { - "data": "122A0A282F365", - "events": ["some event"], - "gas_used": 70522, - "gas_wanted": 133540, - "height": 26, - "logs": [ - "some log" - ], - "raw_log": "some raw logs", - "txhash": "C9FEFD6D35FCC73F9E7D5C74E1D33F0B7666936876F2AD75E5D0FB2944BFADF2" - } + "result": 14, // just some block-height }); ResponseTemplate::new(200) @@ -483,17 +352,13 @@ mod tests { Mock::given(method("POST")) .and(path("/")) .respond_with(|req: &Request| { - let request: BasicJsonRpcResponse = serde_json::from_slice(&req.body).unwrap(); + let request: BasicJsonRpcRequest = serde_json::from_slice(&req.body).unwrap(); let response_json = json!({ "jsonrpc": "2.0", "id": request.id, - "result": { - "code": 11, - "codespace": "sdk", - "gas_used": 10_000, - "gas_wanted": 12_000, - "raw_log": "out of gas in location: ReadFlat; gasWanted: 10, gasUsed: 1000: out of gas", - "txhash": "C9FEFD6D35FCC73F9E7D5C74E1D33F0B7666936876F2AD75E5D0FB2944BFADF2" + "error": { + "code": 1, + "message": ": out of gas" } }); ResponseTemplate::new(200) @@ -504,14 +369,13 @@ mod tests { .mount(&mock_server) .await; - let result = da_service.send_transaction(&blob).await; + let error = da_service + .send_transaction(&blob) + .await + .unwrap_err() + .to_string(); - assert!(result.is_err()); - let error_string = result.err().unwrap().to_string(); - assert!(error_string.contains("Error returned from Celestia node:")); - assert!(error_string.contains( - "out of gas in location: ReadFlat; gasWanted: 10, gasUsed: 1000: out of gas" - )); + assert!(error.contains("out of gas")); Ok(()) } @@ -532,11 +396,13 @@ mod tests { .mount(&mock_server) .await; - let result = da_service.send_transaction(&blob).await; + let error = da_service + .send_transaction(&blob) + .await + .unwrap_err() + .to_string(); - assert!(result.is_err()); - let error_string = result.err().unwrap().to_string(); - assert!(error_string.contains( + assert!(error.contains( "Networking or low-level protocol error: Server returned an error status code: 500" )); Ok(()) @@ -583,11 +449,122 @@ mod tests { .mount(&mock_server) .await; - let result = da_service.send_transaction(&blob).await; + let error = da_service + .send_transaction(&blob) + .await + .unwrap_err() + .to_string(); - assert!(result.is_err()); - let error_string = result.err().unwrap().to_string(); - assert!(error_string.contains("Request timeout")); + assert!(error.contains("Request timeout")); Ok(()) } + + #[tokio::test] + async fn verification_succeeds_for_correct_blocks() { + let blocks = [ + with_rollup_data::filtered_block(), + without_rollup_data::filtered_block(), + ]; + + for block in blocks { + let (_, _, da_service, namespace) = setup_service(None).await; + + let txs = da_service.extract_relevant_blobs(&block); + let (correctness_proof, completeness_proof) = + da_service.get_extraction_proof(&block, &txs).await; + + let verifier = CelestiaVerifier::new(RollupParams { namespace }); + + let validity_cond = verifier + .verify_relevant_tx_list(&block.header, &txs, correctness_proof, completeness_proof) + .unwrap(); + + assert_eq!(validity_cond.prev_hash, *block.header.prev_hash().inner()); + assert_eq!(validity_cond.block_hash, *block.header.hash().inner()); + } + } + + #[tokio::test] + async fn verification_fails_if_tx_missing() { + let block = with_rollup_data::filtered_block(); + let (_, _, da_service, namespace) = setup_service(None).await; + + let txs = da_service.extract_relevant_blobs(&block); + let (correctness_proof, completeness_proof) = + da_service.get_extraction_proof(&block, &txs).await; + + let verifier = CelestiaVerifier::new(RollupParams { namespace }); + + // give verifier empty txs list + let error = verifier + .verify_relevant_tx_list(&block.header, &[], correctness_proof, completeness_proof) + .unwrap_err(); + + assert!(error.to_string().contains("Transaction missing")); + } + + #[tokio::test] + async fn verification_fails_if_not_all_etxs_are_proven() { + let block = with_rollup_data::filtered_block(); + let (_, _, da_service, namespace) = setup_service(None).await; + + let txs = da_service.extract_relevant_blobs(&block); + let (mut correctness_proof, completeness_proof) = + da_service.get_extraction_proof(&block, &txs).await; + + // drop the proof for last etx + correctness_proof.pop(); + + let verifier = CelestiaVerifier::new(RollupParams { namespace }); + + let error = verifier + .verify_relevant_tx_list(&block.header, &txs, correctness_proof, completeness_proof) + .unwrap_err(); + + assert!(error.to_string().contains("not all blobs proven")); + } + + #[tokio::test] + async fn verification_fails_if_there_is_less_blobs_than_proofs() { + let block = with_rollup_data::filtered_block(); + let (_, _, da_service, namespace) = setup_service(None).await; + + let txs = da_service.extract_relevant_blobs(&block); + let (mut correctness_proof, completeness_proof) = + da_service.get_extraction_proof(&block, &txs).await; + + // push one extra etx proof + correctness_proof.push(correctness_proof[0].clone()); + + let verifier = CelestiaVerifier::new(RollupParams { namespace }); + + let error = verifier + .verify_relevant_tx_list(&block.header, &txs, correctness_proof, completeness_proof) + .unwrap_err(); + + assert!(error.to_string().contains("more proofs than blobs")); + } + + #[tokio::test] + #[should_panic] + async fn verification_fails_for_incorrect_namespace() { + let block = with_rollup_data::filtered_block(); + let (_, _, da_service, _) = setup_service(None).await; + + let txs = da_service.extract_relevant_blobs(&block); + let (correctness_proof, completeness_proof) = + da_service.get_extraction_proof(&block, &txs).await; + + // create a verifier with a different namespace than the da_service + let verifier = CelestiaVerifier::new(RollupParams { + namespace: Namespace::new_v0(b"abc").unwrap(), + }); + + let _panics = verifier.verify_relevant_tx_list( + &block.header, + &txs, + correctness_proof, + completeness_proof, + ); + } } diff --git a/adapters/celestia/src/header_response.json b/adapters/celestia/src/header_response.json deleted file mode 100644 index 0e38a057d..000000000 --- a/adapters/celestia/src/header_response.json +++ /dev/null @@ -1,1566 +0,0 @@ -{ - "validator_set": { - "validators": [ - { - "address": "762CBA617226A799D898F134DD12661C7F1129EB", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "6bdjjKHELaN9colwYy/ad+xh3MUgOVq106ZFucK46LE=" - }, - "voting_power": "21002592", - "proposer_priority": "-180122426" - }, - { - "address": "F5BB6F48121E1C99D26BCD27B8F00893C1DCADCF", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "vfOT6bT2LXrfBsjpirOcVxdHhTAjVqoD9Q0TOKFAbkA=" - }, - "voting_power": "20772846", - "proposer_priority": "20772846" - }, - { - "address": "4B7A5D6E4A2AC4753C1B7645D784DEC12C5383AA", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "68dDxVgm9Ahj8BW82g3nY1gfvq2muEeoeDdnJ340LWs=" - }, - "voting_power": "20440785", - "proposer_priority": "20440785" - }, - { - "address": "BA8A15ED6466EBE3B132D91CD86F98867B28B006", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "MYb6LWgYFVekDhYajl/nI8KDGa7Stv2YsEZkrWcrvIw=" - }, - "voting_power": "20394270", - "proposer_priority": "20394270" - }, - { - "address": "2F192A85E9117A3C166584F8AB20B315D8788C5E", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "eBoP7WNwXdpB1AGb2Ny4Rwi1DP3x/3m72h2GVZqdwik=" - }, - "voting_power": "20181600", - "proposer_priority": "20181600" - }, - { - "address": "8FBEF0DBAAE51D918F9ABFD96653F4932171870E", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "J8wAKpZrD9kRbewJDMLQAuYkYNh33PhCg+wcdVcGxIw=" - }, - "voting_power": "19900303", - "proposer_priority": "19900303" - }, - { - "address": "F14BA4525613719E6E8DD72BB40628B585D5CA53", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "g/tHi4xmmiav/N012t0TsqyWuJzWEb13h+VO0kbjEwQ=" - }, - "voting_power": "19819201", - "proposer_priority": "19819201" - }, - { - "address": "E1570712868BE0B12622BBAE08D96F5840F9D018", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "OHADjBcHrd2mld9DQre1MkiFKYN+7vlFou+eB6Ia/qc=" - }, - "voting_power": "19633245", - "proposer_priority": "19633245" - }, - { - "address": "0B76107110A486E8767FA1997EA0C4B40B7851AF", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "D3wP4IWMZcMt9UHVzFP2J19FDCP/732nvtT/f3CIatQ=" - }, - "voting_power": "19432240", - "proposer_priority": "19432240" - }, - { - "address": "3ACD2DA41FFBB07743A99A74A0FACEACF3A9E474", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "z4VR8LSO7jeupkwifkLevWc+dSloLq9dMME7k0nVqOQ=" - }, - "voting_power": "18000056", - "proposer_priority": "18000056" - }, - { - "address": "10C13814B94303B35EFFFAB319301714A4D69399", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "FULjq8Uf1zsGbs3izSZSBYRvr6k597hLmIEeBwHuEEc=" - }, - "voting_power": "500422", - "proposer_priority": "500422" - }, - { - "address": "6BDDFED21432C64D5F71E325CD6AF6FB16790391", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "fe6/iNJr7px2M5mr1aXkvt7f26+2qDM+LHo3eZHA/38=" - }, - "voting_power": "210358", - "proposer_priority": "210358" - }, - { - "address": "4875AD200AADE12185455050EA07E424D945FF64", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "gGsm+RV9RdfpNnrXbg8eZamm2fMtMh1P4E/eZRtFk1g=" - }, - "voting_power": "51092", - "proposer_priority": "51092" - }, - { - "address": "BB408FA902A7B6A938C788957B2A874153261EC5", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "7rE47Ol0HqaZhnQQqlx5BD8rNGv6yTcRQANXtMY7y4g=" - }, - "voting_power": "20856", - "proposer_priority": "20856" - }, - { - "address": "41FE068E3E8537EB35932A517836C1694C804746", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "2UV7v+AE3lX51fGs+h42FgLimv/SIYW0twAdOekck78=" - }, - "voting_power": "11693", - "proposer_priority": "11693" - }, - { - "address": "2E008FC8A683B806F82206DE091A9433515319CA", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "v5y5IraSyBzvIfcInHZ4groGSn1hokTe1k71QHtxbzE=" - }, - "voting_power": "11599", - "proposer_priority": "11599" - }, - { - "address": "6C3E4F3C92DE15FBC788F91747D8944586E9A1C0", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "y67VON5o65OicItNcd0S8MNd/22e1CGlRZpZXetC6DA=" - }, - "voting_power": "11366", - "proposer_priority": "11366" - }, - { - "address": "793B51BF408858FD72EC4198140D385C4076A208", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "x+JRxnYtuwPeHmNQOZ541uZzxoJd1cTUUGQ2+YmkMO8=" - }, - "voting_power": "11339", - "proposer_priority": "11339" - }, - { - "address": "7E2CB2FA8C46CDCA5BE02B0D656A0D61533445EC", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "yU84HuMOysbfwrWM6TA0PnCvn5jptbo5mYFHuZwo67c=" - }, - "voting_power": "11216", - "proposer_priority": "11216" - }, - { - "address": "22089FFD99FBBED4B77B88948F7D749C2784A1CF", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "MlFR9fiA74zWCEViKydSIlUo1igsgyq0JRhUQ7wi7WA=" - }, - "voting_power": "11196", - "proposer_priority": "11196" - }, - { - "address": "7C9538967D87E25FAD17A1180EEB6F174E8BAD84", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "I8gELA5RucvoH6gYz6iNErFmaQ4ZeMQkHWpAOe7NoGM=" - }, - "voting_power": "11158", - "proposer_priority": "11158" - }, - { - "address": "5808D8604443E8C1B11835FA8D7250FCFDAAB8AE", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "sJfNT8M3V8mMTvzHFJhKcgH5OgsTP9TCTPU/mgAMM3o=" - }, - "voting_power": "11027", - "proposer_priority": "11027" - }, - { - "address": "9C4395A21313734E9E322D55655EC55DEB9ABA81", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "IvkUe2jzMHymGsbvo0Ctu42gv7kS371g2VsC7PKA+ms=" - }, - "voting_power": "10860", - "proposer_priority": "10860" - }, - { - "address": "0590EF6F6AB31A98C786B2D4B639C62CB39F954B", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "VlBSILXJpT55YzMfgibI49GTnDqhzHZsfRtn457kMlI=" - }, - "voting_power": "10815", - "proposer_priority": "10815" - }, - { - "address": "22EFAD458C05DDDD14A001C52FEF84EC3D17A688", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "dD3BcTI3BXW8fEytVHFHOPcb759/02vxBju3fzeMSRA=" - }, - "voting_power": "10697", - "proposer_priority": "10697" - }, - { - "address": "80726DCD4E975716843F213C7E5A36400ABCFDFE", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "sAD409SvbABZBr0vCmjL6JK6XVQgQP4RM7v/Oiz/f88=" - }, - "voting_power": "10646", - "proposer_priority": "10646" - }, - { - "address": "7763A9F623F458DF0FEB7298E3FE1D67CECDA1FD", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "UQrlm/vvxj/tEKUf/G05seIT09ygG7q29r4czyemwSQ=" - }, - "voting_power": "10625", - "proposer_priority": "10625" - }, - { - "address": "CF238AB6BAF500A7623789F8EA7F3BCB95150574", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "jI1cMvsmHEU86V0N5JsTV5o+Yv3eqBal+QgjGRhb/4w=" - }, - "voting_power": "10592", - "proposer_priority": "10592" - }, - { - "address": "38A9BFEBAD0FA8A5E9E5AFB1A0AE01C1EA85729C", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "Igw5QFJdLJEqOrsYxYVUdcWi1bbQDIIFLxbigfEXmqk=" - }, - "voting_power": "10464", - "proposer_priority": "10464" - }, - { - "address": "87697AD05E817F183CBAC23D6F711EFFC73E7CB1", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "yUsnxCQpmHyY7/UHKzgtx/k4l+n2g1OlP+DOpkdQztU=" - }, - "voting_power": "10386", - "proposer_priority": "10386" - }, - { - "address": "FD17755AE1B0FE464B4F9996598EF9A51F602DB3", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "yLHp1YFCKUSWf51N58x2aG6TRs9GKZdtE+InCL1Zj0o=" - }, - "voting_power": "10362", - "proposer_priority": "10362" - }, - { - "address": "813D78C65701B7A792FB5F2DB7D4DBDEFCD7EE66", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "Wn8yx1RrmPdby+gqI7ErqCOJlJP05T4alnvdnu7vnxY=" - }, - "voting_power": "10342", - "proposer_priority": "10342" - }, - { - "address": "0003D94C13CDF1FC0A119AB6CDF454E6BFBCA4C3", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "NfIcNuLvvTabv/qz+/rgozADT/B+Wc6Aw2SzxrijaqY=" - }, - "voting_power": "10327", - "proposer_priority": "10327" - }, - { - "address": "284DBBD8B2BBF32E4004A817473D05E3A66C5C4A", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "b7Y258ExeJsXOai7gP9DupujCVbf2AlrJv1mltTGi30=" - }, - "voting_power": "10280", - "proposer_priority": "10280" - }, - { - "address": "372FF124AF7D42DCE4FF40952E3E21D43C33C60D", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "Kbv0oySUstYPOiDcJyJypDSWHHkgbUdWvItYruU3jSw=" - }, - "voting_power": "10266", - "proposer_priority": "10266" - }, - { - "address": "38CECDD91DAE3D8F536C080742A69FEBB6EFDBFF", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "RYrMwDTpJWv67sFVwKtmS+UxlN7hljKGWJqOsutcB1s=" - }, - "voting_power": "10263", - "proposer_priority": "10263" - }, - { - "address": "21AECD90BAD73E77875F641299469C2A348D79CB", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "G6ZLhPaJHQCBqUvs1M2K3QJT9vcXM7Qi73Jjo28d9Dg=" - }, - "voting_power": "10213", - "proposer_priority": "10213" - }, - { - "address": "268BCEBBE4D9075F9DE971DE34A636B4316B5EC5", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "cYlH04/HHOVMAN/vOkS3R+jP2z4dyDQmnFKSnvOgPts=" - }, - "voting_power": "10196", - "proposer_priority": "10196" - }, - { - "address": "312ED92F9E7A65BC80DFDB59AB05BD85754E7E95", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "CWxVE0hu9cUZ4fGJrxkxW9ZYT1pH5mA4O04Y0JOnkvM=" - }, - "voting_power": "10133", - "proposer_priority": "10133" - }, - { - "address": "68D747F35AE07631AF2E94CFF06BA30A9EFC8712", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "ILj5kerxa/UjJ9L4eAgi3rpteIp5b63Smyqysn4T3WU=" - }, - "voting_power": "10131", - "proposer_priority": "10131" - }, - { - "address": "EA14DE7F3FE756943AFDFDC23A2C8720E80F2C79", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "JAgIlYqwwU+nW/CoSnXPVn1YV8Wg4zb19i84kKMbIwk=" - }, - "voting_power": "10127", - "proposer_priority": "10127" - }, - { - "address": "B5698E7725F2D206A6652D945F75E9FDA2219F9D", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "Y+07AMlGx0La8Sr9aTMTbMMI9cuv9mrHQCWom921Uug=" - }, - "voting_power": "10112", - "proposer_priority": "10112" - }, - { - "address": "887BB5E1B4DBFF7117434FE7567CB8F2DC1B1F38", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "FjLtJraEKp4JoQEy8cI6L6haRkgO9CHh9dTZwbQk3gM=" - }, - "voting_power": "10110", - "proposer_priority": "10110" - }, - { - "address": "407DF17CD5EB1967597FC14A15A9D883DE884C93", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "VkA34n9aydhX5Gl0mBga06j7/ThNuBljC/T33ZP/Cdk=" - }, - "voting_power": "10108", - "proposer_priority": "10108" - }, - { - "address": "EE927F115AD4FD4BC131CA311D332ADDAC62CCAC", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "SfFXATPCbIeRUsb9RP+BfdYOH0v7H2aGbPGx1HlR1I0=" - }, - "voting_power": "10107", - "proposer_priority": "10107" - }, - { - "address": "A133A0F5CF118D107DC6326322460783F380C0E5", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "bb8zgZaww2FRaACEhEB+R6P9N1CRuRW+mHP1vKOqc/0=" - }, - "voting_power": "10099", - "proposer_priority": "10099" - }, - { - "address": "E1F1D0F31F8DB86B829C8502AD1F6F1576C08A6D", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "4TpozS4FflJmfBg3MYhLw12UeVUSELod0fdnX4tAQgs=" - }, - "voting_power": "10099", - "proposer_priority": "10099" - }, - { - "address": "7EA692099F6AC9243306305AC28F565716FA742E", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "CVnpHUel7h9T/ABhMZeBD6gY93vA1fQAHhtSVwBJZ4E=" - }, - "voting_power": "10094", - "proposer_priority": "10094" - }, - { - "address": "CAE9614B39D1778BE2CD1762A64483560E5534B5", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "tZbAmUfwTL4+11BLl37z0TWm30T3FiX0YFb+jAP/RQ0=" - }, - "voting_power": "10068", - "proposer_priority": "10068" - }, - { - "address": "1C9D8799534B609225D4D82A44170DAF701353BC", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "veSz82g7u1EDkIy/6njEouXOn9SsUvPIdM2Lq17y/uE=" - }, - "voting_power": "10063", - "proposer_priority": "10063" - }, - { - "address": "6B52C0F9B4B0DF280F2B5D03BCA20A35C401DAD4", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "A6uzLPMTtomXe/MJedCaag1Ab6/c3+quxY0+aqsb3PY=" - }, - "voting_power": "10059", - "proposer_priority": "10059" - }, - { - "address": "65D4634E13C159BAA5614AE04AB89C7DF4B2942C", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "C4GYT5RIkZq70YG5YKQEksjrNdmf/7gfqVSVzgbjsJE=" - }, - "voting_power": "10056", - "proposer_priority": "10056" - }, - { - "address": "9B2FB5ABCB3B0289D03AF5A8577C76D9A37A32D3", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "D9iPx6VTH+xeewFFWfnI+a7dM6Y5Y9h/5S4WHro5wUQ=" - }, - "voting_power": "10056", - "proposer_priority": "10056" - }, - { - "address": "FD32C8FD6F4E01D67824BC6651F5848FD9833B60", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "G2oUHMcHFiLj80Xos7eZ79cmuckcGaVjvxJu6mo493s=" - }, - "voting_power": "10051", - "proposer_priority": "10051" - }, - { - "address": "EE60B0B33489E72FE69363A1D7F0C78626CD2D39", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "/WPPLH7f2moY5LysZFN/JTz4k7dWw9pXLM13OKAgFAs=" - }, - "voting_power": "10042", - "proposer_priority": "10042" - }, - { - "address": "435A073DEBA3A3C6A183D9CDA397B38B6AAEEAB2", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "qy+/bkSpy3ECas02SU9WTW54EASXH5LCVN59gQJCLRo=" - }, - "voting_power": "10039", - "proposer_priority": "10039" - }, - { - "address": "3AFA32AE613CCD73ACF136BC86FF4DEF87A33067", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "ub0Db6WsbwOhhJTTEcbMvXEIQzhU3PeAPtQ8thwfOy4=" - }, - "voting_power": "10020", - "proposer_priority": "10020" - }, - { - "address": "F9D6A9FA1C7090F710DD3AC5CEB0E9005C327C13", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "GF+zUO8Y2cj77V0PFYXh79w69fSBRyeU3aANKdEqAnI=" - }, - "voting_power": "10019", - "proposer_priority": "10019" - }, - { - "address": "F271741FA4B163F3204A5BC2570E74F146AA33D9", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "Y0SMVwQK9FHbFi7ykZSwah3TG56saeI0uTMXYvyb9dY=" - }, - "voting_power": "10011", - "proposer_priority": "10011" - }, - { - "address": "4520D7FA09B49EA0C0F39E6788E6EB3FD8065690", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "27PwyrHHY/ndxqNrL6SdHomL4hR3JAJ5QMdQFYRlS9I=" - }, - "voting_power": "10010", - "proposer_priority": "10010" - }, - { - "address": "DFE827625C00547FA79217CB67CF589918218C48", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "WnsbPkUFx6VaBJbCdVcxUTFrJCDTL+F62GvY4RcZlGk=" - }, - "voting_power": "10004", - "proposer_priority": "10004" - }, - { - "address": "F26493B9ECA784977CC180B87D63FFE6BAC17D7A", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "gGUWARrFV6eOXFztsDx3M0OkithkyB8dIwGcCZ09fDA=" - }, - "voting_power": "9997", - "proposer_priority": "9997" - }, - { - "address": "4267ED67A7D1BF6794AE82F8D753E2A0C3D64DC6", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "w8dRnys1OowhERYxNXutFVTmyO4OrGVnZvqp0rvjnyA=" - }, - "voting_power": "9993", - "proposer_priority": "9993" - }, - { - "address": "C1B5400696B35C32195A495D65EEFAC0384AF5CC", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "3ykhgEeQmtBkH5m41lVTsNUI6YbI1RfZQbf2N2alJ3Y=" - }, - "voting_power": "9961", - "proposer_priority": "9961" - }, - { - "address": "4DB394CEDF34FC204B77DB197D6109328976D60F", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "FFC5Gn/KC44bJbP7MsXXEU+TqcPQmr5WbTYyjSMFPU8=" - }, - "voting_power": "9540", - "proposer_priority": "9540" - }, - { - "address": "7F5741D855DEF211FD849490B7A3145E77B426D7", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "jScQj1XJP5LWrC2d2/K1rE7wQBJYKD1EUq/iSG8uA1I=" - }, - "voting_power": "9493", - "proposer_priority": "9493" - }, - { - "address": "362F53ADD7675FB953B8B3A464970DA4646C4E15", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "3FPbUrTA67ulv315kwLG7LKDYdCg116uZASh03XLe6k=" - }, - "voting_power": "9474", - "proposer_priority": "9474" - }, - { - "address": "872E62AC3C2FD1D15DCEF5EF6682D9FE9351D5DB", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "k6BfqvfCoF71+2qIPW93JDnMZCyq8Eqc6V7gH2e/gmE=" - }, - "voting_power": "9317", - "proposer_priority": "9317" - }, - { - "address": "621BC4A3D36FE764F265ADC923F61F5EA166535B", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "540IwDgI8G001UeKp/TVCmiVz4De1smsjPtX4VJFYWk=" - }, - "voting_power": "9202", - "proposer_priority": "9202" - }, - { - "address": "C2FE6292FC9E194D4CA1A7BF94EEB73AF9BFC942", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "MeCdisSprXXkpHbmMeyGahixpKGc/MqOykJ9lvM2B48=" - }, - "voting_power": "9015", - "proposer_priority": "9015" - }, - { - "address": "13E2D73B12F6A5D5EE0392D934FCCEDA180279F2", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "WI2fnwW67ArvQKJNygzaJtjfQxfHo4nRIliAMdXvDLE=" - }, - "voting_power": "9009", - "proposer_priority": "9009" - }, - { - "address": "110F48CDE021C66B9B00441D0A6B24D358608607", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "eXFJj8jJ0TwvoB1sqiDIIFy4UywE95w2YDLPaaVHxrk=" - }, - "voting_power": "8263", - "proposer_priority": "8263" - }, - { - "address": "D441D1654E5D553AA3ABFE79C1A83BD05D235481", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "jNcAWPD4QUo40mPd4gdN05SCz7J5lM2ul+HpKaXGZIk=" - }, - "voting_power": "8241", - "proposer_priority": "8241" - }, - { - "address": "E10AF7D9C4B73147556BD60F7F00D4329A6621D3", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "BM6w4poaymqrZxhVLanZVv9wYgUy14aNlU2xLsMCtlc=" - }, - "voting_power": "8090", - "proposer_priority": "8090" - }, - { - "address": "391992B82F055BFF434D33F77A9F948BD9E2589A", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "nzYiQ54mcjTNZKutjCMN2IOcrDOL9LIYz8g8TJWUPGM=" - }, - "voting_power": "8040", - "proposer_priority": "8040" - }, - { - "address": "2712C8EDD3AD2C26C172778DBBBB61A7526F6E42", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "XLHu1GTKY2fYQvuBNcXjTvLKehA6GHihyjuFwsjYtf4=" - }, - "voting_power": "8019", - "proposer_priority": "8019" - }, - { - "address": "01876159421B01400B604A934795331E8FA47B4C", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "f8IbP3iRCQcZwjRxbLFAg7zsqBFZ1nd+ZJQnba4gUdg=" - }, - "voting_power": "8013", - "proposer_priority": "8013" - }, - { - "address": "87DAF996F5A1DA31AED86F5DD561061B8FEDCC54", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "XW11O9X36REBo1s2UsCz9OvdtUACj3wuDNDYahZXZZ0=" - }, - "voting_power": "7539", - "proposer_priority": "7539" - }, - { - "address": "B6BAE3EF71F632D2413A2B885774E55BE6F80DCC", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "sMJkChpVRPjW4Q1Fu8uOaeWTiUkoY8Da6SnM9xqz7oA=" - }, - "voting_power": "7396", - "proposer_priority": "7396" - }, - { - "address": "508C89522C08EA0D8055169BB385049E7CA17713", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "3Jhy2NQuGHQJm+CG5w9eZCMqAEa9lDE9qDpEm+Q8oZY=" - }, - "voting_power": "7360", - "proposer_priority": "7360" - }, - { - "address": "78C3EA77FAAE609808CD9B370747FE91AC975975", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "Jxx3aSz4P5vVNGutYBgnqRHzFadFWZU4k+Rw3/0pgvI=" - }, - "voting_power": "7197", - "proposer_priority": "7197" - }, - { - "address": "7F7262D42CB524A4CFB6FDEEEB12E544AE646AA6", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "W957lcHW6J+Go+flDcF1ieAWceEgAAdzsFFscLqTxjk=" - }, - "voting_power": "7167", - "proposer_priority": "7167" - }, - { - "address": "E81805AE862CBCA6340C601B6B760C9EF81E9924", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "ALaMW6hL7rhphdP+40F6Un6B1WZx37F+aYb7W0X3zSs=" - }, - "voting_power": "6633", - "proposer_priority": "6633" - }, - { - "address": "982DF85B40A0A57A9E497B8EC99896514AFD2AC1", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "XiXvtiUtyK7MgaxXxLTGKjZOEn8diBeoX29tfZsgdWM=" - }, - "voting_power": "6602", - "proposer_priority": "6602" - }, - { - "address": "7EFA1652F535CB4656BF875A989108A5D1516A58", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "576sT4WYt917pvGKNWwQAx8JkqkJTQGApvm1I06yVcE=" - }, - "voting_power": "6482", - "proposer_priority": "6482" - }, - { - "address": "AFC1C10252EEA4DE4D58C79B5E0CEDFE1B563B31", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "nDxk+ZJCcu11EnARaAVL4pWqZcVw3ZiDuERZnv/STpA=" - }, - "voting_power": "6135", - "proposer_priority": "6135" - }, - { - "address": "003CE561FE12D19F3724E383AD34B09163000048", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "RwRwkuOZrgQeQE+h/oHQN1GxM/1L0O+yDIWk/znMDPE=" - }, - "voting_power": "6024", - "proposer_priority": "6024" - }, - { - "address": "D77BA150C3AF6A439A2FA633335A279A09233B88", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "D8w1PQzJE4TQf5D9tcAT1koqBl/5kEe3xJVaunmrJ20=" - }, - "voting_power": "6000", - "proposer_priority": "6000" - }, - { - "address": "455A139106AC6CBDB8B37FC122484A18D3F08C07", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "3eIOFHYma7RENPkxPinJPriZj7t8fQtjdkPv4f3h4KY=" - }, - "voting_power": "5839", - "proposer_priority": "5839" - }, - { - "address": "4BC89C831A51124E7369972522A87F40B32EA123", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "zCqGKgAvyU35q74Fk07cQYu7NEnVV62vWoznhnyEF3c=" - }, - "voting_power": "5590", - "proposer_priority": "5590" - }, - { - "address": "FE589F7693F67ABF93BE9A09F86E2A88F78D98FE", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "ZLKB7N7d4GpLkpbeY+UHxCIpTUVA0ZUsChC7lef9I1Q=" - }, - "voting_power": "5529", - "proposer_priority": "5529" - }, - { - "address": "EB34C75A2B3770CD51E44DDB3B05CA6E4EE91092", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "Bv8W8qEPSg0VHE31zUQg33MOonibOUeFrqsbRqv3MjY=" - }, - "voting_power": "5238", - "proposer_priority": "5238" - }, - { - "address": "CD10B5095AC4541972E0C0FDE35A39CF92A040DA", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "cPgsoC0NIVUAe42qmzfbrLaznvYZCh1z92Q35D0KZOc=" - }, - "voting_power": "5083", - "proposer_priority": "5083" - }, - { - "address": "FD255FBDD520E45A8FDD0759023666F1FAEB2717", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "d4bugP3aJbyT8wzjTN9F3KgevJyc0sDe0UlcwPey39A=" - }, - "voting_power": "5022", - "proposer_priority": "5022" - }, - { - "address": "7258C2395933ABD935E87892938C524479C719BA", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "5dgQvunUGMrVCEoxcfzyhFaobgLcQhzzYDxD1dXGtYY=" - }, - "voting_power": "4931", - "proposer_priority": "4931" - }, - { - "address": "84E6AD7091614E72C39B6535E6202CDB21B80B75", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "4cH1l1egPZMt1zwy74++mxsgOosswUTcV15++xdkb6g=" - }, - "voting_power": "4616", - "proposer_priority": "4616" - }, - { - "address": "FAE6061472E8D5D9F334D84F616C9EF7AFDD7791", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "XzN7zj5Z3CVtfxgae1Xy4iGUpMB8xebR467TVfulfzM=" - }, - "voting_power": "4237", - "proposer_priority": "4237" - }, - { - "address": "19DF075073BF8F05041672EE46FE8CC8D4D76E7B", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "S2viPopSwW43/wJSp3npRR69Ct86quYn8s8mV75anvo=" - }, - "voting_power": "4168", - "proposer_priority": "4168" - }, - { - "address": "A156D613D6B5A5552FBCE6E1FDD4F2DE440C8EDE", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "D5XC1wIyYlxDM5aaTght0t2893hDe4xTzwEnU5QBo5w=" - }, - "voting_power": "4011", - "proposer_priority": "4011" - }, - { - "address": "843B76EBB527F82BB7A31B553745BD2675DB9FFE", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "qEOZMGp7fJ5pBa10fZfv5770XkJCBwhZwqGftFKeRdo=" - }, - "voting_power": "3140", - "proposer_priority": "3140" - } - ], - "proposer": { - "address": "762CBA617226A799D898F134DD12661C7F1129EB", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "6bdjjKHELaN9colwYy/ad+xh3MUgOVq106ZFucK46LE=" - }, - "voting_power": "21002592", - "proposer_priority": "-180122426" - } - }, - "header": { - "version": { - "block": "11" - }, - "chain_id": "mocha", - "height": "428545", - "time": "2023-03-11T15:43:19.088215294Z", - "last_block_id": { - "hash": "8FAB396B01B0781B309D2EB438F41FA6A76AA28308AF2FB84D200C756AB48975", - "parts": { - "total": 1, - "hash": "76A87FAAA0D8AF60A6D3DD8DE57FED54E9068B633D11A089ADC38D3C18922741" - } - }, - "last_commit_hash": "4FC44DDEF86A36A3AA544F7A913E2F1675A27CEF312E0034747A02D4A560251A", - "data_hash": "C6FA94EA5B4640A69C830C6A1BB6B86F04800B852F8650B28CDD5CE7E3A307DD", - "validators_hash": "FA8B443035B476A1D6B704C36CF1460D229D5927BCFD93197E680B2EB63F4568", - "next_validators_hash": "FA8B443035B476A1D6B704C36CF1460D229D5927BCFD93197E680B2EB63F4568", - "consensus_hash": "048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F", - "app_hash": "6B4205AE7CEE329C7E49E8C4A102D7B8107CB604AFAA0EE87CFAC1704E8D6461", - "last_results_hash": "EF4931FB9F6CCCA0C5FE8367BCF5044E785247ADDE925C6FE6B7C200E43EEFA5", - "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855", - "proposer_address": "E1570712868BE0B12622BBAE08D96F5840F9D018" - }, - "commit": { - "height": "428545", - "round": 0, - "block_id": { - "hash": "32381A0B7262F15F081ACEF769EE59E6BB4C42C1013A3EEE23967FBF32B86AE6", - "parts": { - "total": 1, - "hash": "9CDA9660AB08F3DF418A00E7C26B80C7B10D0D8373DA0FAC079E07822404AA64" - } - }, - "signatures": [ - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "F5BB6F48121E1C99D26BCD27B8F00893C1DCADCF", - "timestamp": "2023-03-11T15:43:28.180810651Z", - "signature": "nWCjsA6fce/udBn+NhxuDFSNQEF8TBC0INjtCmaKib3ubgPDJPMU3RCccFnEu0c9RP+pzpE211BcPT/5tloVDw==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "BA8A15ED6466EBE3B132D91CD86F98867B28B006", - "timestamp": "2023-03-11T15:43:28.166418838Z", - "signature": "mKQmIV/y41YAlDToPkfr4bMtCnug3QLQjWSnNW0XjgSVjEUThP6yS3o5B71g2nyJ4CKcTGo0xj773YckxZWXCg==" - }, - { - "block_id_flag": 2, - "validator_address": "2F192A85E9117A3C166584F8AB20B315D8788C5E", - "timestamp": "2023-03-11T15:43:28.159821271Z", - "signature": "Zn7Qb8m5TRE1HyzmLl2pxpwPo/oE73N2A5MCvtPM0N28udvX5Cg6w507zx12wGmLgCjY3PA37v7vgL+c2CYQAQ==" - }, - { - "block_id_flag": 2, - "validator_address": "8FBEF0DBAAE51D918F9ABFD96653F4932171870E", - "timestamp": "2023-03-11T15:43:28.116803321Z", - "signature": "ObzC3chz1Ive1NKot4ObuF3678U4pSsHhWHeYdbArW6xwt1ed5y0ZYAYCjXmO/HAWG53i9N5BShe3WrR/F5UCg==" - }, - { - "block_id_flag": 2, - "validator_address": "F14BA4525613719E6E8DD72BB40628B585D5CA53", - "timestamp": "2023-03-11T15:43:28.110211047Z", - "signature": "JOuPaoMU0/ab4vx6IeZ/hfNQeD/8TbTI1ar60abs1XEynX3z6rHA0az/j8V6pFtXdzFNj6sDkvBexXI/RHFzCg==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "0B76107110A486E8767FA1997EA0C4B40B7851AF", - "timestamp": "2023-03-11T15:43:28.18262002Z", - "signature": "ZvEydFwPzG4j0wFw/yqprZYKxO281GiZZvE6h5QZ9TyJ0bikOkvtTGDgOfro/11RQguCChlk0pUH1nreEiXFCA==" - }, - { - "block_id_flag": 2, - "validator_address": "3ACD2DA41FFBB07743A99A74A0FACEACF3A9E474", - "timestamp": "2023-03-11T15:43:28.191434275Z", - "signature": "DtoPOkMC9IoCE1ClAHuoPPOB7ebQo49aAgS3SiHNZFHBxj8GzTHhzfifH5oo26fORF3hf92coIP1Ls+wd/00Dg==" - }, - { - "block_id_flag": 2, - "validator_address": "10C13814B94303B35EFFFAB319301714A4D69399", - "timestamp": "2023-03-11T15:43:28.082386636Z", - "signature": "11zo5OsAXtkNGrVTv3M4FX/hFr/CN1+azqPxYWkBittjMctIxmPHIujqxBjdsGv4e6SY+OGxlkSAsiaqHSuuBw==" - }, - { - "block_id_flag": 2, - "validator_address": "6BDDFED21432C64D5F71E325CD6AF6FB16790391", - "timestamp": "2023-03-11T15:43:28.797197235Z", - "signature": "N0somrqRykjuNofRVcMU7FUBziSwjdkm9iG6SsOnmUKy+dPTAfZdH2DMteNGpuSb1HV+/CtKDKUVo8G2Iq6FBQ==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "41FE068E3E8537EB35932A517836C1694C804746", - "timestamp": "2023-03-11T15:43:28.197002267Z", - "signature": "AtTZZyheuxt0qDD3OIOlFdET0qHZ/oI2xQRgYSAfSD2JJj7rmF92hZkQsimigbtADL1HSez2FpFz1FhXZaqNDQ==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "7C9538967D87E25FAD17A1180EEB6F174E8BAD84", - "timestamp": "2023-03-11T15:43:28.184183273Z", - "signature": "/+h7w6+wqAA/RnIV83jzlP02O14G1meD4Yne75eHbyQA7NoH7wqGpqZybELkroZC8lwBt82uPHsSmiCDRQb/DA==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "0590EF6F6AB31A98C786B2D4B639C62CB39F954B", - "timestamp": "2023-03-11T15:43:28.187945292Z", - "signature": "159pGRUzMiNthepaM7A2Iv05J8Ge7sRaoc3NqcRv0s0wolq/u86LOGLv2OmjyZz3Cc4Ym97qMI0iu8KtUCppAA==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "7763A9F623F458DF0FEB7298E3FE1D67CECDA1FD", - "timestamp": "2023-03-11T15:43:28.172179653Z", - "signature": "KXWBW4M5ksRDlfcTi9FdOD82iw6CH7/rCjunvEyDlEBP703kFFoD4ctXht+Fym1HdgIiaZH09TadvkpKCXUeAQ==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "38A9BFEBAD0FA8A5E9E5AFB1A0AE01C1EA85729C", - "timestamp": "2023-03-11T15:43:28.154111321Z", - "signature": "tBpuE1BtK3HjacyLVtUt9U2mN61AcIQGEmMNktaeXIZQiYWMuelSMU8VcIR1pqgzZSPqQU6zHQgN4Xm5yle1BA==" - }, - { - "block_id_flag": 2, - "validator_address": "87697AD05E817F183CBAC23D6F711EFFC73E7CB1", - "timestamp": "2023-03-11T15:43:28.111707597Z", - "signature": "qvsWM5V9ukiIv7AJXEZ5bsITlmU21x+LGVq3ewX+tqHK+uSKChVrMZK8qn3Lu2n4NUE5zGk9ppCbrwskK+CxCg==" - }, - { - "block_id_flag": 2, - "validator_address": "FD17755AE1B0FE464B4F9996598EF9A51F602DB3", - "timestamp": "2023-03-11T15:43:28.171876321Z", - "signature": "74FIf3xxDBMOHLQWILZ6PyyIWRh62v/T30T2ZuPkOrvPLVhptq/K8ddXe2z3/4WNCqBLI+EDQprI5O0ZzhY7Bw==" - }, - { - "block_id_flag": 2, - "validator_address": "813D78C65701B7A792FB5F2DB7D4DBDEFCD7EE66", - "timestamp": "2023-03-11T15:43:28.12952191Z", - "signature": "CVLnhHgWeUyCk+qaJM/2+g+nhwT//6PtMooSP7L/OExSnbWaWzKAYwKuq/kS8CxDIAnCklzQjha+cd+zEAIGCA==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "372FF124AF7D42DCE4FF40952E3E21D43C33C60D", - "timestamp": "2023-03-11T15:43:28.184599672Z", - "signature": "nDuFMIdBd57TUl80KVtdPpP9ZFtWfCwm2scfpEm2LHk37OnquYWjyoWzNDK55zKd1g2DONjGxaRRbbUEvxygDQ==" - }, - { - "block_id_flag": 2, - "validator_address": "38CECDD91DAE3D8F536C080742A69FEBB6EFDBFF", - "timestamp": "2023-03-11T15:43:28.102479327Z", - "signature": "Ve+nNvgiYH14ULfORC9wA0uLEAGxIKH1RPOSrzREw4Lg4ddFS25u3fpuWytU6p4c7ia4mgT2qCTc1vEvKsVRAw==" - }, - { - "block_id_flag": 2, - "validator_address": "21AECD90BAD73E77875F641299469C2A348D79CB", - "timestamp": "2023-03-11T15:43:28.15950634Z", - "signature": "+GdAN+eKIkh2jH9RwPrij9QMUDInPyv335Yj3gWKJFe3fPzsPuQ3h1I1uvQE+OGwh56Ll9Y516qZIlM7X+hSCg==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "312ED92F9E7A65BC80DFDB59AB05BD85754E7E95", - "timestamp": "2023-03-11T15:43:28.102779303Z", - "signature": "0R2w+uwVsBpcVHCLs43VoXf3w2PW9N7/JcIdCH6NIRV9np3cPRSyRFY6eLPnhahPNRW4NahFeiy4sZ4bDzzAAw==" - }, - { - "block_id_flag": 2, - "validator_address": "68D747F35AE07631AF2E94CFF06BA30A9EFC8712", - "timestamp": "2023-03-11T15:43:28.140514568Z", - "signature": "I6pJWs2LxzI7e6sCa2iucMhaKdle/Aey7uIR7k7kF/5XbJUwKzfuuAARZnQtp90pUh5YEvbMWeYrPE3ELg0rBw==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "B5698E7725F2D206A6652D945F75E9FDA2219F9D", - "timestamp": "2023-03-11T15:43:28.091291962Z", - "signature": "p6Zch1EezvNoBKqxOhNL8cDq4ZQd5SCTdQUAgu4AfZdtm6CfXepYKCdOlxZ5csBD4mJYjn4+gVt6U0c9cyDADQ==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "407DF17CD5EB1967597FC14A15A9D883DE884C93", - "timestamp": "2023-03-11T15:43:28.122551515Z", - "signature": "+NauxoI5IcY5Jp51ve04pailWNhadZdPUkmXA49QW26KsO1LH12gMg3KVyKtng2fINFbdFIi+kMfFYgR6duRCw==" - }, - { - "block_id_flag": 2, - "validator_address": "EE927F115AD4FD4BC131CA311D332ADDAC62CCAC", - "timestamp": "2023-03-11T15:43:28.128870097Z", - "signature": "AdUGKiCKKM4hIVUKwG4YIbDddZg4qMSpQHHedhevlRVia3e3Veot6Rm2K3HNTD0vduqZIEnnLlv0nB5eQnpFAw==" - }, - { - "block_id_flag": 2, - "validator_address": "A133A0F5CF118D107DC6326322460783F380C0E5", - "timestamp": "2023-03-11T15:43:28.125689429Z", - "signature": "DYE8EzkbBbLHpG58WQn9i4+3qgD3IOalZLM7F5UyMn2ruotswhlsoNdpIGG7Uh9MvQ6WGPWBbPsElzHJD7FXAg==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "CAE9614B39D1778BE2CD1762A64483560E5534B5", - "timestamp": "2023-03-11T15:43:28.133336889Z", - "signature": "Ui4VoxJg4p2/Qvqg5ntUhw8ijGIskrelG42Q2Cw2uy4KWofuWMi5muFzsg+vBRUp+HN1Lm0jh9C0a5rOfyG9CQ==" - }, - { - "block_id_flag": 2, - "validator_address": "1C9D8799534B609225D4D82A44170DAF701353BC", - "timestamp": "2023-03-11T15:43:28.145620704Z", - "signature": "2HMa6MJDd5LEOvJ4xlHzFlqObwFcLIyXZp7zAabsrhQvrbt5O5NV6iOfEySXnz9yK+vWeEyHoPjVzB58NAbuBw==" - }, - { - "block_id_flag": 2, - "validator_address": "6B52C0F9B4B0DF280F2B5D03BCA20A35C401DAD4", - "timestamp": "2023-03-11T15:43:28.134630891Z", - "signature": "qR/s2VoNl+sh30C+zX9Caf5uRztCSEnVY90Lxz+PbHQRJptddo7+j/GnNgcTfb2p0w6RzzbXDecuYPY48iKvCg==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "9B2FB5ABCB3B0289D03AF5A8577C76D9A37A32D3", - "timestamp": "2023-03-11T15:43:28.161802909Z", - "signature": "uG+3qzkV8qfFsjCZ486wFjN02sQqhlYU3I9ToNqqywKVxLg0Xs8t6mLEVrn8lDhZPjBNVkQntr1206W8SouhBA==" - }, - { - "block_id_flag": 2, - "validator_address": "FD32C8FD6F4E01D67824BC6651F5848FD9833B60", - "timestamp": "2023-03-11T15:43:28.114619598Z", - "signature": "i7EI8cWaYmViBjR7d4BcQYAMECg1x6G+mzmC7PnvShFndQtgPiamMO5xDn3J+XI2p5vk0topje70NUSbAltuDg==" - }, - { - "block_id_flag": 2, - "validator_address": "EE60B0B33489E72FE69363A1D7F0C78626CD2D39", - "timestamp": "2023-03-11T15:43:28.169993508Z", - "signature": "zIAeotO89zC+MWqB53YvLGw+NrgXnJCgStoiQzH6ztmEgzkp50s9uxIy1XrFNRWqhoVwHrhu1wIExHEv26bZAQ==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "F9D6A9FA1C7090F710DD3AC5CEB0E9005C327C13", - "timestamp": "2023-03-11T15:43:28.121051699Z", - "signature": "W0PHa1m6PeHgnutNB8Bb61Py6lYgN90sa5oobOFcMgB4U4mvTA1DacspyNpF/qiELsE8IEELgNMFXzyBLV15Dw==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "DFE827625C00547FA79217CB67CF589918218C48", - "timestamp": "2023-03-11T15:43:28.143278939Z", - "signature": "g8TuSiSquR9j5xADm/B9FdDx0LIGd0djgl9kWxeDvRQ2MFhZbzLy+TiY6MJVMcM4OI0X9bl6B+LG1ZgwX5MoCA==" - }, - { - "block_id_flag": 2, - "validator_address": "F26493B9ECA784977CC180B87D63FFE6BAC17D7A", - "timestamp": "2023-03-11T15:43:28.122476314Z", - "signature": "tcOfmQnS8VG/S8LHhwE4RkKqGdMJZL2HgqEUyJPJ8nPIqni6iJ8Cw/VwmuQ6MZZKoJbynmwuulUXpB2nh9ElBA==" - }, - { - "block_id_flag": 2, - "validator_address": "4267ED67A7D1BF6794AE82F8D753E2A0C3D64DC6", - "timestamp": "2023-03-11T15:43:28.174180977Z", - "signature": "wLSFI5fnXdAyD/4ETtaIW65gtotj7X7nhbyadiRYqjKaLDTelgVHLhEcewC5y3U+uE5mlpS98QTVjqsYA2F3Ag==" - }, - { - "block_id_flag": 2, - "validator_address": "C1B5400696B35C32195A495D65EEFAC0384AF5CC", - "timestamp": "2023-03-11T15:43:28.175152676Z", - "signature": "rMdkgjnbsNUucD4EleHmOX0b1yJjizQxwZW6LguBJusA2guwP+Gt290OkEA3BRoKhwkkEgUiRCawHWBSuB3jAg==" - }, - { - "block_id_flag": 2, - "validator_address": "4DB394CEDF34FC204B77DB197D6109328976D60F", - "timestamp": "2023-03-11T15:43:28.149473816Z", - "signature": "xL3qkwlIxqLwDAAbjJ6nsxSnOqmblbACi2F/sP6Mu0N9dCR1YqXL/NBWTjuIHYOGqouqsRz4gPgAat4wxyILCg==" - }, - { - "block_id_flag": 2, - "validator_address": "7F5741D855DEF211FD849490B7A3145E77B426D7", - "timestamp": "2023-03-11T15:43:28.174092385Z", - "signature": "T6xLvnkyLx44vrsAv6u3I7OW7XpWDj5VL6fsLYzUSwr+LuUl+nqijP5aZ5eMMJNhK0Fa2+aY1ewl2Tz999FeCA==" - }, - { - "block_id_flag": 2, - "validator_address": "362F53ADD7675FB953B8B3A464970DA4646C4E15", - "timestamp": "2023-03-11T15:43:28.186962924Z", - "signature": "XE1guOo/Y4Rw3WhPaOxEmrg9nXeMVt4VqmZwdDQOWjLNw4481w+kupM2yNeaX19dEtkKBXXHfAZlLL1l+CZfCQ==" - }, - { - "block_id_flag": 2, - "validator_address": "872E62AC3C2FD1D15DCEF5EF6682D9FE9351D5DB", - "timestamp": "2023-03-11T15:43:28.151013058Z", - "signature": "OrHdcGzn36iTYwht9l0FOfITaUNhlPmzP2YDvFpDmspoLmL+o+rAn7XHJkzgEjFgEZGRR3b8EKhnzVYfVRlyAQ==" - }, - { - "block_id_flag": 2, - "validator_address": "621BC4A3D36FE764F265ADC923F61F5EA166535B", - "timestamp": "2023-03-11T15:43:28.085265928Z", - "signature": "W6QbJZm1boSBjcYkEeI9flOnlDNdvYEXzfYP9rLZVT4/g7ccpa0V6rpFMXazzbqKduAbzEE6t/Flj4/SvdILAg==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "110F48CDE021C66B9B00441D0A6B24D358608607", - "timestamp": "2023-03-11T15:43:28.104358197Z", - "signature": "KYcf3YtU5WrNMjgMBsn+szYgOtQeygpXWkIR07+11wJgdX2+sNDBgfI5iXHfJTBI4LxMC0y33HGOyOGZHknSCg==" - }, - { - "block_id_flag": 2, - "validator_address": "D441D1654E5D553AA3ABFE79C1A83BD05D235481", - "timestamp": "2023-03-11T15:43:28.06374813Z", - "signature": "ctCt8z/GIQq7AaCiMW8CnYZikpfj4RWgePYK0rvgv5VeheFlr51V9DSDSVSOe+VTrJ/xrHGFKef2gFbYqqNNBA==" - }, - { - "block_id_flag": 2, - "validator_address": "E10AF7D9C4B73147556BD60F7F00D4329A6621D3", - "timestamp": "2023-03-11T15:43:28.203523322Z", - "signature": "Khn2Mtb6EWykAwPJcHuPv/dAjWYx/c24eGev99JP/GO6hTCkRTYdPIZZDqY5/URVkx8FAVwm/mYr9QpNH2zNAg==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "E81805AE862CBCA6340C601B6B760C9EF81E9924", - "timestamp": "2023-03-11T15:43:28.210441238Z", - "signature": "nnbtOvu1aVCNrwFyUwxL5zW9RvPA58yE+iAvIlK+Ye4oyfttj6ZmEKYc28yIoZeaj5QV6GvcK56rMY2ss4c/DQ==" - }, - { - "block_id_flag": 2, - "validator_address": "982DF85B40A0A57A9E497B8EC99896514AFD2AC1", - "timestamp": "2023-03-11T15:43:28.157904077Z", - "signature": "cks6RYIFjuAa8MhoQ6pPM60GQnuF+Xs4LfLRlFPdmoUKDieAqXVqg2NQIl0rP1vZ0TUOBvQoBy3xRap8DZQsCg==" - }, - { - "block_id_flag": 2, - "validator_address": "7EFA1652F535CB4656BF875A989108A5D1516A58", - "timestamp": "2023-03-11T15:43:28.155662397Z", - "signature": "VJyY2A1uVsAhZipMbEaTL2kAUoZFTcWYgB9uG0ba0R1zjluyp0TAloyojYVVpVNhDMSYyg8MLzPwUMlqGqbUBg==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "D77BA150C3AF6A439A2FA633335A279A09233B88", - "timestamp": "2023-03-11T15:43:28.159412663Z", - "signature": "Ra/rTH319KQ+bJXjs3sUbEGydUcL91HrekFLBw4H7IVDfZU8lyEaKoULVztzc3QyoqRVqKVWb4UgrtP94W0MCw==" - }, - { - "block_id_flag": 2, - "validator_address": "455A139106AC6CBDB8B37FC122484A18D3F08C07", - "timestamp": "2023-03-11T15:43:28.094776708Z", - "signature": "KhsvGtrUbabKp0QWjb3Bs1M/fSq5v9yrlSfPEAqmMMI4tBHQihLW9eqD6h+mURsPA0E0Z/3BbC/67WsNoVl1CA==" - }, - { - "block_id_flag": 2, - "validator_address": "4BC89C831A51124E7369972522A87F40B32EA123", - "timestamp": "2023-03-11T15:43:28.164019635Z", - "signature": "IrdYdBW+gM6W9pEs/VVR4FAt2VhjWqEdudgSLtd1gMFPW1sLHqvur4NBB36Wbu0kBdfXoItVwDu2S5W03wirCA==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "EB34C75A2B3770CD51E44DDB3B05CA6E4EE91092", - "timestamp": "2023-03-11T15:43:28.195390071Z", - "signature": "Go19bP0BNxVrKuvYlHh9Nv3D9rBYMlsBpjFoZng0YoZ/0RFLgXwUSKJb8pkAkWXkeMCDTRJjl7ooC4bBZvxKBg==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 2, - "validator_address": "84E6AD7091614E72C39B6535E6202CDB21B80B75", - "timestamp": "2023-03-11T15:43:28.124138509Z", - "signature": "D4q33fyR8mLi150PdejvM8OvGHgNnrKCZBTKZSLY2I7PzsCiIrH9/YwR775LovalrTAT1laxx0TKFMtq65ipBg==" - }, - { - "block_id_flag": 2, - "validator_address": "FAE6061472E8D5D9F334D84F616C9EF7AFDD7791", - "timestamp": "2023-03-11T15:43:28.108977997Z", - "signature": "c3/0C4P/upPe2u3kU53o0OLTIvIhUWveZUC26aTXb15PzmhO/sRHKFAjCjFgxdy1yy74bk+qSuSGbUS7rwuvDQ==" - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - }, - { - "block_id_flag": 1, - "validator_address": "", - "timestamp": "0001-01-01T00:00:00Z", - "signature": null - } - ] - }, - "dah": { - "row_roots": [ - "AAAAAAAAAAGpbEw4Tw+RieW43CdU+gLFx/8YYdMc49a7Kooxz3D4QwJ0QRqkfxky", - "//////////7//////////u49pdZvjLX9NygV7pZlYPtcUao36hMUtpGXKS6YNfLD", - "/////////////////////xR57uHxvfFHajjhen1YKqiYkVXZc86mB+rfzmhQzKkm", - "/////////////////////9SJm2MM6D9mhN7wqTID0ij7cUE2TycrUvZsniEXxFaQ" - ], - "column_roots": [ - "AAAAAAAAAAH//////////lDn69+UwNpzCmbc5R5ycngM6mZvYPlcPsfGxxidwOR9", - "qWxMOE8PkYn//////////hhrybvNXHGF3HvpX5bwHcA5afrU/E/XsXNrVfUtiJzw", - "/////////////////////8f5M8znb8YBW3FotHFI0KKkGhttXscg5y7sez/r6u1d", - "/////////////////////wrtjZVtTDxn4TBn2wxTwWa1oMjhuHRFA4OxzrV5qcXA" - ] - } -} diff --git a/adapters/celestia/src/lib.rs b/adapters/celestia/src/lib.rs index 7638de48e..9dc631aa9 100644 --- a/adapters/celestia/src/lib.rs +++ b/adapters/celestia/src/lib.rs @@ -1,13 +1,12 @@ pub mod celestia; -pub mod shares; -pub use crate::celestia::*; - #[cfg(feature = "native")] mod da_service; -pub mod pfb; -pub mod share_commit; +pub mod shares; pub mod types; mod utils; pub mod verifier; + #[cfg(feature = "native")] pub use da_service::{CelestiaService, DaServiceConfig}; + +pub use crate::celestia::*; diff --git a/adapters/celestia/src/pfb.rs b/adapters/celestia/src/pfb.rs deleted file mode 100644 index f48f8b72d..000000000 --- a/adapters/celestia/src/pfb.rs +++ /dev/null @@ -1,60 +0,0 @@ -/// BlobTx wraps an encoded sdk.Tx with a second field to contain blobs of data. -/// The raw bytes of the blobs are not signed over, instead we verify each blob -/// using the relevant MsgPayForBlobs that is signed over in the encoded sdk.Tx. -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct BlobTx { - #[prost(bytes = "bytes", tag = "1")] - pub tx: ::prost::bytes::Bytes, -} - -/// Tx is the standard type used for broadcasting transactions. -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Tx { - /// body is the processable content of the transaction - #[prost(message, optional, tag = "1")] - pub body: ::core::option::Option, -} - -/// TxBody is the body of a transaction that all signers sign over. -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct TxBody { - /// messages is a list of messages to be executed. The required signers of - /// those messages define the number and order of elements in AuthInfo's - /// signer_infos and Tx's signatures. Each required signer address is added to - /// the list only the first time it occurs. - /// By convention, the first required signer (usually from the first message) - /// is referred to as the primary signer and pays the fee for the whole - /// transaction. - #[prost(message, repeated, tag = "1")] - pub messages: ::prost::alloc::vec::Vec<::prost_types::Any>, -} - -// @generated -/// MsgPayForBlobs pays for the inclusion of a blob in the block. -#[derive( - Clone, - PartialEq, - ::prost::Message, - serde::Deserialize, - serde::Serialize, - borsh::BorshDeserialize, - borsh::BorshSerialize, -)] -pub struct MsgPayForBlobs { - #[prost(string, tag = "1")] - pub signer: ::prost::alloc::string::String, - #[prost(bytes = "bytes", repeated, tag = "2")] - pub namespace_ids: ::prost::alloc::vec::Vec<::prost::bytes::Bytes>, - #[prost(uint32, repeated, tag = "3")] - pub blob_sizes: ::prost::alloc::vec::Vec, - /// share_commitments is a list of share commitments (one per blob). - #[prost(bytes = "bytes", repeated, tag = "4")] - pub share_commitments: ::prost::alloc::vec::Vec<::prost::bytes::Bytes>, - /// share_versions are the versions of the share format that the blobs - /// associated with this message should use when included in a block. The - /// share_versions specified must match the share_versions used to generate the - /// share_commitment in this message. - #[prost(uint32, repeated, tag = "8")] - pub share_versions: ::prost::alloc::vec::Vec, -} -// @@protoc_insertion_point(module) diff --git a/adapters/celestia/src/share_commit.rs b/adapters/celestia/src/share_commit.rs deleted file mode 100644 index 3dafc0653..000000000 --- a/adapters/celestia/src/share_commit.rs +++ /dev/null @@ -1,117 +0,0 @@ -use tendermint::crypto::default::Sha256; -use tendermint::merkle::simple_hash_from_byte_vectors; - -use crate::shares::{self, Share}; - -// /// Calculates the size of the smallest square that could be used to commit -// /// to this message, following Celestia's "non-interactive default rules" -// /// https://github.com/celestiaorg/celestia-app/blob/fbfbf111bcaa056e53b0bc54d327587dee11a945/docs/architecture/adr-008-blocksize-independent-commitment.md -// fn min_square_size(message: &[u8]) -> usize { -// let square_size = message.len().next_power_of_two(); -// if message.len() < (square_size * square_size - 1) { -// return square_size; -// } else { -// return square_size << 1; -// } -// } - -#[derive(Debug, Copy, Clone, PartialEq)] -pub enum CommitmentError { - ErrMessageTooLarge, -} - -impl std::fmt::Display for CommitmentError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str("ErrMessageTooLarge") - } -} - -impl std::error::Error for CommitmentError {} - -/// Derived from -pub fn recreate_commitment( - square_size: usize, - shares: shares::BlobRef, -) -> Result<[u8; 32], CommitmentError> { - if shares.0.len() > (square_size * square_size) - 1 { - return Err(CommitmentError::ErrMessageTooLarge); - } - - let heights = power_of_2_mountain_range(shares.0.len(), square_size); - let mut leaf_sets: Vec<&[Share]> = Vec::with_capacity(heights.len()); - let mut cursor = 0; - for height in heights { - leaf_sets.push(&shares.0[cursor..cursor + height]); - cursor += height; - } - - let mut subtree_roots = Vec::with_capacity(leaf_sets.len()); - for set in leaf_sets { - let mut tree = nmt_rs::CelestiaNmt::new(); - for share in set { - let nid = share.namespace(); - tree.push_leaf(share.as_serialized(), nid) - .expect("Leaves are pushed in order"); - } - subtree_roots.push(tree.root()); - } - let h = simple_hash_from_byte_vectors::(&subtree_roots); - Ok(h) -} - -// power_of_2_mountain_range returns the heights of the subtrees for binary merkle -// mountain range -fn power_of_2_mountain_range(mut len: usize, square_size: usize) -> Vec { - let mut output = Vec::new(); - - while len != 0 { - if len >= square_size { - output.push(square_size); - len -= square_size; - } else { - let p = next_lower_power_of_2(len); - output.push(p); - len -= p; - } - } - output -} - -/// returns the largest power of 2 that is less than or equal to the input -/// Examples: -/// - next_lower_power_of_2(2): 2 -/// - next_lower_power_of_2(3): 2 -/// - next_lower_power_of_2(7): 4 -/// - next_lower_power_of_2(8): 8 -fn next_lower_power_of_2(num: usize) -> usize { - if num.is_power_of_two() { - num - } else { - num.next_power_of_two() >> 1 - } -} - -mod nmt { - // /// Build an nmt from leaves that are already prefixed with their namespace - // pub fn build_nmt_from_namespaced_leaves(namespaced_leaves: &[impl AsRef<[u8]>]) -> [u8; 48] { - // let mut tree = CelestiaNmt::new(); - // for leaf in namespaced_leaves.iter() { - // let namespace: NamespaceId = leaf.as_ref()[..8] - // .as_ref() - // .try_into() - // .expect("Namespace length is correct"); - // tree.push_leaf(&leaf.as_ref()[8..], namespace) - // .expect("Leaves are pushed in order"); - // } - // tree.root().0 - // } - - // pub fn build_nmt(leaves: &[(impl AsRef<[u8]>, NamespaceId)]) -> [u8; 48] { - // let mut tree = CelestiaNmt::new(); - // for (leaf, ns) in leaves { - // tree.push_leaf(leaf.as_ref(), *ns); - // } - - // tree.root().0 - // } -} diff --git a/adapters/celestia/src/shares.rs b/adapters/celestia/src/shares.rs index 3f543bfca..ace2a97a7 100644 --- a/adapters/celestia/src/shares.rs +++ b/adapters/celestia/src/shares.rs @@ -1,123 +1,29 @@ -use std::fmt::Display; - -use base64::engine::general_purpose::STANDARD as B64_ENGINE; -use base64::Engine; use borsh::{BorshDeserialize, BorshSerialize}; -use nmt_rs::{NamespaceId, NAMESPACE_ID_LEN}; -use prost::bytes::{Buf, BytesMut}; -use prost::encoding::decode_varint; -use prost::DecodeError; -use serde::de::Error; -use serde::{Deserialize, Serialize, Serializer}; +use celestia_types::nmt::{Namespace, NS_SIZE}; +use celestia_types::NamespacedShares; +use prost::bytes::Buf; +use serde::{Deserialize, Serialize}; use sov_rollup_interface::Bytes; -use tracing::{error, info}; +use crate::utils::read_varint; use crate::verifier::PFB_NAMESPACE; /// The length of the "reserved bytes" field in a compact share -pub const RESERVED_BYTES_LEN: usize = 4; +pub const RESERVED_BYTES_LEN: usize = + celestia_types::consts::appconsts::COMPACT_SHARE_RESERVED_BYTES; /// The length of the "info byte" field in a compact share -pub const INFO_BYTE_LEN: usize = 1; +pub const INFO_BYTE_LEN: usize = celestia_types::consts::appconsts::SHARE_INFO_BYTES; /// The length of the "sequence length" field -pub const SEQUENCE_LENGTH_BYTES: usize = 4; - -/// Skip over a varint. Returns the number of bytes read -pub fn skip_varint(mut bytes: impl Buf) -> Result { - // A varint may contain up to 10 bytes - for i in 0..10 { - // If the continuation bit is not set, we're done - if bytes.get_u8() < 0x80 { - return Ok(i + 1); - } - } - Err(ErrInvalidVarint) -} - -/// Read a varint. Returns the value (as a u64) and the number of bytes read -pub fn read_varint(mut bytes: impl Buf) -> Result<(u64, usize), DecodeError> { - let original_len = bytes.remaining(); - let varint = decode_varint(&mut bytes)?; - Ok((varint, original_len - bytes.remaining())) -} - -#[derive(Debug, PartialEq)] -pub struct ErrInvalidVarint; - +pub const SEQUENCE_LENGTH_BYTES: usize = celestia_types::consts::appconsts::SEQUENCE_LEN_BYTES; /// The size of a share, in bytes -const SHARE_SIZE: usize = 512; -/// The size of base64 encoded share, in bytes -const B64_SHARE_SIZE: usize = 684; - -#[derive( - Debug, Clone, PartialEq, serde::Serialize, Deserialize, BorshDeserialize, BorshSerialize, -)] -/// A group of shares, in a single namespace -pub enum NamespaceGroup { - Compact(Vec), - Sparse(Vec), -} +pub const SHARE_SIZE: usize = celestia_types::consts::appconsts::SHARE_SIZE; -#[derive(Debug, Clone, PartialEq, BorshDeserialize, BorshSerialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, BorshDeserialize, BorshSerialize)] pub enum Share { Continuation(Bytes), Start(Bytes), } -impl AsRef<[u8]> for Share { - fn as_ref(&self) -> &[u8] { - match self { - Share::Continuation(c) => c.as_ref(), - Share::Start(s) => s.as_ref(), - } - } -} - -impl Serialize for Share { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let inner_bytes = match self { - Share::Continuation(b) => b, - Share::Start(b) => b, - }; - serializer.serialize_bytes(inner_bytes.as_ref()) - } -} - -impl<'de> Deserialize<'de> for Share { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - let mut share = ::deserialize(deserializer)?; - if share.len() == B64_SHARE_SIZE { - let mut decoded = BytesMut::zeroed(SHARE_SIZE); - // TODO: https://github.com/marshallpierce/rust-base64/issues/210 - B64_ENGINE - .decode_slice_unchecked(share, &mut decoded[..]) - .map_err(|_| Error::custom("Invalid base64 encoding"))?; - share = decoded.freeze() - } - if share.len() != SHARE_SIZE { - // let expected = Unexpected::Bytes(&share); - return Err(Error::invalid_length(share.len(), &"A share of length 512")); - } - if is_continuation_unchecked(share.as_ref()) { - return Ok(Share::Continuation(share)); - } - Ok(Share::Start(share)) - } -} - -fn is_continuation_unchecked(share: &[u8]) -> bool { - share[8] & 0x01 == 0 -} - -fn enforce_version_zero(share: &[u8]) { - assert_eq!(share[8] & !0x01, 0) -} - #[derive(Debug, Clone, PartialEq, Copy)] pub enum ShareError { NotAStartShare, @@ -134,6 +40,10 @@ impl Share { } } + pub fn from_slice(slice: impl AsRef<[u8]>) -> Self { + Self::new(Bytes::copy_from_slice(slice.as_ref())) + } + pub fn as_serialized(&self) -> &[u8] { self.raw_inner_ref() } @@ -150,7 +60,7 @@ impl Share { Share::Continuation(_) => Err(ShareError::NotAStartShare), Share::Start(inner) => { let mut inner = inner.clone(); - inner.advance(9); + inner.advance(NS_SIZE + INFO_BYTE_LEN); Ok(inner.get_u32() as u64) } } @@ -184,7 +94,7 @@ impl Share { // FIXME: account for continuation vs. start shares match self { Share::Continuation(_) => { - let reserved_bytes_offset = NAMESPACE_ID_LEN + INFO_BYTE_LEN; + let reserved_bytes_offset = NS_SIZE + INFO_BYTE_LEN; let mut raw = self.raw_inner(); raw.advance(reserved_bytes_offset); let idx_of_next_start = raw.get_u32() as usize; @@ -201,7 +111,7 @@ impl Share { fn get_data_offset(&self) -> usize { // All shares are prefixed with metadata including the namespace (8 bytes), and info byte (1 byte) - let mut offset = NAMESPACE_ID_LEN + INFO_BYTE_LEN; + let mut offset = NS_SIZE + INFO_BYTE_LEN; // Start shares are also prefixed with a sequence length if let Self::Start(_) = self { offset += SEQUENCE_LENGTH_BYTES; @@ -226,10 +136,11 @@ impl Share { } /// Get the namespace associated with this share - pub fn namespace(&self) -> NamespaceId { - let mut out = [0u8; 8]; - out.copy_from_slice(&self.raw_inner_ref()[..8]); - NamespaceId(out) + pub fn namespace(&self) -> Namespace { + let out: [_; NS_SIZE] = self.raw_inner_ref()[..NS_SIZE] + .try_into() + .expect("can't fail for correct size"); + nmt_rs::NamespaceId(out).into() } pub fn is_valid_tx_start(&self, idx: usize) -> bool { @@ -257,96 +168,40 @@ impl Share { } } -#[derive(Debug, PartialEq, Clone, Copy)] -pub enum ShareParsingError { - ErrInvalidBase64, - ErrWrongLength, -} - -impl Display for ShareParsingError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl AsRef<[u8]> for Share { + fn as_ref(&self) -> &[u8] { match self { - ShareParsingError::ErrInvalidBase64 => { - f.write_str("ShareParsingError::ErrInvalidBase64") - } - ShareParsingError::ErrWrongLength => f.write_str("ShareParsingError::ErrWrongLength"), + Share::Continuation(c) => c.as_ref(), + Share::Start(s) => s.as_ref(), } } } -impl std::error::Error for ShareParsingError {} - -impl NamespaceGroup { - pub fn from_b64(b64: &str) -> Result { - if b64.is_empty() { - error!("Empty input"); - return Err(ShareParsingError::ErrWrongLength); - } - - let mut decoded = Vec::with_capacity((b64.len() + 3) / 4 * 3); - - // unsafe { decoded.set_len((b64.len() / 4 * 3)) } - if let Err(err) = B64_ENGINE.decode_slice(b64, &mut decoded) { - info!("Error decoding NamespaceGroup from base64: {}", err); - return Err(ShareParsingError::ErrInvalidBase64); - } - let mut output: Bytes = decoded.into(); - if output.len() % SHARE_SIZE != 0 { - error!( - "Wrong length: Expected a multiple of 512, got: {}", - output.len() - ); - return Err(ShareParsingError::ErrWrongLength); - } - let mut shares = Vec::with_capacity((output.len() / 512) + 1); - while output.len() > SHARE_SIZE { - shares.push(Share::new(output.split_to(SHARE_SIZE))); - } - shares.push(Share::new(output)); - // Check whether these shares come from a reserved (compact) namespace - - if shares[0].namespace().is_reserved() { - Ok(Self::Compact(shares)) - } else { - Ok(Self::Sparse(shares)) - } - } +fn is_continuation_unchecked(share: &[u8]) -> bool { + share[NS_SIZE] & 0x01 == 0 +} - pub fn from_b64_shares(encoded_shares: &Vec) -> Result { - if encoded_shares.is_empty() { - return Ok(Self::Sparse(vec![])); - } - let mut shares = Vec::with_capacity(encoded_shares.len()); - for share in encoded_shares { - let decoded_vec = B64_ENGINE - .decode(share) - .map_err(|_| ShareParsingError::ErrInvalidBase64)?; - if decoded_vec.len() != 512 { - return Err(ShareParsingError::ErrWrongLength); - } - let share = Share::new(decoded_vec.into()); - shares.push(share) - } +fn enforce_version_zero(share: &[u8]) { + assert_eq!(share[NS_SIZE] & !0x01, 0) +} - if shares[0].namespace().is_reserved() { - Ok(Self::Compact(shares)) - } else { - Ok(Self::Sparse(shares)) - } - } +/// A group of shares, in a single namespace +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, BorshDeserialize, BorshSerialize)] +pub enum NamespaceGroup { + Compact(Vec), + Sparse(Vec), +} - // Panics if less than 1 share is provided - pub fn from_shares_unchecked(shares: Vec>) -> Self { - let shares: Vec = shares +impl NamespaceGroup { + pub fn from_shares(shares: I) -> Self + where + I: IntoIterator, + B: AsRef<[u8]>, + { + shares .into_iter() - .map(|share| Share::new(Bytes::from(share))) - .collect(); - - if shares[0].namespace().is_reserved() { - Self::Compact(shares) - } else { - Self::Sparse(shares) - } + .map(|bytes| Share::new(Bytes::copy_from_slice(bytes.as_ref()))) + .collect() } pub fn shares(&self) -> &Vec { @@ -362,7 +217,34 @@ impl NamespaceGroup { shares: self, } } + + pub fn is_empty(&self) -> bool { + self.shares().is_empty() + } +} + +impl FromIterator for NamespaceGroup { + fn from_iter>(iter: T) -> Self { + let shares: Vec<_> = iter.into_iter().collect(); + if shares.is_empty() { + // if there are no shares at all return sparse empty group + return NamespaceGroup::Sparse(vec![]); + } + + if shares[0].namespace().is_reserved() { + NamespaceGroup::Compact(shares) + } else { + NamespaceGroup::Sparse(shares) + } + } } + +impl From<&NamespacedShares> for NamespaceGroup { + fn from(value: &NamespacedShares) -> Self { + Self::from_shares(value.rows.iter().flat_map(|row| row.shares.iter())) + } +} + #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, BorshDeserialize, BorshSerialize)] pub struct Blob(pub Vec); @@ -604,16 +486,12 @@ impl<'a> std::iter::Iterator for NamespaceIterator<'a> { return Some(BlobRef::with(&shares[start..self.offset])); } } - // let start = self.offset; - // let length = 0; - // loop { - - // } } } #[cfg(test)] mod tests { + use celestia_types::nmt::NS_ID_V0_SIZE; use postcard::{from_bytes, to_allocvec, Result}; use proptest::collection::vec; use proptest::prelude::*; @@ -635,11 +513,19 @@ mod tests { assert_eq!(share, decoded_share); } - fn share_bytes_strategy() -> impl Strategy> { - vec(0u8.., 9..=SHARE_SIZE).prop_map(|mut vec| { - vec[8] &= 0x01; - vec - }) + prop_compose! { + fn share_bytes_strategy()( + ns in vec(0u8.., NS_ID_V0_SIZE), + mut share in vec(0u8.., SHARE_SIZE), + ) -> Vec { + let namespace = Namespace::new_v0(&ns).expect("doesn't exceed size"); + // overwrite namespace + share[..NS_SIZE].copy_from_slice(namespace.as_ref()); + // set version to zero + share[NS_SIZE] &= 0x01; + + share + } } proptest! { diff --git a/adapters/celestia/src/types.rs b/adapters/celestia/src/types.rs index 951fca0d7..b606d801b 100644 --- a/adapters/celestia/src/types.rs +++ b/adapters/celestia/src/types.rs @@ -1,81 +1,36 @@ use std::collections::HashMap; - -use anyhow::ensure; -use base64::engine::general_purpose::STANDARD as B64_ENGINE; -use base64::Engine; -use borsh::{BorshDeserialize, BorshSerialize}; -pub use nmt_rs::NamespaceId; +use std::slice::Chunks; + +use anyhow::{bail, ensure}; +// use borsh::{BorshDeserialize, BorshSerialize}; +use celestia_proto::celestia::blob::v1::MsgPayForBlobs; +use celestia_types::consts::appconsts::SHARE_SIZE; +/// Reexport the [`Namespace`] from `celestia-types` +pub use celestia_types::nmt::Namespace; +use celestia_types::nmt::{NamespacedHash, Nmt, NS_SIZE}; +use celestia_types::{ + DataAvailabilityHeader, ExtendedDataSquare, ExtendedHeader, NamespacedShares, ValidateBasic, +}; use serde::{Deserialize, Serialize}; use sov_rollup_interface::da::BlockHeaderTrait; use sov_rollup_interface::services::da::SlotData; use sov_rollup_interface::Bytes; -use tendermint::crypto::default::Sha256; -use tendermint::merkle; +use tracing::debug; -use crate::pfb::MsgPayForBlobs; -use crate::shares::{NamespaceGroup, Share}; +use crate::shares::NamespaceGroup; use crate::utils::BoxError; -use crate::verifier::{ChainValidityCondition, PARITY_SHARES_NAMESPACE}; -use crate::{CelestiaHeader, TxPosition}; - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -pub struct RpcNamespacedShares { - #[serde(rename = "Proof")] - pub proof: JsonNamespaceProof, - #[serde(rename = "Shares")] - pub shares: Vec, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -pub struct JsonNamespaceProof { - #[serde(rename = "Start")] - start: usize, - #[serde(rename = "End")] - end: usize, - #[serde(rename = "Nodes")] - nodes: Option>, -} - -#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] -pub struct ExtendedDataSquare { - pub data_square: Vec, - pub codec: String, -} - -impl ExtendedDataSquare { - pub fn square_size(&self) -> Result { - let len = self.data_square.len(); - let square_size = (len as f64).sqrt() as usize; - ensure!( - square_size * square_size == len, - "eds size {} is not a perfect square", - len - ); - Ok(square_size) - } +use crate::verifier::{ChainValidityCondition, PARITY_SHARES_NAMESPACE, PFB_NAMESPACE}; +use crate::{parse_pfb_namespace, CelestiaHeader, TxPosition}; - pub fn rows(&self) -> Result, BoxError> { - let square_size = self.square_size()?; - - let mut output = Vec::with_capacity(square_size); - for i in 0..square_size { - let row_start = i * square_size; - let row_end = (i + 1) * square_size; - output.push(&self.data_square[row_start..row_end]) - } - Ok(output) - } -} - -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, BorshSerialize, BorshDeserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] // TODO: , BorshSerialize, BorshDeserialize)] pub struct FilteredCelestiaBlock { pub header: CelestiaHeader, pub rollup_data: NamespaceGroup, /// A mapping from blob commitment to the PFB containing that commitment /// for each blob addressed to the rollup namespace pub relevant_pfbs: HashMap, - /// All rows in the extended data square which contain rollup data - pub rollup_rows: Vec, + /// All rollup shares as they appear in extended data square, with proofs + pub rollup_rows: NamespacedShares, /// All rows in the extended data square which contain pfb data pub pfb_rows: Vec, } @@ -104,6 +59,46 @@ impl SlotData for FilteredCelestiaBlock { } impl FilteredCelestiaBlock { + pub fn new( + rollup_ns: Namespace, + header: ExtendedHeader, + rollup_rows: NamespacedShares, + etx_rows: NamespacedShares, + data_square: ExtendedDataSquare, + ) -> Result { + // validate the extended data square + data_square.validate()?; + + let rollup_data = NamespaceGroup::from(&rollup_rows); + let tx_data = NamespaceGroup::from(&etx_rows); + + // Parse out all of the rows containing etxs + debug!("Parsing namespaces..."); + let pfb_rows = + get_rows_containing_namespace(PFB_NAMESPACE, &header.dah, data_square.rows()?)?; + + // Parse out the pfds and store them for later retrieval + debug!("Decoding pfb protobufs..."); + let pfbs = parse_pfb_namespace(tx_data)?; + let mut pfb_map = HashMap::new(); + for tx in pfbs { + for (idx, nid) in tx.0.namespaces.iter().enumerate() { + if nid == rollup_ns.as_bytes() { + // TODO: Retool this map to avoid cloning txs + pfb_map.insert(tx.0.share_commitments[idx].clone().into(), tx.clone()); + } + } + } + + Ok(FilteredCelestiaBlock { + header: CelestiaHeader::new(header.dah, header.header.into()), + rollup_data, + relevant_pfbs: pfb_map, + rollup_rows, + pfb_rows, + }) + } + pub fn square_size(&self) -> usize { self.header.square_size() } @@ -124,128 +119,257 @@ impl FilteredCelestiaBlock { } } -#[derive(Debug, Copy, Clone, PartialEq)] +#[derive(Debug, thiserror::Error)] pub enum ValidationError { + #[error("Missing data hash in header")] MissingDataHash, + + #[error("Data root hash doesn't match computed one")] InvalidDataRoot, + + #[error("Invalid etx proof: {0}")] InvalidEtxProof(&'static str), + + #[error("Transaction missing")] MissingTx, + + #[error("Invalid row proof")] InvalidRowProof, + + #[error("Invalid signer")] InvalidSigner, + + #[error("Incomplete data")] IncompleteData, + + #[error(transparent)] + DahValidation(#[from] celestia_types::ValidationError), } impl CelestiaHeader { pub fn validate_dah(&self) -> Result<(), ValidationError> { - let rows_iter = self.dah.row_roots.iter(); - let cols_iter = self.dah.column_roots.iter(); - let byte_vecs: Vec<&NamespacedHash> = rows_iter.chain(cols_iter).collect(); - let root = merkle::simple_hash_from_byte_vectors::(&byte_vecs); + self.dah.validate_basic()?; let data_hash = self .header .data_hash .as_ref() .ok_or(ValidationError::MissingDataHash)?; - if root != data_hash.0 { + if self.dah.hash != data_hash.0 { return Err(ValidationError::InvalidDataRoot); } Ok(()) } } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, BorshDeserialize, BorshSerialize)] +pub trait ExtendedDataSquareExt { + fn square_size(&self) -> Result; + + fn rows(&self) -> Result>, BoxError>; + + fn validate(&self) -> Result<(), BoxError>; +} + +impl ExtendedDataSquareExt for ExtendedDataSquare { + fn square_size(&self) -> Result { + let len = self.data_square.len(); + let square_size = (len as f64).sqrt() as usize; + ensure!( + square_size * square_size == len, + "eds size {} is not a perfect square", + len + ); + Ok(square_size) + } + + fn rows(&self) -> Result>, BoxError> { + let square_size = self.square_size()?; + Ok(self.data_square.chunks(square_size)) + } + + fn validate(&self) -> Result<(), BoxError> { + let len = self.square_size()?; + ensure!(len * len == self.data_square.len(), "Invalid square size"); + + if let Some(share) = self + .rows() + .expect("after first check this must succeed") + .flatten() + .find(|shares| shares.len() != SHARE_SIZE) + { + bail!("Invalid share size: {}", share.len()) + } + Ok(()) + } +} + +#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize)] // TODO: , BorshSerialize, BorshDeserialize)] pub struct Row { - pub shares: Vec, + pub shares: Vec>, pub root: NamespacedHash, } impl Row { - pub fn merklized(&self) -> CelestiaNmt { - let mut nmt = CelestiaNmt::new(); + pub fn merklized(&self) -> Nmt { + let mut nmt = Nmt::new(); for (idx, share) in self.shares.iter().enumerate() { // Shares in the two left-hand quadrants are prefixed with their namespace, while parity - // shares (in the right-hand) quadrants always have the PARITY_SHARES_NAMESPACE + // shares (in the right-hand) quadrants should always be treated as PARITY_SHARES_NAMESPACE let namespace = if idx < self.shares.len() / 2 { - share.namespace() + share_namespace_unchecked(share) } else { PARITY_SHARES_NAMESPACE }; - nmt.push_leaf(share.as_serialized(), namespace) + nmt.push_leaf(share.as_ref(), *namespace) .expect("shares are pushed in order"); } - assert_eq!(&nmt.root(), &self.root); nmt } } -#[derive(Deserialize, Serialize, PartialEq, Debug, Clone)] -pub struct StringWrapper { - #[serde(rename = "/")] - pub inner: String, +/// get namespace from a share without verifying if it's a correct namespace +/// (version 0 or parity ns). +fn share_namespace_unchecked(share: &[u8]) -> Namespace { + nmt_rs::NamespaceId( + share[..NS_SIZE] + .try_into() + .expect("must succeed for correct size"), + ) + .into() } -#[derive(Deserialize, Serialize, PartialEq, Debug, Clone)] -pub struct RpcNamespacedSharesResponse(pub Option>); +fn get_rows_containing_namespace<'a>( + nid: Namespace, + dah: &'a DataAvailabilityHeader, + data_square_rows: impl Iterator]>, +) -> Result, BoxError> { + let mut output = vec![]; + + for (row, root) in data_square_rows.zip(dah.row_roots.iter()) { + if root.contains(*nid) { + output.push(Row { + shares: row.to_vec(), + root: root.clone(), + }) + } + } + Ok(output) +} -use nmt_rs::simple_merkle::proof::Proof; -use nmt_rs::{ - CelestiaNmt, NamespaceProof, NamespacedHash, NamespacedSha2Hasher, NAMESPACED_HASH_LEN, -}; +#[cfg(test)] +pub mod tests { + use celestia_types::nmt::Namespace; + use celestia_types::{ExtendedDataSquare, ExtendedHeader, NamespacedShares}; + + use super::FilteredCelestiaBlock; + use crate::verifier::PFB_NAMESPACE; + + pub const ROLLUP_NAMESPACE: Namespace = Namespace::const_v0(*b"\0\0sov-test"); + + pub mod with_rollup_data { + use super::*; + + pub const HEADER_JSON: &str = + include_str!("../test_data/block_with_rollup_data/header.json"); + pub const ROLLUP_ROWS_JSON: &str = + include_str!("../test_data/block_with_rollup_data/rollup_rows.json"); + pub const ETX_ROWS_JSON: &str = + include_str!("../test_data/block_with_rollup_data/etx_rows.json"); + pub const EDS_JSON: &str = include_str!("../test_data/block_with_rollup_data/eds.json"); + + pub fn filtered_block() -> FilteredCelestiaBlock { + filtered_block_from_jsons( + ROLLUP_NAMESPACE, + HEADER_JSON, + ROLLUP_ROWS_JSON, + ETX_ROWS_JSON, + EDS_JSON, + ) + } + } -impl From for NamespaceProof { - fn from(val: JsonNamespaceProof) -> Self { - NamespaceProof::PresenceProof { - proof: Proof { - siblings: val - .nodes - .unwrap_or_default() - .into_iter() - .map(|v| ns_hash_from_b64(&v.inner)) - .collect(), - start_idx: val.start as u32, - }, - ignore_max_ns: true, + pub mod without_rollup_data { + use super::*; + + pub const HEADER_JSON: &str = + include_str!("../test_data/block_without_rollup_data/header.json"); + pub const ROLLUP_ROWS_JSON: &str = + include_str!("../test_data/block_without_rollup_data/rollup_rows.json"); + pub const ETX_ROWS_JSON: &str = + include_str!("../test_data/block_without_rollup_data/etx_rows.json"); + pub const EDS_JSON: &str = include_str!("../test_data/block_without_rollup_data/eds.json"); + + pub fn filtered_block() -> FilteredCelestiaBlock { + filtered_block_from_jsons( + ROLLUP_NAMESPACE, + HEADER_JSON, + ROLLUP_ROWS_JSON, + ETX_ROWS_JSON, + EDS_JSON, + ) } } -} -fn ns_hash_from_b64(input: &str) -> NamespacedHash { - let mut output = [0u8; NAMESPACED_HASH_LEN]; - B64_ENGINE - .decode_slice(input, &mut output[..]) - .expect("must be valid b64"); - NamespacedHash(output) -} + fn filtered_block_from_jsons( + ns: Namespace, + header: &str, + rollup_rows: &str, + etx_rows: &str, + eds: &str, + ) -> FilteredCelestiaBlock { + let header: ExtendedHeader = serde_json::from_str(header).unwrap(); + let rollup_rows: NamespacedShares = serde_json::from_str(rollup_rows).unwrap(); + let etx_rows: NamespacedShares = serde_json::from_str(etx_rows).unwrap(); + let eds: ExtendedDataSquare = serde_json::from_str(eds).unwrap(); + + FilteredCelestiaBlock::new(ns, header, rollup_rows, etx_rows, eds).unwrap() + } -#[cfg(test)] -mod tests { - - // use nmt_rs::{NamespaceProof, NamespacedSha2Hasher}; - - // use super::{ns_hash_from_b64, RpcNamespacedSharesResponse}; - - // const ROW_ROOTS: &[&'static str] = &[ - // "AAAAAAAAAAEAAAAAAAAAAT4A1HvHQCYkf1sQ7zmTJH11jd1Hxn+YCcC9mIGbl1WJ", - // "c292LXRlc3T//////////vSMLQPlgfwCOf4QTkOhMnQxk6ra3lI+ybCMfUyanYSd", - // "/////////////////////wp55V2JEu8z3LhdNIIqxbq6uvpyGSGu7prq67ajVVAt", - // "/////////////////////7gaLStbqIBiy2pxi1D68MFUpq6sVxWBB4zdQHWHP/Tl", - // ]; - - // TODO: Re-enable this test after Celestia releases an endpoint which returns nmt proofs instead of - // ipld.Proofs - // #[test] - // fn test_known_good_msg() { - // let msg = r#"[{"Proof":{"End":1,"Nodes":[{"/":"bagao4amb5yatb7777777777773777777777777tjxe2jqsatxobgu3jqwkwsefsxscursxyaqzvvrxzv73aphwunua"},{"/":"bagao4amb5yatb77777777777777777777777776yvm54zu2vfqwyhd2nsebctxar7pxutz6uya7z3m2tzsmdtshjbm"}],"Start":0},"Shares":["c292LXRlc3QBKHsia2V5IjogInRlc3RrZXkiLCAidmFsdWUiOiAidGVzdHZhbHVlIn0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="]}]"#; - // let deserialized: RpcNamespacedSharesResponse = - // serde_json::from_str(msg).expect("message must deserialize"); - - // let root = ns_hash_from_b64(ROW_ROOTS[0]); - - // for row in deserialized.0.expect("shares response is not empty") { - // let proof: NamespaceProof = row.proof.into(); - // proof - // .verify_range(&root, &row.shares, ROLLUP_NAMESPACE) - // .expect("proof should be valid"); - // } - // } + #[test] + fn filtered_block_with_rollup_data() { + let block = with_rollup_data::filtered_block(); + + // valid dah + block.header.validate_dah().unwrap(); + + // single rollup share + assert_eq!(block.rollup_data.shares().len(), 1); + assert_eq!(block.rollup_rows.rows.len(), 1); + assert_eq!(block.rollup_rows.rows[0].shares.len(), 1); + assert!(block.rollup_rows.rows[0].proof.is_of_presence()); + + // 3 pfbs at all but only one belongs to rollup + assert_eq!(block.pfb_rows.len(), 1); + let pfbs_count = block.pfb_rows[0] + .shares + .iter() + .filter(|share| share.starts_with(PFB_NAMESPACE.as_ref())) + .count(); + assert_eq!(pfbs_count, 3); + assert_eq!(block.relevant_pfbs.len(), 1); + } + + #[test] + fn filtered_block_without_rollup_data() { + let block = without_rollup_data::filtered_block(); + + // valid dah + block.header.validate_dah().unwrap(); + + // no rollup shares + assert_eq!(block.rollup_data.shares().len(), 0); + // we still get single row, but with absence proof and no shares + assert_eq!(block.rollup_rows.rows.len(), 1); + assert_eq!(block.rollup_rows.rows[0].shares.len(), 0); + assert!(block.rollup_rows.rows[0].proof.is_of_absence()); + + // 2 pfbs at all and no relevant + assert_eq!(block.pfb_rows.len(), 1); + let pfbs_count = block.pfb_rows[0] + .shares + .iter() + .filter(|share| share.starts_with(PFB_NAMESPACE.as_ref())) + .count(); + assert_eq!(pfbs_count, 2); + assert_eq!(block.relevant_pfbs.len(), 0); + } } diff --git a/adapters/celestia/src/utils.rs b/adapters/celestia/src/utils.rs index 87a9f17a1..2e0714c94 100644 --- a/adapters/celestia/src/utils.rs +++ b/adapters/celestia/src/utils.rs @@ -1 +1,12 @@ +use prost::encoding::decode_varint; +use prost::DecodeError; +use sov_rollup_interface::Buf; + pub type BoxError = anyhow::Error; + +/// Read a varint. Returns the value (as a u64) and the number of bytes read +pub fn read_varint(mut bytes: impl Buf) -> Result<(u64, usize), DecodeError> { + let original_len = bytes.remaining(); + let varint = decode_varint(&mut bytes)?; + Ok((varint, original_len - bytes.remaining())) +} diff --git a/adapters/celestia/src/verifier/address.rs b/adapters/celestia/src/verifier/address.rs index 0750a36ff..fc7455564 100644 --- a/adapters/celestia/src/verifier/address.rs +++ b/adapters/celestia/src/verifier/address.rs @@ -1,106 +1,52 @@ use std::fmt::{Display, Formatter}; use std::str::FromStr; -use bech32::WriteBase32; -use borsh::{BorshDeserialize, BorshSerialize}; +use anyhow::Context; +use celestia_types::state::{AccAddress, AddressKind, AddressTrait}; +// use borsh::{BorshDeserialize, BorshSerialize}; use serde::{Deserialize, Serialize}; -use thiserror::Error; - -/// Human Readable Part: "celestia" for Celestia network -const HRP: &str = "celestia"; -/// Bech32 variant is used for Celestia and CosmosSDK -const VARIANT: bech32::Variant = bech32::Variant::Bech32; - -/// Representation of the address in the Celestia network -/// -/// Spec says: "Addresses have a length of 32 bytes.", but in reality it is 32 `u5` elements, which can be compressed as 20 bytes. -/// TODO: Switch to bech32::u5 when it has repr transparent: -#[derive( - Debug, PartialEq, Clone, Eq, Serialize, Deserialize, BorshDeserialize, BorshSerialize, Hash, -)] -pub struct CelestiaAddress([u8; 32]); + +#[derive(Debug, PartialEq, Clone, Eq, Serialize, Deserialize, Hash)] // TODO: , BorshDeserialize, BorshSerialize)] +pub struct CelestiaAddress(AccAddress); impl AsRef<[u8]> for CelestiaAddress { fn as_ref(&self) -> &[u8] { - self.0.as_ref() + self.0.id_ref().as_ref() } } /// Decodes slice of bytes into CelestiaAddress /// Treats it as string if it starts with HRP and the rest is valid ASCII -/// Otherwise just checks if it contains valid `u5` elements and has the correct length. +/// Otherwise just decodes the tendermint Id and creates address from that. impl<'a> TryFrom<&'a [u8]> for CelestiaAddress { type Error = anyhow::Error; fn try_from(value: &'a [u8]) -> Result { - if value.starts_with(HRP.as_bytes()) && value.is_ascii() { + let hrp = AddressKind::Account.prefix(); + + if value.starts_with(hrp.as_bytes()) && value.is_ascii() { // safety, because we checked that it is ASCII let s = unsafe { std::str::from_utf8_unchecked(value) }; - return CelestiaAddress::from_str(s).map_err(|e| anyhow::anyhow!("{}", e)); - } - if value.len() != 32 { - anyhow::bail!("An address must be 32 u5 long"); + s.parse().context("failed parsing celestia address") + } else { + let array = value.try_into().context("invalid slice length")?; + let id = tendermint::account::Id::new(array); + Ok(Self(AccAddress::new(id))) } - let mut raw_address = [0u8; 32]; - for (idx, &item) in value.iter().enumerate() { - bech32::u5::try_from_u8(item) - .map_err(|e| anyhow::anyhow!("Element at {} is not u5: {}", idx, e))?; - raw_address[idx] = item; - } - Ok(Self(raw_address)) } } impl Display for CelestiaAddress { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - let mut w = bech32::Bech32Writer::new(HRP, VARIANT, f)?; - for elem in self.0.iter() { - // It is ok to unwrap, because we always sanitize data - w.write_u5(bech32::u5::try_from_u8(*elem).unwrap())?; - } - w.finalize() + write!(f, "{}", self.0) } } -#[derive(Clone, Debug, Error, PartialEq)] -/// An error which occurs while decoding a `CelestialAddress` from a string. -pub enum CelestiaAddressFromStrError { - /// The address has an invalid human-readable prefix. - /// Valid addresses must start with the prefix 'celestia'. - #[error("The address has an invalid human-readable prefix. Valid addresses must start with the prefix 'celestia', but this one began with {0}")] - InvalidHumanReadablePrefix(String), - /// The address has an invalid human-readable prefix. - /// Valid addresses must start with the prefix 'celestia'. - #[error("The address has an invalid bech32 variant. Valid addresses must be encoded in Bech32, but this is encoded in Bech32m")] - InvalidVariant, - /// The address could not be decoded as valid bech32 - #[error("The address could not be decoded as valid bech32: {0}")] - InvalidBech32(#[from] bech32::Error), -} - impl FromStr for CelestiaAddress { - type Err = CelestiaAddressFromStrError; + type Err = ::Err; fn from_str(s: &str) -> Result { - let (hrp, raw_address_u5, variant) = bech32::decode(s)?; - if hrp != HRP { - return Err(CelestiaAddressFromStrError::InvalidHumanReadablePrefix(hrp)); - } - if variant != VARIANT { - return Err(CelestiaAddressFromStrError::InvalidVariant); - } - if raw_address_u5.len() != 32 { - return Err(CelestiaAddressFromStrError::InvalidBech32( - bech32::Error::InvalidLength, - )); - } - - let mut value: [u8; 32] = [0; 32]; - - for (idx, &item) in raw_address_u5.iter().enumerate() { - value[idx] = item.to_u8(); - } - Ok(Self(value)) + Ok(Self(s.parse()?)) } } @@ -145,7 +91,8 @@ mod tests { // 20 u8 -> 32 u5 fn check_from_bytes_as_ascii(input: [u8; 20]) { - let encoded = bech32::encode("celestia", input.to_base32(), VARIANT).unwrap(); + let encoded = + bech32::encode("celestia", input.to_base32(), bech32::Variant::Bech32).unwrap(); let bytes = encoded.as_bytes(); let address = CelestiaAddress::try_from(bytes); assert!(address.is_ok()); @@ -156,7 +103,8 @@ mod tests { // 20 u8 -> 32 u5 fn check_from_as_ref(input: [u8; 20]) { - let encoded = bech32::encode("celestia", input.to_base32(), VARIANT).unwrap(); + let encoded = + bech32::encode("celestia", input.to_base32(), bech32::Variant::Bech32).unwrap(); let address1 = CelestiaAddress::from_str(&encoded).unwrap(); let bytes = address1.as_ref(); let address = CelestiaAddress::try_from(bytes); @@ -166,20 +114,6 @@ mod tests { assert_eq!(encoded, output); } - // 20 u8 -> 32 u5 - fn check_borsh(input: [u8; 20]) { - let address_str = bech32::encode("celestia", input.to_base32(), VARIANT).unwrap(); - - let address = CelestiaAddress::from_str(&address_str).unwrap(); - let serialized = BorshSerialize::try_to_vec(&address).unwrap(); - let deserialized = CelestiaAddress::try_from_slice(&serialized).unwrap(); - - assert_eq!(deserialized, address); - - let address_str2 = format!("{}", deserialized); - assert_eq!(address_str2, address_str); - } - proptest! { #[test] fn test_try_from_any_slice(input in prop::collection::vec(any::(), 0..100)) { @@ -195,14 +129,9 @@ mod tests { // According to spec, alphanumeric characters excluding "1" "b" "i" and "o" fn test_from_str_lowercase_ascii(input in "celestia1[023456789ac-hj-np-z]{38}") { let result = CelestiaAddress::from_str(&input); - match result { - Ok(address) => { - let output = format!("{}", address); - assert_eq!(input, output); - } - Err(err) => { - assert_eq!(CelestiaAddressFromStrError::InvalidBech32(bech32::Error::InvalidChecksum), err); - }, + if let Ok(address) = result { + let output = format!("{}", address); + assert_eq!(input, output); } } @@ -215,10 +144,5 @@ mod tests { fn test_try_as_ref_from(input in proptest::array::uniform20(0u8..=255)) { check_from_as_ref(input); } - - #[test] - fn test_borsh(input in proptest::array::uniform20(0u8..=255)) { - check_borsh(input); - } } } diff --git a/adapters/celestia/src/verifier/mod.rs b/adapters/celestia/src/verifier/mod.rs index 1e3c9ea7f..a63e73b26 100644 --- a/adapters/celestia/src/verifier/mod.rs +++ b/adapters/celestia/src/verifier/mod.rs @@ -1,5 +1,6 @@ use borsh::{BorshDeserialize, BorshSerialize}; -use nmt_rs::NamespaceId; +use celestia_types::nmt::Namespace; +use celestia_types::{Commitment, DataAvailabilityHeader, NamespacedShares}; use serde::{Deserialize, Serialize}; use sov_rollup_interface::da::{ self, BlobReaderTrait, BlockHashTrait as BlockHash, BlockHeaderTrait, DaSpec, @@ -12,22 +13,22 @@ use thiserror::Error; pub mod address; pub mod proofs; -use proofs::*; #[cfg(all(target_os = "zkvm", feature = "bench"))] use sov_zk_cycle_macros::cycle_tracker; use self::address::CelestiaAddress; -use crate::share_commit::recreate_commitment; -use crate::shares::{read_varint, NamespaceGroup, Share}; +use self::proofs::*; +use crate::shares::{NamespaceGroup, Share}; use crate::types::ValidationError; -use crate::{pfb_from_iter, BlobWithSender, CelestiaHeader, DataAvailabilityHeader}; +use crate::utils::read_varint; +use crate::{pfb_from_iter, BlobWithSender, CelestiaHeader}; pub struct CelestiaVerifier { - pub rollup_namespace: NamespaceId, + pub rollup_namespace: Namespace, } -pub const PFB_NAMESPACE: NamespaceId = NamespaceId(hex_literal::hex!("0000000000000004")); -pub const PARITY_SHARES_NAMESPACE: NamespaceId = NamespaceId(hex_literal::hex!("ffffffffffffffff")); +pub const PFB_NAMESPACE: Namespace = Namespace::const_v0([0, 0, 0, 0, 0, 0, 0, 0, 0, 4]); +pub const PARITY_SHARES_NAMESPACE: Namespace = Namespace::MAX; impl BlobReaderTrait for BlobWithSender { type Address = CelestiaAddress; @@ -111,14 +112,14 @@ impl DaSpec for CelestiaSpec { type InclusionMultiProof = Vec; - type CompletenessProof = Vec; + type CompletenessProof = NamespacedShares; type ChainParams = RollupParams; } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct RollupParams { - pub namespace: NamespaceId, + pub namespace: Namespace, } #[derive( @@ -138,6 +139,7 @@ pub struct ChainValidityCondition { pub prev_hash: [u8; 32], pub block_hash: [u8; 32], } + #[derive(Error, Debug)] pub enum ValidityConditionError { #[error("conditions for validity can only be combined if the blocks are consecutive")] @@ -182,20 +184,25 @@ impl da::DaVerifier for CelestiaVerifier { // Check the validity and completeness of the rollup row proofs, against the DAH. // Extract the data from the row proofs and build a namespace_group from it - let rollup_shares_u8 = self.verify_row_proofs(completeness_proof, &block_header.dah)?; - if rollup_shares_u8.is_empty() { + let verified_shares = self.verify_row_proofs(completeness_proof, &block_header.dah)?; + if verified_shares.is_empty() { if txs.is_empty() { return Ok(validity_condition); } return Err(ValidationError::MissingTx); } - let namespace = NamespaceGroup::from_shares_unchecked(rollup_shares_u8); // Check the e-tx proofs... // TODO(@preston-evans98): Remove this logic if Celestia adds blob.sender metadata directly into blob let mut tx_iter = txs.iter(); + let mut tx_proofs = inclusion_proof.into_iter(); let square_size = block_header.dah.row_roots.len(); - for (blob, tx_proof) in namespace.blobs().zip(inclusion_proof.into_iter()) { + for blob in verified_shares.blobs() { + // Get the etx proof for this blob + let Some(tx_proof) = tx_proofs.next() else { + return Err(ValidationError::InvalidEtxProof("not all blobs proven")); + }; + // Force the row number to be monotonically increasing let start_offset = tx_proof.proof[0].start_offset; @@ -213,7 +220,7 @@ impl da::DaVerifier for CelestiaVerifier { let root = &block_header.dah.row_roots[row_num]; sub_proof .proof - .verify_range(root, &sub_proof.shares, PFB_NAMESPACE) + .verify_range(root, &sub_proof.shares, PFB_NAMESPACE.into()) .map_err(|_| ValidationError::InvalidEtxProof("invalid sub proof"))?; tx_shares.extend( sub_proof @@ -249,8 +256,8 @@ impl da::DaVerifier for CelestiaVerifier { .map_err(|_| ValidationError::InvalidEtxProof("invalid pfb"))?; // Verify the sender and data of each blob which was sent into this namespace - for (blob_idx, nid) in pfb.namespace_ids.iter().enumerate() { - if nid != &self.rollup_namespace.0[..] { + for (blob_idx, nid) in pfb.namespaces.iter().enumerate() { + if nid != self.rollup_namespace.as_bytes() { continue; } let tx: &BlobWithSender = tx_iter.next().ok_or(ValidationError::MissingTx)?; @@ -276,14 +283,18 @@ impl da::DaVerifier for CelestiaVerifier { // Link blob commitment to e-tx commitment let expected_commitment = - recreate_commitment(square_size, blob_ref).map_err(|_| { + Commitment::from_shares(self.rollup_namespace, blob_ref.0).map_err(|_| { ValidationError::InvalidEtxProof("failed to recreate commitment") })?; - assert_eq!(&pfb.share_commitments[blob_idx][..], &expected_commitment); + assert_eq!(&pfb.share_commitments[blob_idx][..], &expected_commitment.0); } } + if tx_proofs.next().is_some() { + return Err(ValidationError::InvalidEtxProof("more proofs than blobs")); + } + Ok(validity_condition) } } @@ -291,26 +302,30 @@ impl da::DaVerifier for CelestiaVerifier { impl CelestiaVerifier { pub fn verify_row_proofs( &self, - row_proofs: Vec, + row_proofs: NamespacedShares, dah: &DataAvailabilityHeader, - ) -> Result>, ValidationError> { - let mut row_proofs = row_proofs.into_iter(); + ) -> Result { + let mut row_proofs = row_proofs.rows.into_iter(); // Check the validity and completeness of the rollup share proofs - let mut rollup_shares_u8: Vec> = Vec::new(); + let mut verified_shares = Vec::new(); for row_root in dah.row_roots.iter() { // TODO: short circuit this loop at the first row after the rollup namespace - if row_root.contains(self.rollup_namespace) { + if row_root.contains(self.rollup_namespace.into()) { let row_proof = row_proofs.next().ok_or(ValidationError::InvalidRowProof)?; row_proof .proof - .verify_complete_namespace(row_root, &row_proof.leaves, self.rollup_namespace) + .verify_complete_namespace( + row_root, + &row_proof.shares, + self.rollup_namespace.into(), + ) .expect("Proofs must be valid"); - for leaf in row_proof.leaves { - rollup_shares_u8.push(leaf) + for leaf in row_proof.shares { + verified_shares.push(leaf) } } } - Ok(rollup_shares_u8) + Ok(NamespaceGroup::from_shares(verified_shares)) } } diff --git a/adapters/celestia/src/verifier/proofs.rs b/adapters/celestia/src/verifier/proofs.rs index 4d4599710..9e09a33d7 100644 --- a/adapters/celestia/src/verifier/proofs.rs +++ b/adapters/celestia/src/verifier/proofs.rs @@ -1,42 +1,30 @@ -use borsh::{BorshDeserialize, BorshSerialize}; -use nmt_rs::{NamespaceId, NamespaceProof, NamespacedSha2Hasher}; +// use borsh::{BorshDeserialize, BorshSerialize}; +use celestia_types::nmt::NamespaceProof; +use celestia_types::NamespacedShares; use serde::{Deserialize, Serialize}; use super::CelestiaSpec; use crate::types::FilteredCelestiaBlock; -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, BorshDeserialize, BorshSerialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] // TODO:, BorshDeserialize, BorshSerialize)] pub struct EtxProof { pub proof: Vec, } -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, BorshDeserialize, BorshSerialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] // TODO:, BorshDeserialize, BorshSerialize)] pub struct EtxRangeProof { pub shares: Vec>, - pub proof: NamespaceProof, + pub proof: NamespaceProof, pub start_share_idx: usize, pub start_offset: usize, } -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, BorshDeserialize, BorshSerialize)] -pub struct RelevantRowProof { - pub leaves: Vec>, - pub proof: NamespaceProof, -} - #[derive(Debug, PartialEq, Clone)] -pub struct CompletenessProof(pub Vec); +pub struct CompletenessProof(pub NamespacedShares); impl CompletenessProof { - pub fn from_filtered_block(block: &FilteredCelestiaBlock, namespace: NamespaceId) -> Self { - let mut row_proofs = Vec::new(); - for row in block.rollup_rows.iter() { - let mut nmt = row.merklized(); - let (leaves, proof) = nmt.get_namespace_with_proof(namespace); - let row_proof = RelevantRowProof { leaves, proof }; - row_proofs.push(row_proof) - } - Self(row_proofs) + pub fn from_filtered_block(block: &FilteredCelestiaBlock) -> Self { + Self(block.rollup_rows.clone()) } } @@ -76,7 +64,7 @@ impl CorrectnessProof { current_tx_proof.proof.push(EtxRangeProof { shares, - proof, + proof: proof.into(), start_offset: next_needed_share.start_offset, start_share_idx: next_needed_share.share_range.start, }); @@ -89,7 +77,7 @@ impl CorrectnessProof { current_tx_proof.proof.push(EtxRangeProof { shares, - proof, + proof: proof.into(), start_offset: next_needed_share.start_offset, start_share_idx: next_needed_share.share_range.start, }); diff --git a/adapters/celestia/test_data/block_with_rollup_data/eds.json b/adapters/celestia/test_data/block_with_rollup_data/eds.json new file mode 100644 index 000000000..d5328b93e --- /dev/null +++ b/adapters/celestia/test_data/block_with_rollup_data/eds.json @@ -0,0 +1,69 @@ +{ + "data_square": [ + "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", + "AAAAAAAAAAAAAAAAAAAAAAAAALlkcwhxpLnnHREA62fKvWN35mmx+kFRfXbHhHCp9V3OANhFJt70AAenMM0nrZco4oTaW2sXJZD0YU6Htz6AGdTc2eEquXHIz5CwPu4Qp8ziJ0LUlQ5i7Td+dkLfulH4RcWu0CcujQuGsDIv5hsI00HkDPWkMLq+9IlBN+WlfV1sxS8ZPZLOI9wsMMg6WNKMr0P65Fmyrz+yWkWUZMJQF/+VIMksJCA6/AHrywtghYGGvPkREHEQ9eP+RuaIyijP37VvWSQeIu51teaWxCemoMnImw1EORXr3k9il/gUGz4s4Lkz0BVd13s4v2E1H047nXxDxgiO19Am1Z2xW3stV6Fi1IXyYREFF5fewK+adL8ihjFvfi1NH21N62cPET+cz0T3vH3aR8WsS0a+L4IP8xoVRuN8IYgjXLAakgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "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", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "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" + ], + "codec": "Leopard" +} diff --git a/adapters/celestia/test_data/block_with_rollup_data/etx_rows.json b/adapters/celestia/test_data/block_with_rollup_data/etx_rows.json new file mode 100644 index 000000000..c1dff1796 --- /dev/null +++ b/adapters/celestia/test_data/block_with_rollup_data/etx_rows.json @@ -0,0 +1,19 @@ +[ + { + "shares": [ + "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" + ], + "proof": { + "start": 0, + "end": 3, + "nodes": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAc292LXRlc3QAAAAAAAAAAAAAAAAAAAAAAAAAAABzb3YtdGVzdPbKzgXqabVOZYOHxnqFgTfaSGsMYPl775CAzC/gFopP", + "/////////////////////////////////////////////////////////////////////////////34GEVxg3h/XFav2Yn9hHIGc/d6ZzObX6Z1c+mcHjCsB" + ], + "leaf_hash": "", + "is_max_namespace_ignored": true + } + } +] diff --git a/adapters/celestia/test_data/block_with_rollup_data/header.json b/adapters/celestia/test_data/block_with_rollup_data/header.json new file mode 100644 index 000000000..e769a7944 --- /dev/null +++ b/adapters/celestia/test_data/block_with_rollup_data/header.json @@ -0,0 +1,90 @@ +{ + "header": { + "version": { + "block": "11", + "app": "1" + }, + "chain_id": "private", + "height": "11", + "time": "2023-09-27T16:58:08.620046105Z", + "last_block_id": { + "hash": "7BC39A59FEF49C5C75B1F800A9A8597A2BDB19AD23123AA148C03D28975A2DCF", + "parts": { + "total": 1, + "hash": "F146FF93FB7FC036E0D349C12EE618C2CC0BF174EC91FA58BCBB9E885BB5D063" + } + }, + "last_commit_hash": "392414C92529EC26E9486B54B8E56A56B30B8AD38A05244AB0B8C9DBFDB5786E", + "data_hash": "B1B291D76F10813FC674FC44B41D06CEF72C7F02C000E3089187AD4DF048FF44", + "validators_hash": "D00E6D5C9B8B8FD263FEA6FA8229C5A86BB6D8D03696AC5D7633DF9895F75F40", + "next_validators_hash": "D00E6D5C9B8B8FD263FEA6FA8229C5A86BB6D8D03696AC5D7633DF9895F75F40", + "consensus_hash": "048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F", + "app_hash": "E5950137BB67524C4A0B9FB4635F22CC552AFD0B554415C31579D2A683FD56C5", + "last_results_hash": "0B1F48181250EB119CB2376E0653517C95244D778CD0AB7BD85296417127E5AE", + "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855", + "proposer_address": "06F9CE527A1CC6EF2678D2F18DDFC06B783597AD" + }, + "commit": { + "height": 11, + "round": 0, + "block_id": { + "hash": "C839E720DA55CC6E43EC7CE00744D6151D79E84C81D7F6995F3B13B7AE532456", + "parts": { + "total": 1, + "hash": "5045BCFCFA3D7BF28F45C02E6E027EF17B1EE30B1C401DF1C8FBA2C005648811" + } + }, + "signatures": [ + { + "block_id_flag": 2, + "validator_address": "06F9CE527A1CC6EF2678D2F18DDFC06B783597AD", + "timestamp": "2023-09-27T16:58:19.63881203Z", + "signature": "NjmOPE3tLPRP+X+fAW1CUdOcunZxVvPwsOEnexZ69slIclwcigOidRg9gdhjpGJqrB0XoepZLkD1Ycu3mM9VAA==" + } + ] + }, + "validator_set": { + "validators": [ + { + "address": "06F9CE527A1CC6EF2678D2F18DDFC06B783597AD", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "u01WraTbmnwJk0b1NytVDe0JFphZNhqbfd2MIpfsF7Q=" + }, + "voting_power": "5000", + "proposer_priority": "0" + } + ], + "proposer": { + "address": "06F9CE527A1CC6EF2678D2F18DDFC06B783597AD", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "u01WraTbmnwJk0b1NytVDe0JFphZNhqbfd2MIpfsF7Q=" + }, + "voting_power": "5000", + "proposer_priority": "0" + } + }, + "dah": { + "row_roots": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAABzb3YtdGVzdODFuRX5SFkwrJgDZlNsBKTHg6oiQIy+mKqZNlE8FbVx", + "AAAAAAAAAAAAAAAAAAAAAAAAACUTM2P1SjCGoXcAAAAAAAAAAAAAAAAAAAAAAAAAuWRzCHGkuecdEU2poPhzydIqKgh0TwBWq5wC3j2lcIxdkiVLqoevNjwi", + "AAAAAAAAAAAAAAAAAAAAAAAAALlkcwhxpLnnHRH//////////////////////////////////////vJ9dv7Uz1bj3ur7mpnO3E2SBLKkffloglJj/0H3oK7U", + "//////////////////////////////////////7//////////////////////////////////////uLSam+eudl+PFq2saaqVHCQkAeVAjSjiuRc4PslqTaj", + "//////////////////////////////////////////////////////////////////////////////SBbMrJ3ZKjBvbYkMxURJTk0VmWyAh4Q6yaAdKTIzyP", + "/////////////////////////////////////////////////////////////////////////////x5DQsKFQmQWDS0DtQn/RsqRlLVVr+A2in6j+CLouflX", + "/////////////////////////////////////////////////////////////////////////////xX8O1QVOeyj3MpKpUOLVAiXCZyA9ePfoO5FstiPESfZ", + "/////////////////////////////////////////////////////////////////////////////zNwkSWhAnXxEqrgbNi9qw0IJDlMnakzcLE20dW7ohRo" + ], + "column_roots": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT//////////////////////////////////////s2/cZvtE/zeAzO4bs8jv5W2OskQYY5uLAdrdEZVOktj", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT//////////////////////////////////////oJXkXWtRaD2XRqi0184Vlsd1OQc1IeQaJF9Z9bf+x0W", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT//////////////////////////////////////g8+fkXWz1VvozT2tNvoqIw9caloxkDAqRJBbnjZg6i4", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAc292LXRlc3T//////////////////////////////////////pulXvW/TCqO9S7SjmD7Gzv4mOgWPAC0QvI7uCRM8xqu", + "/////////////////////////////////////////////////////////////////////////////2oIH0D8MW33fIqQTIDGMcqw5QRlZh+BRxOZ5Tspf9Lo", + "/////////////////////////////////////////////////////////////////////////////2GHintd7+WjGUDgkr6WLftpVYDDTrLF1HlmIHhPN+Ci", + "/////////////////////////////////////////////////////////////////////////////8bNdAw0NmSlGbnFvWk4pwhBI6hxFsDIkzU2cEMTQiGZ", + "/////////////////////////////////////////////////////////////////////////////792SWBgoS1tEDIzu23t3z0KWOjQ3EJriRL5ILIH4wKy" + ] + } +} diff --git a/adapters/celestia/test_data/block_with_rollup_data/rollup_rows.json b/adapters/celestia/test_data/block_with_rollup_data/rollup_rows.json new file mode 100644 index 000000000..3e9e8c27b --- /dev/null +++ b/adapters/celestia/test_data/block_with_rollup_data/rollup_rows.json @@ -0,0 +1,18 @@ +[ + { + "shares": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAc292LXRlc3QBAAAA/AEAAAD0AAAA7kkIPARqpfS7VPCI8ISXp3+yE5juMYVGTjPumbIaH/HlvtOy96FMy6R8i1FmHXXywofV/UfxkMb5iYWe/2juD/itJDeieeHIkywHNYyR3E/jSGSpjGwl8pjioBmcFQn/iAAAAAAACwAAAAAAAAAOAAAAc292LXRlc3QtdG9rZW7oAwAAAAAAAKMgGVT3CtYiMNw9hApb92dwLASGnoWrPu4LlihXunWYAgAAAP6mrFuHURIPti//Z7VNLqxmrvMHx93h05TeoeCeQ91EoyAZVPcK1iIw3D2EClv3Z3AsBIaehas+7guWKFe6dZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" + ], + "proof": { + "start": 3, + "end": 4, + "nodes": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNr0OaVlRhcnQ7QibuMWIApgFx1vLeoFCjVZ1VBoaCw7", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA1Bip57svJ/YAJbqu2eATzaSBu0IxogcH0uczSggxXb", + "/////////////////////////////////////////////////////////////////////////////34GEVxg3h/XFav2Yn9hHIGc/d6ZzObX6Z1c+mcHjCsB" + ], + "leaf_hash": "", + "is_max_namespace_ignored": true + } + } +] diff --git a/adapters/celestia/test_data/block_without_rollup_data/eds.json b/adapters/celestia/test_data/block_without_rollup_data/eds.json new file mode 100644 index 000000000..70e17cac3 --- /dev/null +++ b/adapters/celestia/test_data/block_without_rollup_data/eds.json @@ -0,0 +1,69 @@ +{ + "data_square": [ + "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", + "AAAAAAAAAAAAAAAAAAAAAAAAAPxtQ2jlIaiqMi4AqSBwxi0FaQBRPj2VG/AkmFuGHLPplSrH1F42EID/cBEoiHrbkkZIYxwVRdlpWmudiUYTUHJ7A/zrbllXZQT7okM8/CYaHyNANl0pD7ZOf6wOiq2zauGaLGNHJKcPGpwaFIkHGlslDzk2zDyYa8SsA220qi+4gvuFN5Q5IxBfE3k7WK2Wdn9XGdom/j5du4rvjdOuE31fFF8M1bkUlJ8opPrrz1rFnr92Wll/8EoEWnuy2APdVxBLr9Fj4ZP4507Q2YvBBc7AgPtTCgZvVvy6b47vrDq0S2bDl6qUpCWRUvaj+EwE1b7M8N7gHsl9nbEeTE45VrXj4qgSVPDgv8ay0koEW6Knubr0x2tFcnHI8Vj0cF20kVaKjGO0j81Y/uyFseNjCVWxTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "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", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "//////////////////////////////////////4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "YWFhYWFhYWFhYWFhYWFhYWFhYRbfmd70IAUBxCQPak9WI0wBsV+uraCv43hjyBaF7oDDkwCTfVg3emIxC6QKZBFlUnuopn6nPXUuBPpUOr6rWMqKlXXJ/V1e8ZLmKbQuPQmqdNiyPZXfjBpzHf+evuoI+w2D1/6y0P5JYEKvbmKcppLejOF7CazFtdRrCr6HYEiKLXIopMitRe7wrk3vKzPoed5BNDYwd/ZEOXGMZJlBKP1m6/UFCi23bYysk5WStnE9FkDUxkImADEQF1tdcgj4G/D4u27+1VAy3mZtcLFKlEaUce9bT54wlPzAOHhd8uOStykAkWKebPXWWNAILuzOS+kOuk2gkfKX8c7fH+cA1ixgsVg7UxOoXtGONPMCx26yVYxz3LRqwxaVpR/91JoIHeFZKGGde4xsZmjV1vMKXupj9VrNm7GPssN0UE7ViAOv8fh87GcABlkW1l9uC+3e+FRayfF/+dDNSDBXxYxR473YeACnqNENCNYBEBkbybwFAmkFAiMNAqcNAltVSU1HTZ2US0xYREdPRFiRglgRnUjOTJ8eT5AfR09EndGfAlVJTUdNnZRLTIJGnZRDn5xKRUxGl0CZmYeIR5VIQ0pDjkKGQEaKiJBJlZ+dSYuDStHfAAAAAAAAAAAAAAAAAAAAAAAAAHcyR8mRPE93i6A=", + "HBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBEMAAAAANYFoAheW5yl0F3slgwAvTBqMUpCmvakQNtbVNzBr/JM61PDHeFFHw0A0UUCzgIeAtpVSU+dSk+dWEmQn5WUT1idTUmVioOLToJYzplEFU2f0VMCVgiuKOCqTbrQyATFcjCpAmouUrszdiopkHk/ztkBXaIaMNEBAgUHDdMM0dECBgIBmZRLTNEBhoWIj9T2NwHWGhAUJpjipzVzuI0XqjEn42okEdGXS6kffXchXEE29nZ0Fz6nzmvMFCD9V6A6vM/pIB2k2/0aKHTMdJeeyE+LJFHRDQXWARAZG8kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "HBwcHBwcHBwcHBwcHBwcHBwcHGsuW9WNIFNrl7ABAAANoIGNXVGJUls2VeCBBwy0mkhKP5zspSr3LeW65B0tdxpaetUVJTr7NDt6lkgFYw/K9YQ/cJBGqhVAYAkzopKC0yfCqXbKfOvahafPEfEocJBQxcRUsMbZ9TQ1zQlhlRIu+q43zC106mX4AwEJGEd/cMmR5GyJeI8pFsVkN92Grv/XDbVB9bd+h2kv+//+qLG3hWZjOo7mpvmsTzIiLWAW8wIHHvjopWT6W5Og8c4aPCXnj+1j8dGWq14jB/T7gOQtc/jHFuSPTjLmRUovjgeqrG5MLjfIWj9fpZcUqUyh83XDglrp54LiJS+a437SD5FBTc2OM7QOG/St+XWOHUL7MTFifQsfZcyV9fbI/RaDrlmm0Y8bXXp7XqbffDaErgA7sbDVBcZBfvSJkOA6iJrJzR26Lqzv2reL+8sLeLG5r3UgNlWoHXxiwzgQuktttpc+pu9hO+m2PcRCjqIEKKH3Eoez2u+jykOsCegSsFCGfuVNJXTTBeyX86/aAXrkKCgaziKlqqyVAup8z7NSbKb3yyp4EocK2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "HBwcHBwcHBwcHBwcHBwcHBwcHPdWDlopSjg9lkgBAAAIDGiLprjNI3rJgeJWr/CbVO+h6zuoDvEHNukRfbxnf3No0g9eTBAirvC4ODPM9YIdQpMdjKTAzh//dtG06V1RUiXrOsSs9McZ5ZG8PAZeyrno7Wb9UFQuAfY7Nd5nH6Wto1uqTuexZz0AFePSzVUj3Tjvr0ERPJ2qgBbo8kDdtWpQADeWt/srG3WnGkyD7AuppASVAO7NyaMz8gCUzLL1am42t5zrOquP4lzE7Nt5PHZxu5vwm5yHK0KJOuIDjK/oiIP1mIifHF57r1gcwWsHDaaADexiU7UAoPbBrehBXWAwlfRHesDk4cGKIwFZc2RYyAX2KgZX6gQ/s+hl5VqWYNMNl3P9CYnVoNEw4tx9l83O/7OjhICCkwMqHHzuD3z7YJ0dw47b3UtBnGwC6iJsEUqqOfCZxG4T5NrkFhljdG80bcAUdZ4iIYCrecqRG+NiUn7t9cci2VF5oIUNobfLN6ix71Z1JHTvbAskNjqFjs6lxVFVnd0B4hlP5IFjmNsrJBm4LnvMv7VKHLaB9slh2DJ0UXBknph4ZbwSsj1M6jQGnb1fnUUKG055/0YKXjE/a6oGMb4bjW18ui/xLGJQPg8uvPxFaC82vjO+GnOREyUurdrOdtacQWIy66dPzMI=", + "goKCgoKCgoKCgoKCgoKCgoKCgn55JktqDOWVeSQBQxTBAzTQTIeSopsNKc+iEIxBdcu9tL9hBiDWyz/jiIqTmAVZXXyrcOIfrLfScq3zFL8diBSFvvhGdRmP9/ynC/DkaSRnV9TAXTT/13Xs2hl1jclqWddHr02VxlxqnT+OIEgF97IeSIhTGNb+NzugTJqHmQ6XdJawQRtY5+w+BawDEQ0gmzoSW/oqZN9gDfwq/3Ez3fm7rVFeJBVXpqRo3rmvJryk20exsIrsUipUf3ktmCLQEuPz9s/rwmPUPfIJXqe9yLwguxXiaUP3g4PoetNcbGUZffTyIxXzqn3ewn8ohBJKWwX7Z7Jlpx7NkcCpyZI6UhiGdShqvOQV0NFk8NfvnZnjsmB2rPjO6EqF1c9vM/pkd4jNdqpFKypJfyTh7PAtqQsr3MYWobmRCmfolsN0oMVxTOjG8yEH9yURjr8pThobHJUMyJZ6WIpq52EIFJ85j2Bvsbs18BjKK6AKo6zcutvNPiZAtpORj6RCgcMc96Ny5eC0xzfv6dOZ3yakb6OcGUAbs+HKNgkLytQ86dkY62GoQJ2Yj3cHmVWMg89vYcUQwj34cWqtOQNkQ9YW/Xl/8qJ0eznlNi0FgFL75vOTfL5BKFZwj/BgJ24nlhDXm/v5vKsxHjRXZOzGQ6PnSRE=", + "TExMTExMTExMTExMTExMTExMTIZ58CQtu0ks/W0Du/UU9xnXHhunjohoXNWiINIv2Fq/qb1DTjDYx0Hyp66LKzlWzDD0m7rvTAG2HWFYfx83mg84VsZCkCz9lya035jNffZ+hXBN8jJb8wxIaoZNDrvPcOn/sC3IORbB6/VItX8B95kqwan9GW8Mr+gWeAZ4NgNzFiRphg7G8RRzMzMipFJTUWCivRFhsepZNKuX91Bu2PqqKW1foet10cAkgta/48+Gq8EnwpwufTvLqER9hk+RowJTKrAXLmeimzYIQToKslHzvxhWjSYZtP78N+wHoV9bIWiZTDqaVkM1Iqxge5aflU8Q4vkpvMGAfMP+S1wfB3PBLDPOCbutrq9+umV3qCEHLoH8vyme2UCJsYuTr2TwdT/bOzxOlp3REHv9h9RQIJOhNrVSKQy9cwoz2+MXoE4X+f+0e43x1NlvmoyCFpuyALoS5kwdh8sYcpy2QHltTe4/D4uN92vQHhMGR7P4OZ3DKRwX/pAwGqFdWITCfnvWSL8J3sjKJ/GLfJoW8BK5Ob+Hi9t3HeYvfD2If8OIwZlBCRXgTeRT7s1CLLEqQLH12RSb6CLOcvKJxhH1kYmNOaAjjxWWtt9aJwL9OzpCijj74DbQHsJ37HHssqcusMfJXPZMoaSEKsyzJ6yDYS4=", + "s7Ozs7Ozs7Ozs7Ozs7Ozs7OzsxkhccWR8P15vl8DEtVp6LBX8S8eMxq0x+m588mtEXSzXnYIXBgsIRSJgqfZYWkfAfasbQqAAFbUr/G5cMBBcF4W4RhXuyTax2tapo9/pPl5V8wz147nBR2p/AkdN9yKbD8s+Uuo7Q1DqswEb6ovyHWmBs9FbZHGG5Pa0Pkrhbmsfq7MCFZkJgjlqTDPz4AgoasPxCLbQIPkNfoc4XIUvH4xkE95CJ+nxXrRi6ceBnsuInauWV3eLXPY2CQbaXE2EtEZWQoJr9Myz5+vHgB2tib9SwJoje2GriHMwMqYIdZdRzZ1/h1FU31iu0nbM6WHYz7MhH/0476uTdRT45wJOq0dIZViL1PUDPddMTAicaKvO8AEtqiGxGTnI1wdHDz8fnrUK6KdrrviZssR1Wv3LrNH6SJhi/kfjsokjDstEizFzGRY4VeTeD0ihXpVf6kODnWhy2SsG1Lxdb7oV61fvYYhUu3h54lPFPwJgxaOM/V/KzV/LIi5tm+eUQYzYj6qVKyLENvDrhOUTdihBwktC2PptVjJX5fTU6k3HAhxVpsaGv5pVe2Jbhs9pooutI/YFFnM6yUhwWPEodrZxHx3L7qYeVZxsZuKrW5eliWJe/+2hXfzv0iqgauB6FnJ5E5GZTPSWJSwIP+L7rZfSow=", + "AAAAAAAAAAAAAAAAAAAAAAAAAHead+eaESOL49sCgHvvk+5SSQ2fmBQkVdThNXFpIfLzNZm/WH1BDN9Za1pAEd8LgUjTVOdLWFNcu/mNeVEJj0JWKSiBjQnUGLK4jwk/Q3h+L0v/R7LUg8pVsgeJpSAAR/28h08eHpsFCSm71kzxRQl4g697umc6Vlz1q7AwKdS9J+G/H0jV4cjT+axWm6g+Ga8ozSe+Mo0QUurYRqTgh+Nm3/ZCzo5PxZX0HQJoRiQnDr7LYxfY8DUseCBUWQYvesCmQ2i92PAQngvGKsd0HzlhkJEzr4ffz8bnjnatd4jKqwllBN87x8eTHCd7TNhv8TOHJjserX1kkWZQAkA1PCJC0GSkOO9WZsUit2nV0paWGNUfFYj8Y1+G/c3ibawITxAjl6/ypSXjD7ayycBAKOxmMENyO0J0Seiz8+0+RvMcn9cgm0X9QomlKb5K999tsZtZRK3033v1a/L9a7MGaCQlWvNqrL5jB74N/gaNXCB2C9/7iJ9WRC66DHC7UoChVEsk2lkoNcBcT8cFqhMoXO+mRSozhrfecQoUjazobS62XcYyTHLuML2nJl1k4FNx14G2eGjRCFvYnM54tff5AVBP/IKTNJTgJY40LgWL+af98esWRlWL9If01p2h3FdYKLRhkaXNaHRdXVEDJdE=", + "YWFhYWFhYWFhYWFhYWFhYWFhYYorcydUN0VA6zQMKVuR5VAMS0T6iIJ43+s8pce43Pl86O7XB3HSiMlQ02DsxS7/8bFbuItgCg8UNfTwhK5md8lwV+1+9Xh38Vi+l6EmVeNigwqo3mAHpKG6LHlWIola8WEaDv6lDXO7dQlmdMJbY2UApDZhiYmrTmMlCEr2IVXwfeJ0hq2FU9S3Ymc/XGnM8T6BNrB35ceKxTHBxnVIxlbt2bMMLD6UbxEnpJ4xvRIYQOo5KI6+wgf3wpoYBw6hwS0TxPP+jv1UikDwCyAwXz3YPrt6tVfqakFA4D0rdzQMqRqA4CfsJmxXeSD9q+sVkSOL9pmj+QOHMkJMaOZN3jm8XLQ7fTWpE2n0txoPLSfAF/PhbUFEzCnWCsZPPmhXT01Uf6EEPi7sFLrwtuJ/QEqKFEAVVDehPhIoTLXhownOhYAidd8ADUnz6ETaA3rigEdAHoUrj+UVuJFOH6hDfTbvKQDEzOoOCugP/vv9HjkEBtgEBmYOBsQOBk9It7ywvFlcsbNGubC6uUZYr0bxWbgcs1/5ulf2sLq5WepfBki3vLC8WVyxs6+/WVy7X1a+trO/VbJSUqujsFO4u767rrSksr+lo1e3U19Zt6qgvurtAAAAAAAAAAAAAAAAAAAAAAAAACGXsB5YkLohqsY=", + "goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoIPAAAAAOgExgpLT1bC5UJ1WgEANpHRnr60W4fNsuZPR+QUzoyzd0US8Hu29g4A6rYGHAb5BulIt7pZvrpZRrdXX1NcukZZvLdTpaCqta9GHFK5+rxf6kUGQQrBZXTKvDTlEQsfJZHDBtFoSjuYLmNqVyaZHOAPQsDykeoPBgQCDuwB6uoGDQYPUlyxs+oPpK2joe6Hkw/o8v71Yl1yxJUqMqf8yp5tfdFk8epVscP2LSFgTb2chy4o/JbEHN4a9W+ETsadORNxb/DN5oTyZSgaKFVQEbqqZEPqDgToD/77/R4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "goKCgoKCgoKCgoKCgoKCgoKCgqMVMpzaEjijKEsBAAAOxqanQkOsSk+cSHSmAgEzW7i+mVZ1wmOIYXA0f/BhIfJAL+H6a52JmpIvWrgE1AgXjqKZI1e/yvqy3QWYwFGv7G0dwy4XInfprcQT8YVlI1dMHxBHOBbgjpqVFQXSU/hohsGTGmEoeNmACQ8F9LArIx5Yf9ysKaFq8x/Wk+ukwYLnDjy9jjokq9hniYKNzDc6rdDUna55y4/HupdpYd3zgwYC+YB+wtaGT17GhRzykGt2oXrUhepaxUtmAoGJqX9hKoAZ83+htZd5tr5nrgLKx9qzaJMRQJlEwlX1w7PJgycSr0Bxdq9ya2dbfSTjCFi9vBWumDMH/YHIjyeu8LSJnp7bLQP22RpTjocRhPOgwUnL6qH9Qi8gS8vtIpyiwQCSNzjhBBa9JIGsV3Sdo1seFfA0aMd86TqqiRgDKTc9zidvnEjM8CLbEpv+NLHTNVWWy3zSknE1nxC0rsALZcmI+Ksx6XzPF7vHBX74OEykJHC8ayjsBHVVg87pDy9/ZWXyHGnCysdTBngiEzFK3MuIGGMp+KsM7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "goKCgoKCgoKCgoKCgoKCgoKCgvU8ej0Xw+biJ8sBAAAKAdeqyzIVZi8epnJBzopUR3zJd5LMB4UCnHHxLTnfKyrX4whLs/5pwYoym5gajq/wtF7wqM0bHPaCLuozcUJDSmt3nRDHgRn7cFg5kA1LFz1+etCETEdoD4eSleLf9sLIz0/KtXY3358A+n3jFUhm65t8zr3xkFnKqfN+jLLrPNFMAJNaOols/SfE8rOgdQPDzQtTAHMVHs+YjABcGj6O0dqcOlZ3ncWhck0QdeYmkC4sO1SKVFarbLSsnXIJqM5+o6COXaNf/0sgzkb/FN4CDsupDnXbRTwAxocUyH69Qt2RU4GwLxt/exSlZg9JKtZGEQSHYw1OeAuZMX7ZcEBa3ewOVSqEBazhxuqRcuQtVRUcgjHPoqmvXglj/yJzCCKJ3VnwEq7m67G9VtwGeGnc8b7KlIpSENr3f+l/8/vUKNWa0xv1J1BpYKnFJhdY/X3bSiR6jhlp4EMmxq0OyToYk8w3fEEnZCh83ANknJ2trhzCH0NIWesPcvu6f6bUXeZsZPsyaCAaMDy+/zWmhx7S75coQyPWUF0p2Tn4Pp+zeJoNWTZEWbYM/bUmgr8MS56Z3soNnj/9p9MiNGeFbttMlghoOYu212ecP5g/8ipY92toyOkcLuhWvduXd8S6Gh0=", + "s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs1ij1zyIK4SkJ0QDUcGieavtIKvR2k/9THT+CCZlCtZ0wAqgVOn/MkgcFY1ngbwWuoNgvl/UZ2ZwqVh9K5HbIUAXPuD+v3YoHIGv5SNmuFn7YtuzVR254eHZWRkjeP4f26hF/SHwKKPXfWWKT2YPrLDFvrJSivF7A+EkssJuuTWX+jHhqAxXQ18SL34bfu6d6y1xattetfdazVQoVn55wDy/6MdMPzpuOjDuDVSPHbW8GXmItCjFLcVNp5ytA2izcVcnZELqUi6E2SBWFxlNGUQW6pHx1rISK8C/tTkGPsk+iRT0lhFyJREbnEWByFe0FM/3uGmU6o+mptbtsf2MwTPoaY34sRi3LJoa2kF217ST/hxDtRC8ywrZhJy4LgET2CjK+Fdzux84SC6iuMb8zImhShbzyT1YDN9+WhIoxh8ss34Wg2ACiGvxrjBqtfL9/1MBEVovRqXRdtIK9V+Uod3VNzuVivQXbMYMz8fkNOYVlmKyNV5Yoc20phL/iM8lcHQzGZN8cexS7WLN1c9W+7L9MXsXnAUDF+6QceD0d9LMslldoSECUkiooBPV0h/+HZ+ALNHIlAnWu+jzhCYrjMAoIJRwnGEEqUqJeYNeIj+9ZUEjoYrdbdptWv7nVImPOcWe+ZpO1nUWu892t/E=", + "HBwcHBwcHBwcHBwcHBwcHBwcHNbb5pN4CGa22+UBQxTAq2Xtp/1tXF5ULz5W6E2IjlyEQKue/DUTelde8aQ+iKYFmlhDDVUVdUJrWIXLyT//9DSvTssJCskoCW7tlJ7u8BhAw7ZwcDzdjhd/6da36k8PcssMoDjeAoAZEwXcU8kM7PzzGTJ43y6GmVSBJl826543ELo4XoLnEJaI9KWRbD7Jc+VsXbNN44riiCjkZgahg7doBXFGhmxIb5/w0zCNVruIRwpdtfFQ8lkUZI0377UZY2WIHnul0lkR61tP8HYsNG6l2irhoGegmVCfyJSzu7pQrYR7OerePSsazx2i8ZRTHKLarcHWUTqYrwflf4oHqDOn2+Z2puR03+0+eBItYhlxc7JYFT2W3IGE7guN+32VqDMLesmqvXtLKp5kvl0VZ/vcXTxKagE2KgyY5n38xrX8j4IzIKeF7uDVW6iv81Q+ADT4ebPwqxj0JVY1sibTvHOZCKqniN7l+fcNsDGAlFkSav/8jVeR8slCRqIdJCDouDAF4hEXbYWqIlvzivg9lDCrquYh8HlnIp+jKxKjFFK9Bfp0vH9FcxW0bjdjsjeO4PVUfmkcJYysFvGOWKynlMZmofpaNe1AbQaEkp20pZuJdJzl+R0hdSx1PsRoOBkeTYezyc2iYxoxbceg0mg=", + "AAAAAAAAAAAAAAAAAAAAAAAAAIv3NI9/MIsh0fECw28r67pJIWeBTinWRjmxamV5oUkurqOaiYizOU7gXJhlYig25anodFz3I4lKsCnTljXpXrAGdrVZkBebtNwO9oj1jAt8E5m8Ot/2AJbmfDnxK93EdY2PCBbn9jS/kPFRjn9oS1xCCcprRYb/UcPV6CkCm7egl4+m0qEP4VMJl2zCZZCHMDJ6R6xi+3YO/z7qzO7BbdvnDMMvyz2f/8lvnY/ull7wikY4NzEVKQ3tkZGZFSFWirPZeM+i2gPUDXoIMb20MvwbCkinpHAKtiF1ta1IXDwskjy1YMZWcqQ8TvXe2++pFfuM6uyQJa4+UocdUHPc6qPseW2KGA3/aR0mULZrV/308HRBpWCH6yDiKzu6DOHlw1hW3mc3fqgEmQBNiMIvZkvZUWnSqo/2rhdkqJJh+G4fGtZGe05eKZ9prS9IK8MHByfJGNbH/UqFJz9+TshENqRgSnp7dqy69YsFoPOumI4rbJUrbqM9NdVQQw2Y25bKR8eq/uYSwfdcvO/JAgVhA9RxPEYeRFXsRcOT/wosQVTy8o3YSHqs2v2fy6VoM6Hv9Ukad2tgFNQQyengECIhZzRdJkEsN1SlyNpLWmusIII1rSGDMLjKpsWmfkkef7W/2ZjjRlw4b4KqczVEvqg=", + "TExMTExMTExMTExMTExMTExMTFsPvCSUd3CwS2YD+OHcG71Mog41I4xH8dy3uUNL028EtpZ+uETKtn94fvx6akj+j28zV8UAlrRYX5aNtpS1wBjvbVMtuGaF5TMO/tTrjemW03dUx1Ato/KWnVWkVTPjogoZbqolNQ0Ht0uJUiOPBGruo7pXdK2xWATZwiB4PCzb80ekipCVvaaOP2U5PJCyWm0OoJv/rdmQoO9pIjkvG9KyV+Ww6UgAN3VJrjFc+AAvKti5sJ9MuEZjTcGvswqbRKwT6y8mYajF393lkoVn8NiWxWT+y6r5cyCXurROdtD+HROaJLu6R95wkl50iD3YcHTrUGl8d2t5cj/z1Gzh8Is2bIx2907EN1qBxQvsjAUDEgDJtLpbeO/pvX1Nc6njlJ7xw95lUyAVMrSq8ZmiZxI/RLslkrQot34xg3qWv4P/X+dvVLaEtKzCaj++iO3TN1RJuciB7SCO3oyE3jEN12RrQIPRxz/UAj8OjQ2nTW8uA+2Jo19BuWg0ASM7SqnJR7Fk6UlllRtNuhkEyvdlTXzLtmOYpDriLAz1p8d+02g1QhaXsyVzkTbEYkLWdEUs56Y1KdfqCk/vVhwpPIiPD0y6i69emlx0a66aaASqj8SEhXfzv0iqgauB6FnJ5E5GZTPSWMIV1yhCQkMJa+o=", + "np6enp6enp6enp6enp6enp6ensgf5hFYYiwj+WkIu/Ua0P8OhsAbaGebk1Ch0eRhlSgEEu4ttP7HMFZM34/iUwZrcAuzVDmOEbEkP514lGWP+L6vpFMIl//xlKD6rGQWTuyJP1RkxZNScoUNAxip6cpXmmTKVp1pXhAc6aKF7F2nj51XcnnbhmvaiTq1BoEsvfAvTFdNadll853Qg8p0ZHaMSGkrIqdpWKko1IUXUIHi/zR4mNwEIg9Q9sfFXm3Je6YDY0JgWCWDwhvd4xSfsgPL50p5B2ud1X9J3dVpve2WrpwpivD0G6j0myE584asE3j0bSGAGbgTvQMN9nPwm6FoNWGPNzRGAGd3Vz8ZRKBNhAogkTsp/h5BlTgho3wMX78MnSVWOYTWtAol5+otZ51aYALZRj/6hPh3gSur7IRxxgkXe8xpo/p28mqUzhm6fwgt4OqTP0gABMTQssBCDzK16s/MaOCb57ZpHY/Hbn7DMfyxkgAqJLsLB7IN1N7baPEMBUsMBVMLBSoLBcHCEBETEaetFRzJGxMUG8mhfcnZpx1hHKLXFKzaExQbp7uiBcIQERMRp60VHH0ep60SoqoYFhwepRqmpnF/E6AdEhgSex98Gh56f6wQoKKnEHdwGLu4AAAAAAAAAAAAAAAAAAAAAAAAAJyKE2ihiRScdyM=", + "zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzskKAAAAALIMIwfNwaovtsU/qAYA/I9DghgfrukiGrnBz7BvLegcNsZq3zQW2gsAuxYFYQXXBbTCEBSnGBSnyRCsoqCtFMmnERCgenB3GX3JYaYb2BGiu8YFygcgXDkhEfW2ZQFukI8pBUNYy/iHkVlRrJ+BYbwNxSbWj7sNBQwJC74Gu7sFBAUNpq0VHLsNfHR/drfphg2y1tTVX6s8KoOd8HPdIYJSMUNa2bulFSnanpxWyBeL6ZGU3YwqYU5k1VvmxyON8WwzW98iuebWXJRklKWvZRR3WsO7CwyyDdTe22gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "zs7Ozs7Ozs7Ozs7Ozs7Ozs7OzlJE3aZvR9pSuecBAAALI3VzxcNyy8GLwjl1CQb2rh0Ygao/L1nkUDX1ON9QnNbMl7rYV43ijoCXqB0MSQ5g4XmBlaweIdgaQQqHJql9vlJnKZFgkza0dCps2eBclazObmPP92a84Y6DaQpMoNFY7yCGZFCUO03qCA0K0xOblWihOEdyknZR0G5Ahr18IOO/C/sX4f6WcUtV4uPuJPr+dEVJjXs9J+clFIpeUEHQ5QUJ1+o+L0DvwaQj4GHWiVcwdjJJ4LuoLM1TCezieDhQnepr0Dh2GYo9FhhVewkhJUIcWIZlzIHAL6XVKRwu5ZlqfcwzMH08V1WuMZazDqEXEWl7h/YD2+wo55l73x/igoJEng/aTWSg4ell5tBwIMQnu3bbxZeazSe4k4t5IACA+ve6DGYXluxyrDmNf65oad/1WCU3tP534m0Pkvr9LZlbi8Ik35NEaojU9RVK86WMJzdMgDPzhGMfeyYBXC7k0XH/tDcrYBIlCj7R9858ljURV5S+DD+l5S20DZc4XFzWYV4vISWgBTuTbP/LRyfkbVmS0XECsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "zs7Ozs7Ozs7Ozs7Ozs7Ozs7OzvjWH9BNBJSYtA0BAAAHBkZ3J/BpU5dodTzKLe2jzzcuNoAkA+AJizPZnvFIm51Gsw7NHNReIO3wiIdk4X3fH6TffiJiYdrjkbv2M8XDy1c2jWMl7GveNaHxiQTNYP0+MkXmzs9YDemAg7VI2i8oK8EhGTD6SIQA2DGzacJTvYg3LRfZiacheNA+6Bq9+0POAIao/uJU25kq1hxwPw8pIgGgADppaCuH6ACtZPLhQ0KL/qo2jSx2PMhjP7mfiZGY+KPto6pxVB9yjTwIfi0+f3Dhq3+i0s2aLcnSb04JCyd4Cz9ExvsAI+lvKD4XxUGPoOwTl2I4NG96Uw3EnUDJZQzpWQTHOwGB/z5NNcyoQb4LpZ3mCnK6I7uPPLCepWlh4/8reXh9pAhZ0pM6DpPiQaffanu5vRUXqkcFO15H2Rghhe2mY0LcOLQ40N5JlE+OSmLVma9eVngsn2Ch2zFEy5Yy4WtevMOfI3QLLv5thiT6N8qZWpQ3Rw9ai410e2EvbsPCp70NPN4UOHVJq7lUWt7wWJpk+fsY0vN16WhMsYqUw5VAr6uSTfHR8oQcO44Ep/zApxYC2xmf4x4CzYKBTiEEgvTbc0qT9VXgXUTOjA5Y8esWRlWL9If01p2h3FdYKLRhkbKqF0SKNioUZGc=", + "AAAAAAAAAAAAAAAAAAAAAAAAAIt7i/l7TaA2/xkD+OHZeL++j3EpPLj4dwsYIvDPtKO+BcM+Xd2lR1BQyVKdd7SbPTKJCBH4haIgHLgbC1j0/WDO9YpfAVP/cOFB6UQhK2ds64LK0gnYuV+TBDydrIiNVvDmHowDWCZFg31fe8MHwHzrG27RrasYFvPBHTe0TTFnRsMuAirYBRUIJ5waVuupHD1Y5LJkI6LGyDQSN8pmllR8CEfKARjn1t9/WpRsIH1TRtpFe/ePrP/FFyWc9V/gWBtBCj2rKLPdwkRZkfeHbYwiKbO/RRt++xD/DWuDpV0bOnmQozMUzqJM5vW4E34SmsecL6UABKHaX68HxwWcQBQw17RqeV+Vf8uMvRk9KUDfMoD8V3rBi6wA3+MiMWiFZfS2R7zTgyWf+BDt8qHNJoWZHmbQLv2hAkg+qGqUI26YHD5m5VYJ5FfZe/lRGdbb0qAGZaiXyXpDMEwH1aKFdkFP+viD7dNgVCMCKyWw9blpjF8a86ShdiIfdWrS5CuQNTn2a4Y3M76muF8iTyuq3hrb/zRgiwoPYLeJM7zTNkwkGqerdpwJpsJ+cGxPTG7UZ4TqmEMohQhAErLQ5p+b6CaUmoU1i1AMeMviPeWkk/QXXMqVdu1BUkJSqNS/o+Ln8SyC147HQD9mEiswENk=", + "0tLS0tLS0tLS0tLS0tLS0tLS0m8D4MwoqqDk2B8CgHvgx0C1iduDiYLFqmWw3B260NBNqmE3UCtNCP06H0XjsLeO5EYu+pRe2kCtdxtEeRPqATK8xbui8fpK+VMowWiSQ3byGgDdFCFT6BDaew4a7oxwxIltbwmqE6NiUmp5lHkOgAjJYtga+rSBehSinVaN/J+AM4SrhoaXdbY/67qmg79K83mKl5vTLslvnMEUCoQ53d6DPujCYS32PubOAWpEGsRQrnFizw1gQUthjC+ENxvgh2YLJLSE4s73HExCWmYi+O7DEw1qdFqFXDP/3d64XD7emxWPlvortoIM+P8+S2au7wzw46ntmUFJHn+G2w8ro4Tc6PkLqSeUPg6MuYaQii96Q2E43AZpgClaI9Z3GOvyFitUaNAGT4UaACQGZASXUwE7SvvLUQb8nQKHuTHdIxnd5+P2mnPgt7xPrn590KPyAPXRPRzfcW3TkKrzGp9KETqBDndz5E6219wEE//qhadqUdLd7qyP1i7FyXlnlpqyHfkKtWVgUuB3k67Q7dH9hflxd7mc3z1Vk4R/m2p/b6YXCtg5ETjGOmkfXfpZGvrhvNWjPl5hkOhyZtnhoXJzhSNTdtio87jMUgXmgI0feojiOYu212ecP5g/8ipY92toyOkcLiJ5WWT/UiVwTFg=", + "r6+vr6+vr6+vr6+vr6+vr6+vr8+g4Z/nNoj5exYB6jS4q3XARFWvUQ0TNHtxDBOZifXgKByXDK+AD24+jnY5/Lsa58cK7VImIwITU0wTIExD6DYlOZLQUynGxkyCGl9FY2PFmuejYgqwCLkMHDbePokb7pW8YLIPvjEWe49bFJRaP+KuALXL3H+PdzmIu0E6QndCJW7Y3yqZ3F5MfXK9GkGz19t8NJs9U6ZJ6VfHg1vhpWn7922WxsBxjnE+QGHAn+TAvfnZurZCGLqzz6+/hpVBo+L89cGtOVHJcofrH70L9MF5rks2cDjSVxcLzNq+amarMSsLA+n28RejjVKBxAJziOHyMVz9aWXf/96eHI/T+kPDT54VKo6mbnGhTKhc4xsX4g1LY4hfmLakHr6VIfiFceAP5oHJn2tKDHVl01JDVoV6E15Md+fae2BafoBQ0V1uZEDJNMekkoRedJfCmykDA5kubUAl28vgmfQ+xyjA/HxWyzI0MHIU1esKcNB7h+GbVIObXX/980+vwwSHRIwhzyV31LlqINytEbEuCQpQD0kz+8lowKW+ximG0geYyqPW1u5LwjJyQtuEJ3pY9nax1cRkNldWb0ljLrS8Y5OcVfWrn8qY+qN6KELNqFdymuPzdJzl+R0hdSx1PsRoOBkeTYezya33W+N3OvPAGH4=", + "LS0tLS0tLS0tLS0tLS0tLS0tLYebYAMAPiQMZloCKVuX4fTNBQvI1ax5e4X4r/fY5QtioGK3N/dgsSr17nDSQh3yXMph34OkGTfdnP5ZDxS6F7NkVmr+bGncwv/MKdvzJFIk4dM1ZJx0c4UcUV56uAfjAWjRtAQLG/oPuHBKCIzqpGVVc1nttTqh04G2K+9mB3URzAhtpjXO8tLcV4eyy3iof4433KQ0sA26Iaw3g9ZiwZ4nAosblJ2uRoYkgTLNWT4QLhPMLb4S31BQ9vUnPgOp/NX/Qr7sP8/vINGVqPfb3MkIPp3hKHCsDFDRbwuuywyJ9BwOLu6oNayKv2HOJ2NCFWsxbXtSl9jvi6px18T36bydPxqZ5AVPoiu2AZi33PfxNVvllmY75Wsx3wED6kvuOrTEMz0BvhxZNHJmh+AKXliqWhKQgB+UED7/5TKMHuXSor9boxbmH3IvUfQY5LhK+qPEGyjsuJrhTujmTv8ERlpXzOVDJfRJCfQL7gRzyFuRD7jif6LKG1j1BpX4y3guzxVatMRcg2LIFGsMIdxcyDcnFlmHfP61mALVcyU+SljzxWaKHJA6j/wqX8VAOcaYv3Xzkka7B8GxqmGS++TnDc4U632kjq05V3uOWAx35yrm4DbQHsJ37HHssqcusMfJXPZMoS9pRpTFxcMIV7s=", + "np6enp6enp6enp6enp6enp6enqiGT4AdVMTI5FMKUcGvZs4GFf3HcXIUtjl6JWRHuuhy00nLduxnphSzWThAFSEEN7YmZKM7M3MOEpcz4V8+5bw8HD17kubjlB0t2VMTt0U1pNZaagnUY/2yLkYViTSEnpOn051f1UmK3k060hgSOwbeY/bl13IsGUlXBxjpVsLtnjyUfCh0xrc0Mdr3rqCWHMSSI/mNMoSbSG33FCfkWHYutzsCOTdG96STfGqOfFgavgPF/5ftejp8ba56eQwfYMHTyAidADK6Ac4KfIVUEF3KayzjiBdzBlZodWNlT/eVXQ3R3F3UUW5f4eRqx63sstzT1LlE+fNN7GVwjqOtgT2oNJ0p4AVCdULj8NcE9lHLdOo8RR7IvS3Pq29TzguBs0zRmIaXYbwmRqmyEL269ky81fLvE6RoqOpN/4mabAzSKClLUjIAA/5wlv0zClWQKffy5yhHLpXvisn76WT4UKqTQwDU1pIJBpYHc3J5560PCzcPC7YJC9QJC/XwjYWIhRARhoL5hIiOhPkeYfl0EIrjght2jhlxiI6EEJIbC/CNhYiFEBGGgmGPEBGAGxeBg4KPHYwYGG5siBaKgIGAb4dpjI9nbBmNFhsQjWBmgZKXAAAAAAAAAAAAAAAAAAAAAAAAAEHCiOcex45BYNA=", + "r6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6AIAAAAAJYP0Ab69RfflfZSGg4Aqsk7zoGHFCzYjJ/195vh0iSCVvPqeluDcQkAkoML4wt2C5jwjY4QgY4Q+Y0ZGxYRjvkQhY0WZ2ZgiWH54xiEfIUbkvML/AbVvFzdha6V4AjpTsnRCzu/9KnFRre7GUTL45QH9tt+yZIHCw8ECZkOkpILAwsHGBGGgpIHaWVsaJ0szQeWfnN7uR9X1MZJpWN33c6+UDuydJIdhtFxTEG98YvKLEZNd8zU4zzoe7om+9DEreRdunrYnyZ+vE3oTR0c4I5gsviSCQ+WB3NyeecAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "r6+vr6+vr6+vr6+vr6+vr6+vr+5tJ0ixaCHuz3cBAAAJ0G1j9vhr9PXK8FxtBA6rFIqByxdS37crs1OuVHqzQX7ySJp8tcQlwcNIGooPOgLrIGLLRRmP3XyMNgHF2xJhmb7t0UbrS1aYZdTkdCi8RRn/6e73o+WUIMHG7wExFni/ItXN6LNNUTkpDAcBdYhHReceVDhrQ2i7cOk+zZxp1S2RCayLIKdAbje4JS0q1qSnZTU6xG9f0y7ejsKxszZwIwsEdila3z4i9RXQKON+x7VYaFU6KJIa2vq2BCclalSzSSnicFRoicJfg4G4bwTd3jOCv83g8sv93x170YLXI0rqYfJdWGFXtbgUUECeAh6Lhe9vxasFeSfZLkpveoclzs49TApxOegWICzgJnBm1f7Tkmh59khP+tOXS8pi1QDDpKOaD+WLQCdrGVzEbBTn73quv95emKdgJewKQ6Si0kq6yvDWeks96s9zroY/oB3M014xw12gwO6Hb9sIvNcreG6vmF7c64DeAVp4o/9pQFOFtU2ZD1IdI9KYB0hUvLx+47Hf3d4WC1FL5K/0ONMr7LdDeG4NkwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "r6+vr6+vr6+vr6+vr6+vr6+vr/ku1yBpUx0SyF4BAAAGDjBg06XvtkjnbVf80i8T917XVsPWBSgEyl10TK0yR0kwngL6gnOx1S+lz8XoIGF6hxV6ZNjm43EtRpKrXfb49LVWxO7eJ+JyUx6txwP666JaVTUm//e/ByzDxpAycd/Z3PXdiVikMsAAfFCe7/C2nM9e0ot0xxDdanBaJIycrDv/AM0apyWweUrUfoJmUgrR2AgWAFnv59zFJAAR6KggOzPKpxdWxNpoV/HuUp9Ex0ZCqRMvExdusIdrxFcMZNJabGYgH2wbffpP0vl94TwECdNqCVI986wA0Czh2VqL9jbJFieISOZUW+Fntgf+ST754A8stwP7UQjLr1o5U/IaNpkJHUkmAWua0JLJV5tMHe/jLa/cYmphFQy3fUtZAkslNhB66m+fnIaLFzgLUbE4dIHdyC8Y7jN/VJhUcHI6TTTBP+Z7ShyxvWraROseeVA99EBVIOKxlPhE0GUJ16fszdakXvxKsk1eOAqyysRlb+Pf6fjwEJwHV3KOVG06H5+wsnKlv0/ooayBfaBtLOcxk8JN+EU+HB9DOa14qMCCUcEDEKr9EIMNeYlELY8N+s7LPN0DzqZ5Yz9LrrgotD3/zAK/rSGDMLjKpsWmfkkef7W/2ZjjRpYXiz3CVtSO6O0=", + "LS0tLS0tLS0tLS0tLS0tLS0tLZD8HzPXVV8bJ+UCw28nut2YeG7D/zVvhnPBHbHVe5EBzbGEjmK31prOql4ES816nKw3u2ZGOyJkmCJALEZCvrykpLUlvKa22i9ETsVxq6kMyIsO1xs/mDqwVzxANqpGBj/nzXvy/7gyLqtRjt0DFX1vg0TSx7NENnSegOAfWRhnHYr/qRzRTmgXNx4lo0Te2gumyaWso7PscXQTdMOKpOBy7SPxPAXPtroh2zF4CXts/v5tdbOdY1v5kYXNmbMepmrMYGSoQ1MPYcaCf4IQ7R4D+OyHM4/eu/ohvcJVdhMDo9Sf0T1GllX4Pt/78JuPe3qXpSGU5MkhfZrhBPDsKQfG5vwAccPR4yRArX1QxVwZ0U3fa9IGnUTZDjOtA/hPKbG6HCPy6AZa2hQHLoBN19XMeuVw16IeDTJaGupN0OlCglrlI70EK7V0b6G7iX55fRYO4BpI+Wc7WDEGexvIaDY0pKnGL3XrsNAN3N6brp/vzLmMoBUeaNiHbep9K9xOU1yr4s1eXZkYl7nYNNwXcox5r1vrygEK653HXZR1VjHWjBAfaEEEGPBkZuQ0Melz7cApQjvZyAw+gJZwJkRHJNtNT8hTyrMPavQlXyMVS6aLvPxFaC82vjO+GnOREyUurdrOdsH7PlLlgNxYjXQ=", + "AAAAAAAAAAAAAAAAAAAAAAAAAL1H1b/3172Lw0sDEtVtHo2f8Hk+Cw7gbs8pYH/zDd9kAVS8Libzf8h0wkGR99VeOb9dnjDN8qomkrgtCQdW9xvb+rNNnlrEmL78LmeEGtHW/bb7RCsNJi34KNyJTRXJxZz4VT6fOsfkwP0cNgkGvflM5LRGTF/UW2DFRYJvd/xmPOV6ANyA2+avXt7bP0gl5iU5Ot/M/TUX6JLQYlmJCD47Idn+eXDQSz1D0MhraAxaCM+gBfmsGbbrPpBozYi0PpaPBAr6fuqK2rimJoU5pske4iIZaLH8QHwBQx3JYp7ZwbMjXXnNTXsRXYOGHmccuKlNAoJzPNF2n8i7+4MU72wvc3dx5fwR++dkAUxGNwSzmU1znTJsjZNS+IdHxNcDnSDXg0qlXCd1KoRrTFNyt/j1saz0uw6qSQ3Fn1B30Il3Li2rT2MonZQ0FGRhcBOoAK54X4J6bux1ThegjEQ/hVnLAmBjKzyVdn8DiK8pyBDqu313KhnJftf2+WLtQE+WiqEBkODrvihgSxRwL3iiyKFuYJ9Bel+4S8BsR+ps4RiLAXxchVTzWe+HtKS3jKQglHsTWrHjTiRr5XQgHmtjyNC2aHwaoJfyvgsmw8SHZ88lXMqVdu1BUkJSqNS/o+Ln8SyC19hit+ivvt5mMb8=", + "0tLS0tLS0tLS0tLS0tLS0tLS0qUsBHNAj0EujlkCak9RqXHwx7jNnyHuZvh0YV0U9tODv5L9gsTiMLjEB1FN/lAIRBzs0Y/sNYhyYMrrgtYD9pEfXt/aQAUtAj9eyFMQcvXIfDj7x9uJBe/tTRh4D4r50uv79GjugxmKUamEuhq+bPANCbjVzUmnm+uBkMIocn1JjnkgWLFiaYvqWau1W3v6v7a3Z8BEKzzgVOBfnztvJSF3lzdLfYRapAxLdXBX9P1J/de9TEH8FnaQId3vS0e9zR9F4nXv8tJryieiAsqzq0bbRaeGYluIaBdyByo9pM9uvy+yYm3O5pJ7FyaMbO5tQVUaxzUP31+0zA58YStdeUlXmAy9CFa1n9hgs/ay+MDCXHyuWzRchVCpG07cG3O5BvVffDWIHFPoksu8CRHFuxcbabExYC5xb+uyZMOzeLTp6D75W/sVQ8CxZUjwR9EFBUrX7D7eefQoSqZa+9n9qmm99FVbWGuOeyEBZnBvxSBHsMZHtGyioDQc+APFPczd995gc5/q1X8RhZPXBAGzCjpdrPnn/R2Z89HNfQZC/BN+fio38FVrM3nA02e/q2iTe/7oVrW94Tru15iU7ktBuK4fRPxCpBNn2TP6GrVrTy2gZUEjoYrdbdptWv7nVImPOcWe+RGjui1gWaD9gWQ=", + "zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozpj93rgKzfQlJi0B6jS7tST9rwmJrcKHMIAl9djNc2j582sNmt82ym/i2Tr4g3poVtLM3ZZLqpbTPwtZv6DO9mUdsKuwT5wNXa287FB+lzqMffZ3NTDlZ66nTI1mLz9MofOZH6QiCJ4OzY1lV3kmT5sxZ27yBof32Vap0YSLMOfiQUJQwLMmKyQG4ThHglPylTYsKNDf0tHrt6FLcbXSobOqVrONjCtP0CtT/B7tLCQVNOALrOp3MpSx1Vu3lwjY2CKNAlqARhhhy12D0h7jeGeT4QdQ2my3ePIXT7MByNuphCKQOhz6ZJAl5KHHkMMxR4/GpKivEO3dJH42W9t6W/9VS7IbVEMlc0nxxmWfBJ6XMdVp0Ely2BTEN35P2kZEvu9G7/hmJhHBEnNZrDSmv8V+koBOw4dNjVqvI1XMjyN9G5G6E4Mmh2vfu6aBK5c/pBP+hNknl08gPCQmPK8DMLK18iM73qY6BKYJKgNj8bpGCpclbBv8hL+uDkWp9GrX94aymP68xubxjuIP3X+88V7Tg7fFaaeQQg17Y95aP7+g9uXCgk5ZyarUufY+XPNCkW2gQzCSBvWTF+NDrCsuB/+OIWEVwRFctW/Bvw9gLtQmKFZwj/BgJ24nlhDXm/v5vKsxHt/vME329vgMtZI=" + ], + "codec": "Leopard" +} diff --git a/adapters/celestia/test_data/block_without_rollup_data/etx_rows.json b/adapters/celestia/test_data/block_without_rollup_data/etx_rows.json new file mode 100644 index 000000000..df97b6db5 --- /dev/null +++ b/adapters/celestia/test_data/block_without_rollup_data/etx_rows.json @@ -0,0 +1,18 @@ +[ + { + "shares": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAAACtgAAACbZAgrNAgqgAQqdAQogL2NlbGVzdGlhLmJsb2IudjEuTXNnUGF5Rm9yQmxvYnMSeQovY2VsZXN0aWExbWVuc3NkejJ3NnU4Y3R6djAyZHpucGNmcnNrODhsMGx1azdyNmESHQAAAAAAAAAAAAAAAAAAAAAAAAD8bUNo5SGoqjIuGgKFBiIg2yJCa5mhWpSCCf4D6JIhl2H1sfYPw8f5FVQ+EyeJil1CAQASZgpQCkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohAtFCZJHMIUdbiMkVX4fhj6xX5Wfk8UyUW5e3quISZM3iEgQKAggBGAUSEgoMCgR1dGlhEgQ4MzkwELSPBRpALyuJS7y5LcvdJ7DzACRef9gw1lGFLWsUOA6evLuG9MIADCpFGibFDfAZuyskWLyIvxZeZ+clXT4p/90VgACdlhIBAxoESU5EWNkCCs0CCqABCp0BCiAvY2VsZXN0aWEuYmxvYi52MS5Nc2dQYXlGb3JCbG9icxJ5Ci9jZWxlc3RpYTFoc3RqeXdtZmFoemR1dTM4bHBnam1qNG43ZGgyOHJjcHlzYzY1bRIdAAAAAAAAAAAAAAAAAAAAAAAAAIvtbFh24m+LNpU=", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAABoClQMiIHeXFiz0fgUA3efD421ue7STZBsgKxNbnrJh/CNRSPVmQgEAEmYKUApGCh8vY29zbW9zLmNyeXB0by5zZWNwMjU2azEuUHViS2V5EiMKIQOarfGcZdUWXAZdieeSCsOhJ9Hpj6epcoTsUBEELJ9A5xIECgIIARgFEhIKDAoEdXRpYRIENzk4MBC07wQaQElPonH7neWN3zpBnOOm/8OoTRJ6aZJCgouqKGDrtI+FQeidUMdaT665JZXu2VT2rkiTG7lArYVahXp9XG82qCkSAQIaBElORFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" + ], + "proof": { + "start": 0, + "end": 2, + "nodes": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAIvtbFh24m+LNpUAAAAAAAAAAAAAAAAAAAAAAAAA/G1DaOUhqKoyLvsCiA3MWph1KIiwfLUAlUW7hI4RFOCcOyianErJ4KhI", + "/////////////////////////////////////////////////////////////////////////////wJmko3hg439gImAypgButRTOMwq1+SIIPGWqFuWJssZ" + ], + "leaf_hash": "", + "is_max_namespace_ignored": true + } + } +] diff --git a/adapters/celestia/test_data/block_without_rollup_data/header.json b/adapters/celestia/test_data/block_without_rollup_data/header.json new file mode 100644 index 000000000..582e98a5e --- /dev/null +++ b/adapters/celestia/test_data/block_without_rollup_data/header.json @@ -0,0 +1,90 @@ +{ + "header": { + "version": { + "block": "11", + "app": "1" + }, + "chain_id": "private", + "height": "12", + "time": "2023-09-27T16:58:19.63881203Z", + "last_block_id": { + "hash": "C839E720DA55CC6E43EC7CE00744D6151D79E84C81D7F6995F3B13B7AE532456", + "parts": { + "total": 1, + "hash": "5045BCFCFA3D7BF28F45C02E6E027EF17B1EE30B1C401DF1C8FBA2C005648811" + } + }, + "last_commit_hash": "C3EA49B60980AF1E022FA17A6F7F27FDFB957CFB837C589659245A035770CE51", + "data_hash": "A67040F5629A4D26C87D8D7EBAAF5F0DB67ACE2990333601F3AE6C6BAF243EB5", + "validators_hash": "D00E6D5C9B8B8FD263FEA6FA8229C5A86BB6D8D03696AC5D7633DF9895F75F40", + "next_validators_hash": "D00E6D5C9B8B8FD263FEA6FA8229C5A86BB6D8D03696AC5D7633DF9895F75F40", + "consensus_hash": "048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F", + "app_hash": "BB8BBA6880B1609A960E7650DD4D66B985044711D7CF800AAD74811FEAD9CF17", + "last_results_hash": "6F4AFD25D6AFBFE21CFF2DE494EFEB436CF93B33FB29942E6B3281ADF3CEAD27", + "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855", + "proposer_address": "06F9CE527A1CC6EF2678D2F18DDFC06B783597AD" + }, + "commit": { + "height": 12, + "round": 0, + "block_id": { + "hash": "F769490DC768E7678160384070727533B7AE809477EA5D191CF7AF5C917A7973", + "parts": { + "total": 1, + "hash": "F4385AC3F7D61AF85C556F7082D0EF4846EB82A703396C60D7C9FFB8F4E41C1C" + } + }, + "signatures": [ + { + "block_id_flag": 2, + "validator_address": "06F9CE527A1CC6EF2678D2F18DDFC06B783597AD", + "timestamp": "2023-09-27T16:58:30.665234031Z", + "signature": "5+MOvaRrSzm24wPxb3y/xS7FJzMwZOG2Qu1uta3G79cy803qr+4y7Y0eSQgJkIxUfWoxbyeT6EvmuAGqNf/MCg==" + } + ] + }, + "validator_set": { + "validators": [ + { + "address": "06F9CE527A1CC6EF2678D2F18DDFC06B783597AD", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "u01WraTbmnwJk0b1NytVDe0JFphZNhqbfd2MIpfsF7Q=" + }, + "voting_power": "5000", + "proposer_priority": "0" + } + ], + "proposer": { + "address": "06F9CE527A1CC6EF2678D2F18DDFC06B783597AD", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "u01WraTbmnwJk0b1NytVDe0JFphZNhqbfd2MIpfsF7Q=" + }, + "voting_power": "5000", + "proposer_priority": "0" + } + }, + "dah": { + "row_roots": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA/G1DaOUhqKoyLrFn9xm/BUXtpRR45zfagBYnv8+3S4n5D/hRtFgtI16u", + "AAAAAAAAAAAAAAAAAAAAAAAAAPxtQ2jlIaiqMi7//////////////////////////////////////p6G4NfV2HgHRAIU2/ymDxvcjx39Z/0xzbTpErIhCHjN", + "//////////////////////////////////////7//////////////////////////////////////uLSam+eudl+PFq2saaqVHCQkAeVAjSjiuRc4PslqTaj", + "//////////////////////////////////////7//////////////////////////////////////uLSam+eudl+PFq2saaqVHCQkAeVAjSjiuRc4PslqTaj", + "/////////////////////////////////////////////////////////////////////////////4l5qoj44rZjDunkjxrjCmVH6th+oYEK0Ya01jz71Xzs", + "/////////////////////////////////////////////////////////////////////////////zA5Tqpc96ztvx0uyBt5N3JJ3HuTCbsuMhbPgzRmntuW", + "/////////////////////////////////////////////////////////////////////////////2fflzKmne+H12fvmxUVSQdi1O6054vc9AQf30jziJ8o", + "/////////////////////////////////////////////////////////////////////////////2UfkxS59vGLbiaZTF87CWi7ZdhAKBfcwkuwfAolkOXA" + ], + "column_roots": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT//////////////////////////////////////opIjb03gu6+1ITQgCx/NE/icMApJxwlLpTHHLCxhuA3", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT//////////////////////////////////////hz+vAyRFxVMkHLkgeT+OKaNvnatTQ9qn06BCRmlSQde", + "AAAAAAAAAAAAAAAAAAAAAAAAAIvtbFh24m+LNpX//////////////////////////////////////rO1cyfXnI08K4GNifaKNQwS/pPbUFeQ3fkWphPnRIUi", + "AAAAAAAAAAAAAAAAAAAAAAAAAPxtQ2jlIaiqMi7//////////////////////////////////////j4/j5p8NepzsLERA/Von5xRm2HIVdZrR3MAMsNwHl5U", + "/////////////////////////////////////////////////////////////////////////////wz9+SSX4FF6SY4kI8hBW/Iwvzru2SyofLi3kYrTC+r0", + "//////////////////////////////////////////////////////////////////////////////O9VJszUXQ2Bjny+0CgcVz6yGLXZ8TPON6AazxSS5y9", + "/////////////////////////////////////////////////////////////////////////////59bDI193kV2WiJ1XlfvofvIGYefXtrJ9rVeCDwiL+rr", + "/////////////////////////////////////////////////////////////////////////////3KF4bQcDV86P69NjHa2A/AebFl7yutNH7+VWgi4JrjD" + ] + } +} diff --git a/adapters/celestia/test_data/block_without_rollup_data/rollup_rows.json b/adapters/celestia/test_data/block_without_rollup_data/rollup_rows.json new file mode 100644 index 000000000..145d8489c --- /dev/null +++ b/adapters/celestia/test_data/block_without_rollup_data/rollup_rows.json @@ -0,0 +1,16 @@ +[ + { + "shares": [], + "proof": { + "start": 2, + "end": 3, + "nodes": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEOx/5Dw9P45TBiPbQSRp0Iozd/Q26b8E5fFjcpQVsvQ", + "AAAAAAAAAAAAAAAAAAAAAAAAAPxtQ2jlIaiqMi4AAAAAAAAAAAAAAAAAAAAAAAAA/G1DaOUhqKoyLhUz+K4Z5TJ0i0ZXCWTtEKRFJm9J0zsDmngfLJIShWCn", + "/////////////////////////////////////////////////////////////////////////////wJmko3hg439gImAypgButRTOMwq1+SIIPGWqFuWJssZ" + ], + "leaf_hash": "AAAAAAAAAAAAAAAAAAAAAAAAAIvtbFh24m+LNpUAAAAAAAAAAAAAAAAAAAAAAAAAi+1sWHbib4s2lcmeFRLinSslQkf29kfq2rR0sNxA1zwiyfM5JNMbxRXy", + "is_max_namespace_ignored": true + } + } +] diff --git a/adapters/risc0/Cargo.toml b/adapters/risc0/Cargo.toml index 3314f8503..d5dea0689 100644 --- a/adapters/risc0/Cargo.toml +++ b/adapters/risc0/Cargo.toml @@ -30,3 +30,7 @@ sov-rollup-interface = { path = "../../rollup-interface", version = "0.2" } default = [] native = ["risc0-zkvm/prove", "dep:risc0-zkp", "dep:risc0-circuit-rv32im"] bench = ["once_cell", "parking_lot", "native", "sov-zk-cycle-utils/native"] + +[[test]] +name = "native" +required-features = ["native"] diff --git a/adapters/risc0/README.md b/adapters/risc0/README.md index 0846f1cd6..85142ff71 100644 --- a/adapters/risc0/README.md +++ b/adapters/risc0/README.md @@ -1,11 +1,11 @@ # Risc0 Adapter -This package adapts Risc0 version 0.14 to work as a ZKVM for the Sovereign SDK. +This package adapts Risc0 version 0.18 to work as a zkVM for the Sovereign SDK. ## Limitations -Since recursion is not included in the 0.14 release, this adapter is currently limited - individual "slots" may -be proven, but those proofs cannot be recursively combined to facilitate bridging or ultra-fast sync. +Since in-VM recursion is not included in the 0.18 release, this adapter is currently limited. Individual "slots" may +be proven, but those proofs cannot be recursively combined to facilitate bridging or ultra-fast sync ("user recursion" is not supported). ## Warning diff --git a/adapters/risc0/src/guest.rs b/adapters/risc0/src/guest.rs index 0ce1860e6..394fef8a5 100644 --- a/adapters/risc0/src/guest.rs +++ b/adapters/risc0/src/guest.rs @@ -1,3 +1,4 @@ +//! This module implements the `ZkvmGuest` trait for the RISC0 VM. #[cfg(not(target_os = "zkvm"))] use std::ops::DerefMut; @@ -64,6 +65,10 @@ impl WordRead for Hints { } } +/// A guest for the RISC0 VM. When running in the Risc0 environment, this struct +/// implements the `ZkvmGuest` trait in terms of Risc0's env::read and env::commit functions. +/// When running in any other environment, the struct uses interior mutability to emulate +/// the same functionality. #[derive(Default)] pub struct Risc0Guest { #[cfg(not(target_os = "zkvm"))] @@ -73,10 +78,14 @@ pub struct Risc0Guest { } impl Risc0Guest { + /// Constructs a new Risc0 Guest pub fn new() -> Self { Self::default() } + /// Constructs a new Risc0 Guest with the provided hints. + /// + /// This function is only available outside of Risc0's environment. #[cfg(not(target_os = "zkvm"))] pub fn with_hints(hints: Vec) -> Self { Self { diff --git a/adapters/risc0/src/host.rs b/adapters/risc0/src/host.rs index 8f39555c2..bcf6d807a 100644 --- a/adapters/risc0/src/host.rs +++ b/adapters/risc0/src/host.rs @@ -1,3 +1,4 @@ +//! This module implements the `ZkvmHost` trait for the RISC0 VM. use std::sync::Mutex; use risc0_zkvm::serde::to_vec; @@ -13,6 +14,8 @@ use crate::guest::Risc0Guest; use crate::metrics::metrics_callback; use crate::Risc0MethodId; +/// A Risc0Host stores a binary to execute in the Risc0 VM, and accumulates hints to be +/// provided to its execution. pub struct Risc0Host<'a> { env: Mutex>, elf: &'a [u8], @@ -36,6 +39,7 @@ fn add_benchmarking_callbacks(mut env: ExecutorEnvBuilder<'_>) -> ExecutorEnvBui } impl<'a> Risc0Host<'a> { + /// Create a new Risc0Host to prove the given binary. pub fn new(elf: &'a [u8]) -> Self { Self { env: Default::default(), @@ -107,6 +111,7 @@ impl<'host> Zkvm for Risc0Host<'host> { } } +/// A verifier for Risc0 proofs. pub struct Risc0Verifier; impl Zkvm for Risc0Verifier { @@ -150,6 +155,8 @@ fn verify_from_slice<'a>( /// data. This allows us to avoid one unnecessary copy during proof verification. #[derive(serde::Serialize, serde::Deserialize)] pub struct Risc0Proof<'a> { + /// The cryptographic data certifying the execution of the program. pub receipt: InnerReceipt, + /// The public outputs produced by the program execution. pub journal: &'a [u8], } diff --git a/adapters/risc0/src/lib.rs b/adapters/risc0/src/lib.rs index 76c694a2c..54e530926 100644 --- a/adapters/risc0/src/lib.rs +++ b/adapters/risc0/src/lib.rs @@ -1,3 +1,8 @@ +#![deny(missing_docs)] +//! # RISC0 Adapter +//! +//! This crate contains an adapter allowing the Risc0 to be used as a proof system for +//! Sovereign SDK rollups. use risc0_zkvm::sha::Digest; use serde::{Deserialize, Serialize}; use sov_rollup_interface::zk::Matches; @@ -9,6 +14,8 @@ pub mod host; #[cfg(feature = "bench")] pub mod metrics; +/// Uniquely identifies a Risc0 binary. Roughly equivalent to +/// the hash of the ELF file. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct Risc0MethodId([u32; 8]); diff --git a/adapters/risc0/src/metrics.rs b/adapters/risc0/src/metrics.rs index faa60c6c2..f8a880804 100644 --- a/adapters/risc0/src/metrics.rs +++ b/adapters/risc0/src/metrics.rs @@ -1,3 +1,4 @@ +//! Defines utilities for collecting runtime metrics from inside a Risc0 VM use std::collections::HashMap; use anyhow::Context; @@ -5,10 +6,13 @@ use once_cell::sync::Lazy; use parking_lot::Mutex; use risc0_zkvm::Bytes; +/// A global hashmap mapping metric names to their values. pub static GLOBAL_HASHMAP: Lazy>> = Lazy::new(|| Mutex::new(HashMap::new())); -pub fn add_value(metric: String, value: u64) { +/// Increments the requested metric by the given value, creating a +/// new entry in the global map if necessary. +fn add_value(metric: String, value: u64) { let mut hashmap = GLOBAL_HASHMAP.lock(); hashmap .entry(metric) @@ -19,7 +23,9 @@ pub fn add_value(metric: String, value: u64) { .or_insert((value, 1)); } -pub fn deserialize_custom(serialized: Bytes) -> Result<(String, u64), anyhow::Error> { +/// Deserialize a `Bytes` into a null-separated `(String, u64)` tuple. This function +/// expects its arguments to match the format of arguments to Risc0's io callbacks. +fn deserialize_custom(serialized: Bytes) -> Result<(String, u64), anyhow::Error> { let null_pos = serialized .iter() .position(|&b| b == 0) @@ -31,6 +37,11 @@ pub fn deserialize_custom(serialized: Bytes) -> Result<(String, u64), anyhow::Er Ok((string, size)) } +/// A custom callback for extracting metrics from the Risc0 zkvm. +/// +/// When the "bench" feature is enabled, this callback is registered as a syscall +/// in the Risc0 VM and invoked whenever a function annotated with the [`sov-zk-cycle-utils::cycle_tracker`] +/// macro is invoked. pub fn metrics_callback(input: risc0_zkvm::Bytes) -> Result { let met_tuple = deserialize_custom(input)?; add_value(met_tuple.0, met_tuple.1); diff --git a/adapters/risc0/tests/native.rs b/adapters/risc0/tests/native.rs new file mode 100644 index 000000000..7c721ca01 --- /dev/null +++ b/adapters/risc0/tests/native.rs @@ -0,0 +1,24 @@ +use serde::{Deserialize, Serialize}; +use sov_risc0_adapter::host::Risc0Host; +use sov_rollup_interface::zk::{ZkvmGuest, ZkvmHost}; + +#[derive(Serialize, Deserialize, Debug, PartialEq)] +struct TestStruct { + ints: Vec, + string: String, +} + +#[test] +fn test_hints_roundtrip() { + let hint = TestStruct { + ints: vec![1, 2, 3, 4, 5], + string: "hello".to_string(), + }; + let mut host = Risc0Host::new(&[]); + + host.add_hint(&hint); + + let guest = host.simulate_with_hints(); + let received = guest.read_from_host(); + assert_eq!(hint, received); +} diff --git a/deny.toml b/deny.toml index 4040e3ab2..ca525000c 100644 --- a/deny.toml +++ b/deny.toml @@ -2,16 +2,18 @@ # Deny crates that do not have a license. unlicensed = "deny" allow = [ - "Apache-2.0", - "MIT", - "Unlicense", - "Unicode-DFS-2016", - "MPL-2.0", - "ISC", - "CC0-1.0", - "BSD-2-Clause", - "BSD-3-Clause", - "OpenSSL", + "Apache-2.0", + "MIT", + "Unlicense", + "Unicode-DFS-2016", + "MPL-2.0", + "ISC", + "CC0-1.0", + "BSD-2-Clause", + "BSD-3-Clause", + "OpenSSL", + "Apache-2.0 WITH LLVM-exception", + "Zlib", ] [[licenses.clarify]] @@ -19,6 +21,4 @@ name = "ring" # ring is derived from BoringSSL and has a bit of a special licensing situation, # but we can effectively treat is as OpenSSL-like licensing. expression = "OpenSSL" -license-files = [ - { path = "LICENSE", hash = 0xbd0eed23 } -] +license-files = [{ path = "LICENSE", hash = 0xbd0eed23 }] diff --git a/docker/Dockerfile.bridge b/docker/Dockerfile.bridge new file mode 100644 index 000000000..864240597 --- /dev/null +++ b/docker/Dockerfile.bridge @@ -0,0 +1,18 @@ +# A dockerfile for the celestia bridge node in DA layer +# Based on: +# https://github.com/celestiaorg/celestia-node/blob/main/Dockerfile +FROM docker.io/alpine:3.18.3 + +ENV CELESTIA_HOME=/root + +RUN apk update && apk add --no-cache bash jq + +# Copy in the binary +COPY --from=ghcr.io/celestiaorg/celestia-node:v0.11.0-rc14 /bin/celestia /bin/celestia +COPY --from=ghcr.io/celestiaorg/celestia-node:v0.11.0-rc14 /bin/cel-key /bin/cel-key + +COPY ./run-bridge.sh /opt/entrypoint.sh + +EXPOSE 2121 26658 + +CMD /opt/entrypoint.sh diff --git a/docker/Dockerfile.validator b/docker/Dockerfile.validator new file mode 100644 index 000000000..6b7d667ce --- /dev/null +++ b/docker/Dockerfile.validator @@ -0,0 +1,18 @@ +# A dockerfile for the celestia validator in consensus layer +# Based on: +# https://github.com/celestiaorg/celestia-app/blob/main/Dockerfile +FROM docker.io/alpine:3.18.3 + +ENV CELESTIA_HOME=/root + +RUN apk update && apk add --no-cache bash jq + +# Copy in the binary +COPY --from=ghcr.io/celestiaorg/celestia-app:v1.0.0-rc17 /bin/celestia-appd /bin/celestia-appd + +COPY ./run-validator.sh /opt/entrypoint.sh + +# p2p, rpc and prometheus port +EXPOSE 26656 26657 1317 9090 + +CMD /opt/entrypoint.sh diff --git a/docker/Makefile b/docker/Makefile index 10a4d5eab..48dd59754 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -1,21 +1,31 @@ +PROJECT_ROOT := $(shell git rev-parse --show-toplevel) +DOCKER_COMPOSE_DIR := $(PROJECT_ROOT)/docker +DOCKER_COMPOSE_CFG := $(DOCKER_COMPOSE_DIR)/docker-compose.yml +CREDENTIALS_DIR := $(PROJECT_ROOT)/examples/celestia-docker/credentials -COMPOSE_FILE=docker-compose.celestia.yaml -MOUNT_FOLDER=keyring-test -NODE_1_KEY_FILE=bridge_1_key.txt +docker_compose := docker compose -f $(DOCKER_COMPOSE_CFG) up: - docker-compose --file $(COMPOSE_FILE) up -d - + @echo "Starting services" + @$(docker_compose) up -d --build --force-recreate + @echo "Waiting for services to finish setup" + @$(docker_compose) logs -f | awk '/Provisioning finished./ {print;exit}' # exit when encounter this log entry down: - docker-compose --file "$(COMPOSE_FILE)" down - rm -rf $(MOUNT_FOLDER)/*.txt - rm -rf config_*.toml + @echo "Shutting down services" + @$(docker_compose) down + @echo "Removing generated configs" + @rm rollup_config_*.toml + +# wait for the celestia network to perform setup and coins transfers +wait-compose-ready: + @echo "Waiting for services to finish setup" + @$(compose_logs) | awk '/Provisioning finished./ {print;exit}' # exit when encounter this log entry restart: down up generate_configs -generate_configs: - bash ./generate_configs.sh +generate_configs: wait-compose-ready + @$(DOCKER_COMPOSE_DIR)/generate_configs.sh logs: - docker-compose --file "$(COMPOSE_FILE)" logs --follow \ No newline at end of file + @$(docker_compose) logs -f diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 000000000..0f10c7418 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,51 @@ +# Local celestia setup + +It consists of one validator (block maker) and arbitrary number of bridge nodes +for sequencers (1 by default). + +## Example + +```sh +# start the celestia network +docker compose -f examples/celestia-docker/docker-compose.yml up --build --force-recreate -d + +# grab the jwt +CELESTIA_NODE_AUTH_TOKEN="$(cat examples/celestia-docker/credentials/bridge-0.jwt)" + +# check the celestia rpc +curl -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer ${CELESTIA_NODE_AUTH_TOKEN}" \ + -d '{ + "id": 1, + "jsonrpc": "2.0", + "method": "header.GetByHeight", + "params": [2] + }' \ + localhost:26658 + +# stop the celestia network +docker compose -f examples/celestia-docker/docker-compose.yml down +``` + +## Multiple sequencers + +To have multiple sequencers, a few conditions needs to be met: +- validator must know the number of sequencers to provision them with accounts and coins +- each sequencer must have a unique id and each id has to be a consecutive natural number + starting from 0. (eg. 0, 1, 2) +- each sequencer other than the first one has to have the ports remapped so they don't conflict + with other sequencers + +The `docker-compose.yml` has a commented out example setup for the second sequencer. It can +be copy-pasted and adjusted for an arbitrary number of sequencers. The amount of sequencers +needs to be provided by uncommenting and aligning the `services.validator.command` field. + +## Credentials + +Credentials for each new sequencer are created by validator on the first startup. The validator writes +the keys and address of each sequencer to the `examples/celestia-docker/credentials` volume. Each consecutive +run will use the same credentials until the directory is manually cleaned up. + +In addition, each sequencer on startup will write it's `JWT` token to the same directory. The token is +updated during consecutive runs. diff --git a/docker/credentials/bridge-0.addr b/docker/credentials/bridge-0.addr new file mode 100644 index 000000000..251e6a8cf --- /dev/null +++ b/docker/credentials/bridge-0.addr @@ -0,0 +1 @@ +celestia1a68m2l85zn5xh0l07clk4rfvnezhywc53g8x7s diff --git a/docker/credentials/bridge-0.key b/docker/credentials/bridge-0.key new file mode 100644 index 000000000..fda19e624 --- /dev/null +++ b/docker/credentials/bridge-0.key @@ -0,0 +1,9 @@ +-----BEGIN TENDERMINT PRIVATE KEY----- +kdf: bcrypt +salt: 68B0092F4FC5386C20DA96ECEE1BFE09 +type: secp256k1 + +JEOTdvPjs/4G+Jhz0hyNgdN5CgOCCcf5zvECY6zp+AN6IT6rTW0xbGqgFqbX6Yyi +NUV8e1fo9zhoytjrHjcCgHRnGiBGFQf1Ld4sBzE= +=TmEg +-----END TENDERMINT PRIVATE KEY----- diff --git a/docker/docker-compose.celestia.yaml b/docker/docker-compose.celestia.yaml deleted file mode 100644 index 704e2a16b..000000000 --- a/docker/docker-compose.celestia.yaml +++ /dev/null @@ -1,142 +0,0 @@ -version: '3' - -services: - validator: - container_name: sov-celestia-validator - image: ghcr.io/celestiaorg/celestia-app:v0.13.2 - healthcheck: - test: [ "CMD", "curl", "-f", "http://127.0.0.1:26657/block?height=1" ] - interval: 30s - timeout: 10s - retries: 5 - environment: - - VALIDATOR_NAME=validator - - KEY_NAME_1=validator - - KEY_NAME_2=node1 - - KEY_NAME_3=node2 - - CHAIN_ID=test -# - CHAIN_ID=sov-testnet - - CELES_AMOUNT=12300000000000000000000000utia - - STAKING_AMOUNT=1000000000utia - - DEBIAN_FRONTEND=noninteractive - ports: - - "9090:9090" - - "36656:26656" - - "36657:26657" - - "36658:26658" - entrypoint: - - /bin/sh - - -c - - | - apk update -qq && apk add -qq curl && \ - /bin/celestia-appd init $$VALIDATOR_NAME --chain-id $$CHAIN_ID && \ - if [ ! -f "/root/keyring-test/$$KEY_NAME_1.info" ]; then \ - echo "CREATING NEW KEYS" && \ - /bin/celestia-appd keys add $$KEY_NAME_1 --keyring-backend test && \ - /bin/celestia-appd keys add $$KEY_NAME_2 --keyring-backend test && \ - /bin/celestia-appd keys add $$KEY_NAME_3 --keyring-backend test && \ - mkdir -p /root/keyring-test && cp /root/.celestia-app/keyring-test/* /root/keyring-test/; \ - else \ - echo "USING EXISTING KEYS" && \ - mkdir -p /root/.celestia-app/keyring-test/ && \ - cp /root/keyring-test/* /root/.celestia-app/keyring-test/; \ - fi; \ - echo "AVAILABLE KEYS:" && \ - /bin/celestia-appd keys list --keyring-backend test && \ - /bin/celestia-appd add-genesis-account $$KEY_NAME_1 $$CELES_AMOUNT --keyring-backend test && \ - /bin/celestia-appd add-genesis-account $$KEY_NAME_2 $$CELES_AMOUNT --keyring-backend test && \ - /bin/celestia-appd add-genesis-account $$KEY_NAME_3 $$CELES_AMOUNT --keyring-backend test && \ - /bin/celestia-appd gentx $$KEY_NAME_1 $$STAKING_AMOUNT --chain-id $$CHAIN_ID --keyring-backend test --evm-address 0x966e6f22781EF6a6A82BBB4DB3df8E225DfD9488 && \ - /bin/celestia-appd collect-gentxs && \ - echo "NODE_ID:" && \ - /bin/celestia-appd tendermint show-node-id && \ - - /bin/celestia-appd start --rpc.laddr tcp://0.0.0.0:26657 --proxy_app tcp://0.0.0.0:26658 - volumes: - - ./keyring-test:/root/keyring-test/ - - - # cat /root/.celestia-app/config/genesis.json && \ - - bridge: - image: ghcr.io/celestiaorg/celestia-node:v0.7.1 - container_name: sov-celestia-bridge - environment: - - KEY_NAME=validator - - CHAIN_ID=test - - STAKING_AMOUNT=1000000000utia - - DEBIAN_FRONTEND=noninteractive - depends_on: - - validator - ports: - - "26656:26656" - - "26657:26657" - - "26658:26658" - entrypoint: - - /bin/sh - - -c - - | - apt-get -qq update -qq && apt -qq install -y curl jq && rm -rf /var/lib/apt/lists/* && \ - sleep 20 && \ - until curl http://validator:26657/block?height=1; do echo "Waiting for validator..."; sleep 5; done && \ - mkdir -p /bridge/keys/keyring-test/ && cp -r /root/keyring-test/* /bridge/keys/keyring-test/ && \ - /celestia bridge init --node.store /bridge && \ - until curl http://validator:26657/block?height=1; do echo "Waiting for validator..."; sleep 5; done && \ - export GENESIS=$(curl http://validator:26657/block?height=1 | jq '.result.block_id.hash' | tr -d '"') && \ - export CELESTIA_CUSTOM="$$CHAIN_ID:$$GENESIS" && \ - echo "Starting bridge with option=$$CELESTIA_CUSTOM and key name $$KEY_NAME. API KEY:" && \ - /celestia bridge auth admin --node.store /bridge --log.level=ERROR && echo " " && \ - echo "$(/celestia bridge auth admin --node.store /bridge --log.level=ERROR)" > /root/keyring-test/bridge_1_key.txt && \ - /celestia bridge start --node.store /bridge --gateway --gateway.addr 0.0.0.0 --rpc.addr 0.0.0.0 --core.ip validator --keyring.accname $$KEY_NAME - volumes: - - ./keyring-test:/root/keyring-test - - bridge-2: - image: ghcr.io/celestiaorg/celestia-node:v0.7.1 - container_name: sov-celestia-bridge-2 - environment: - - KEY_NAME=node1 - - CHAIN_ID=test - - STAKING_AMOUNT=1000000000utia - - DEBIAN_FRONTEND=noninteractive - depends_on: - - validator - ports: - - "46656:26656" - - "46657:26657" - - "46658:26658" - entrypoint: - - /bin/sh - - -c - - | - apt-get -qq update -qq && apt -qq install -y curl jq && rm -rf /var/lib/apt/lists/* && \ - sleep 20 && \ - until curl http://validator:26657/block?height=1; do echo "Waiting for validator..."; sleep 5; done && \ - mkdir -p /bridge/keys/keyring-test/ && cp -r /root/keyring-test/* /bridge/keys/keyring-test/ && \ - /celestia bridge init --node.store /bridge && \ - until curl http://validator:26657/block?height=1; do echo "Waiting for validator..."; sleep 5; done && \ - export GENESIS=$(curl http://validator:26657/block?height=1 | jq '.result.block_id.hash' | tr -d '"') && \ - export CELESTIA_CUSTOM="$$CHAIN_ID:$$GENESIS" && \ - echo "Starting bridge with option=$$CELESTIA_CUSTOM and key name $$KEY_NAME. API KEY:" && \ - /celestia bridge auth admin --node.store /bridge --log.level=ERROR && echo " " && \ - echo "$(/celestia bridge auth admin --node.store /bridge --log.level=ERROR)" > /root/keyring-test/bridge_2_key.txt && \ - /celestia bridge start --node.store /bridge --gateway --gateway.addr 0.0.0.0 --rpc.addr 0.0.0.0 --core.ip validator --keyring.accname $$KEY_NAME - volumes: - - ./keyring-test:/root/keyring-test - - - -# TODO: -# * +Create keys only if keyring-test does not exist -# * ~Export validator API key to file. Leftovers - generate rollup_config.toml -# * +Multiple bridges -# * Bridge health-check -# * Timeoutable wait for block_height -# * Quite install script -# * Print genesis.json - - - - -# GENESIS=""; CNT=0; MAX=30; while [ "${#GENESIS}" -le 4 -a $CNT -ne $MAX ]; do GENESIS=$(curl -s http://127.0.0.1:26657/block?height=1 | jq '.result.block_id.hash' | tr -d '"'); ((CNT++)); sleep 1; done -# GENESIS=""; CNT=0; MAX=30; while [ "${#GENESIS}" -le 4 -a $CNT -ne $MAX ]; do GENESIS=$(curl -s http://127.0.0.1:26657/block?height=1 | jq '.result.block_id.hash' | tr -d '"'); ((CNT++)); sleep 1; done && \ \ No newline at end of file diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 000000000..b03da1809 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,54 @@ +services: + validator: + image: validator + build: + context: . + dockerfile: Dockerfile.validator + # uncomment to provide amount of sequencers to provision (default: 1) + # command: ["/opt/entrypoint.sh", "2"] + volumes: + - credentials:/credentials + - genesis:/genesis + + sequencer-0: + image: bridge + build: + context: . + dockerfile: Dockerfile.bridge + # uncomment to provide the id of the sequencer (default: 0) + # command: ["/opt/entrypoint.sh", "0"] + ports: + - 26658:26658 + volumes: + - credentials:/credentials + - genesis:/genesis + + # Uncomment for another sequencer + # remember to adjust services.validator.command + # sequencer-1: + # image: bridge + # build: + # context: . + # dockerfile: Dockerfile.bridge + # # uncomment to provide the id of the sequencer (default: 0) + # command: ["/opt/entrypoint.sh", "1"] + # ports: + # # remap the default port as it's already used + # - 36658:26658 + # volumes: + # - credentials:/credentials + # - genesis:/genesis + +volumes: + # local volume where sequencer's credentials can persist + credentials: + driver: local + driver_opts: + type: 'none' + o: 'bind' + device: './credentials' + # a temporary fs where the genesis hash is announced + genesis: + driver_opts: + type: tmpfs + device: tmpfs diff --git a/docker/generate_configs.sh b/docker/generate_configs.sh index 8d3f4bc29..1f4944653 100755 --- a/docker/generate_configs.sh +++ b/docker/generate_configs.sh @@ -1,19 +1,67 @@ -MOUNT_FOLDER=keyring-test -NODE_1_KEY_FILE=bridge_1_key.txt -NODE_2_KEY_FILE=bridge_2_key.txt +#!/bin/bash -count=0; while [[ ! -f "$MOUNT_FOLDER/$NODE_1_KEY_FILE" && $count -lt 300 ]]; do sleep 1; ((count++)); done +# be strict +set -euo pipefail -NODE_1_KEY="$(cat "$MOUNT_FOLDER/$NODE_1_KEY_FILE" | egrep -v '^$|^WARNING|^\*\*DO NOT')"; -sed "s/^celestia_rpc_auth_token = .*/celestia_rpc_auth_token = \"$NODE_1_KEY\"/g" template.toml | \ - sed "s/^path = .*/path = \"demo_data_1\"/g" \ - > config_1.toml; +PROJECT_DIR="$(git rev-parse --show-toplevel)" +DOCKER_DIR="$PROJECT_DIR/docker" +CREDENTIALS_DIR="$DOCKER_DIR/credentials" +DOCKER_COMPOSE_CFG="$DOCKER_DIR/docker-compose.yml" +CONFIG_TEMPLATE="$DOCKER_DIR/template.toml" +CELESTIA_RPC_PORT=26658 -count=0; while [[ ! -f "$MOUNT_FOLDER/$NODE_2_KEY_FILE" && $count -lt 300 ]]; do sleep 1; ((count++)); done +# get amount of running sequencers +sequencers_running() { + docker compose -f "$DOCKER_COMPOSE_CFG" config --services | grep -c sequencer +} -NODE_1_KEY="$(cat "$MOUNT_FOLDER/$NODE_2_KEY_FILE" | egrep -v '^$|^WARNING|^\*\*DO NOT')"; -sed "s/^celestia_rpc_auth_token = .*/celestia_rpc_auth_token = \"$NODE_1_KEY\"/g" template.toml | \ - sed "s/^path = .*/path = \"demo_data_2\"/g" | \ - sed "s/^celestia_rpc_address = .*/celestia_rpc_address = \"http:\/\/127.0.0.1:46658\"/g" | \ - sed "s/^bind_port = .*/bind_port = 12346/g" \ - > config_2.toml; \ No newline at end of file +# get the jwt for given sequencer +sequencer_jwt() { + local sequencer_id="${1}" + + cat "$CREDENTIALS_DIR/bridge-${sequencer_id}.jwt" +} + +# get the rpc port the sequencer's celestia node listens on +sequencer_rpc_port() { + local sequencer_id="${1}" + + docker compose -f "$DOCKER_COMPOSE_CFG" port "sequencer-${sequencer_id}" "$CELESTIA_RPC_PORT" +} + +# create a new rollup config with given id +create_rollup_config() { + local id="${1}" + local address + local jwt + + jwt="$(sequencer_jwt "$id")" + address="http://127.0.0.1:$(sequencer_rpc_port "$id")" + storage_path="demo_data_$id" + bind_port="1234${id}" + target_file="rollup_config_${id}.toml" + + # use '|' in sed as the url has '/' + sed \ + -e "s||$jwt|" \ + -e "s|
|$address|" \ + -e "s||$storage_path|" \ + -e "s|12345|$bind_port|" \ + "$CONFIG_TEMPLATE" > "$target_file" +} + +main() { + local amount + local last_idx + + # get amount of running sequencers + amount="$(sequencers_running)" + last_idx=$((amount - 1)) + + # create the config for each rollup + for id in $(seq 0 $last_idx); do + create_rollup_config "$id" + done +} + +main diff --git a/docker/keyring-test/00958f6e5478febcc9119b15f5dc492868cbdc8d.address b/docker/keyring-test/00958f6e5478febcc9119b15f5dc492868cbdc8d.address deleted file mode 100644 index e7e0293e7..000000000 --- a/docker/keyring-test/00958f6e5478febcc9119b15f5dc492868cbdc8d.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wOC0xOCAxNToxNDozOC4wNDYxNzcwMDcgKzAwMDAgVVRDIG09KzAuMDY5MjIxOTE3IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiTW5CSTAxLWp3MlMxd1U5bCJ9.yFz0NVVhsX379F1XQQC69JLmMT5JOFlRUey6_L4XzqUk6qPrdkmy6g.5jY9L2FkpGJ70RU7.Q8hsXaRmXDLw0crcz4lUX1U00Y4Mt52tzXC3_hz6GeXsNJc8zSfZTA9RtCWpbEl4I0-BqYdfS4yjAy39Q86EhxhsmQn7HX5mhJdfXwFTh69-3JNpmNEbWRenSFB1zWuwnfJM0rz-TbA72J0tKu6lsWW9YZNxpUL-Ii6_rTTe-_SVhFbwYqy88z_XnYybnaEFJhPos6wk7gHYz6zsXUYLk0V8TCb08oSstistoXz4KbR7EeePLlw.4xpT0Rk6Bc4LzZrDkq_Q1A \ No newline at end of file diff --git a/docker/keyring-test/6973fe78bba1baa7768cb366102d2fbb5c14ed2e.address b/docker/keyring-test/6973fe78bba1baa7768cb366102d2fbb5c14ed2e.address deleted file mode 100644 index 5f07bf4a9..000000000 --- a/docker/keyring-test/6973fe78bba1baa7768cb366102d2fbb5c14ed2e.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wOC0xOCAxNToxNDozNy45NzA5NzQ5NjUgKzAwMDAgVVRDIG09KzAuMDY4MTc4MDg1IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiWGh6OTQ1UGhad29xU0JreSJ9.vzf7oKrTeEfCcw5gzPVL2D7aTLkzbZfBcB0W3haILTp5r2MBrV2-iQ.48VwpB_BvhYUFhs4.FwpwIIDrQb6capMXtJYtUNcFMX6jpGwILxweWaaIScQkRT7S3wkQnIg5lrYnh9Dnt_jbkQ3QgdqrdyA5YNMWGYQ2FQbpV1M7YVQJ9VEZXbws6R61SDQQMyfDrWUHkmdrtd-s1F9G4g5wThN3YOUOdgugMxpal5m-X2nUuRqMNzKN3leeYS_xuh5KPzOJ-ohdIISu6LfCg5Kab36ncJoYxfmurDID2B6Yy6NXAv5stQSlirzvWrk._EBC1TTZUhKwFCodNdWCkQ \ No newline at end of file diff --git a/docker/keyring-test/779d8e06d4441d25530fb5e76c928976ff369b4b.address b/docker/keyring-test/779d8e06d4441d25530fb5e76c928976ff369b4b.address deleted file mode 100644 index fa91aec5e..000000000 --- a/docker/keyring-test/779d8e06d4441d25530fb5e76c928976ff369b4b.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNi0wNSAwOToxMTo1My40OTQ4NDQ4MzYgKzAwMDAgVVRDIG09KzExLjAwMzk0NDI1NSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6Im1RNi03eFpYYlI5REIzMVIifQ.r8PyyoLcrQqziDGTX3aysFEtR57UyfzmIAMAsuGDz53SgbjMepmqaQ.OqrZtJXHdYE3xp9n.5TMEqd_eyHFTWzcJDzDgcEajOfkN2nHSzJfhDHfGHvk7uu61sZRM1iaqO4-F2nIumILtX1L8j5q31AvtegfZnYCkgqkTi7i1Has-IvFMo6bA1Jj5MYofLWLwoW1A7TCmCN4IEFnoE743Z3xfDidqsXfyp30YTUpnWTxignxUyvcRGO_DFeAFYMOq6rTJMm2nGYDLbxpOO5DtsYNrx13kIDQHw-kU4JMPpPsqFGeb4DapqMCSM2Hu1Atw.2eYgHAYuNe3KMgDWPCItkA \ No newline at end of file diff --git a/docker/keyring-test/a73f3d1c9988502b80e6082cf70a0f352baec2cd.address b/docker/keyring-test/a73f3d1c9988502b80e6082cf70a0f352baec2cd.address deleted file mode 100644 index 567c584ab..000000000 --- a/docker/keyring-test/a73f3d1c9988502b80e6082cf70a0f352baec2cd.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wOC0xOCAxNToxNjo0NC44NzIxOTk2MzUgKzAwMDAgVVRDIG09KzAuMTAwMzM5NDYwIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiWVp2V3E1VEp1UnlCTFVraiJ9.zPIhQ_XLX81N7xjbmnjHAhuiG9Mm6szNmJ-e_sdklGlMPCia_kyi7w.mKDtRZg7cAcqKM9A.tcHEUzMh4UvyZphj1vwnQfLVX-xCzh0NtpEzVF3qF-kduy7uPrkLAYalgoWvqRF9b8l1ku7EmVuMoPEYglWRKCauiMAoBmSvljJJ1hdA3VRkcEtauk56FiFXURgAdb7Noeq56FDJHyGH2QQfUXBaB9hCBB60sDYvb3YWONyvQR8X6vGZ119qSekP05ol9p8VwZNfNujnesv6O_ER3lhDg4ZPmyvgC7Tt2Hh-M628oITCdSCjtoo_scIGCcIVSg.XySLfGathevNdEtK1nzoeg \ No newline at end of file diff --git a/docker/keyring-test/my_celes_key.info b/docker/keyring-test/my_celes_key.info deleted file mode 100644 index 21e24cb7e..000000000 --- a/docker/keyring-test/my_celes_key.info +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wOC0xOCAxNToxNjo0NC44NzA4NzQzMDIgKzAwMDAgVVRDIG09KzAuMDk5MDE0MTI2IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoic1l2UnRGQjVPS21mOHBtWiJ9.eJ1kkpI4FjAAJKcKiJAFHrBH1TKOaIHFiPQv_ScKJFHE7xU02LaZ1w.u5eKGvbYWkgINQkg.H4oRpMcC6qi3DimQOfVt2-8gpaN6ru-6SUSMqtOls8HhopQ0M-hpcdJbzK3OAJyLZ_z5WOLVsFXQLTCf6sdjbkAXdlGn2Hps660cxyDnuy3bcoAvYJAyagxrSSZVib0sfdrYYzVVl-VS9wrCe5hvka4LBzEXsFIEoxuQhRqC228W71hniKX1NgKXL87HURjUX42pzNk7SyrvTI30ngeuIQGQ3LecDsW2OKQ2uh3a799RIz1howGmtAIQGnV_xNI2-_RqX1UsM-KUwikNPZXBnLigjtPLLntj6eBTcxyvFznSx75OtxPhRMnNqm0ARYN3Zuqt7wrwVCkrRw_PpwGK331LuTzg02zVjTsM1YMgEn196MFWXM8z25qaPFoZFUFwmhUnCm8SZDjz8nAGybNTw0ZV3TwjyE8e8V4xrM4zNsdXqQgQCcDdPW460XNET2csW4a99VSBXYME2H8Cwv9g.4tmPQ3IF0FxwvRytzqH31g \ No newline at end of file diff --git a/docker/keyring-test/node1.info b/docker/keyring-test/node1.info deleted file mode 100644 index 2562e47e2..000000000 --- a/docker/keyring-test/node1.info +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wOC0xOCAxNToxNDozNy45Njk0MDY2MzIgKzAwMDAgVVRDIG09KzAuMDY2NjA5NzUxIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiVk1leDU4TEhGN3dDbVJMQyJ9.Kz4IkUEWfsCYc6C27WYHt-jCbiLad1gbPUQIihV8s5Gyl_WLFeWBug.swUUp4n6eURByky1.E3zebuaNE-1M6SNPe0ZDz_zaKpIlMIfU2OtAczY7HTrOh6G4D5cJmS6679ZnhctpmRKKgShFz_3ZxeCgrADEM_qgWw8uhnEsVCQDglw1W2s5NdF8-5E0F8I2Cp22SR9jpJ2Ef3XTt4jHZihW_cX8E3Ra4oSHov4De6v9GD-ThbgTuTSmpSHzeFHI7YKyKzzyqSXuxRyh5TeHg1vcuXjce3wjlwftg6w8E0l9HRSBiIGp6sE4Zi0uKOirkRP2E1_IREIab455zNp7ME0zn1JkzsRP-Y3Wpyyezoj5ua_mGcFKIHy6r9NYNfwjX4Bhd4vXZZB21sZQny1TllS8qAaxCj2pkGFts7aA1lIwzZNAQBdbfvWCFlFygisKkoz6DxG_shpO_oY6YpvMebKQvZsBKitcllz3nsQ7gleTjCNmyZfyP1bnnrTwPLKt8q0.IeMg-RFNJ13NHZIJSMuwxw \ No newline at end of file diff --git a/docker/keyring-test/node2.info b/docker/keyring-test/node2.info deleted file mode 100644 index a92b571a3..000000000 --- a/docker/keyring-test/node2.info +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wOC0xOCAxNToxNDozOC4wNDQ2ODM3MTUgKzAwMDAgVVRDIG09KzAuMDY3NzI4NTg0IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiS1JvakRIUW5YRmdfM19pQyJ9.dj-sZHrMz0a5H1mf8j_VDV1GRQXjOa_HTKlGnkuKrDB4SmS16DSxSw.ODdL_jac1zwFhV1G.fzzpZhyeDEJno_iupe5xOux8thDW_t_4VOKynsEMpgf6GZnQLFaykRtpoHyLv8wwBY4GBVYJKQa7JSm9BTihEMwjUcVhZEh0seRv9hhK6lKJJQ5VV5n4NvzXdgt_scou9hn99z34wZRlEGT0bM-vK577rhX-orr6sGZpFTB-uy2KBSIN60zDOJHBzSnMRj9Euyh_5cVzAqt-PL_OBSNlThZwypTOHqB_4tKcgYTRTVBgYc0XjeAGqmEeqQ6I4dhqyewGjKcsFxaQe7kz1UgQyK5t-b69JmY49wRKB_xYL7Ld8A5fRFRVqE_wKwZ9xwabLzqKaxobm8LZGum7VVdMoIZyJ7DnNVLVrNbwfS5Pt0Fy7d_rKEHH0pbjCz1TeY-BGP1OW1JwIYHh2iR8qr4kQTn0RYnoQSrM_sxNLZG6P8UnTK3LBZKwu0nD6ZY.ZRNFW5_65Qv8L-_dGHllmA \ No newline at end of file diff --git a/docker/keyring-test/validator.info b/docker/keyring-test/validator.info deleted file mode 100644 index 8490e5dbc..000000000 --- a/docker/keyring-test/validator.info +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNi0wNSAwOToxMTo1My40NTIyNjg3NTIgKzAwMDAgVVRDIG09KzEwLjk2MTM2ODUwNSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6InpjZDlSZ1NvNHFWZWNoa0MifQ.qGafV2C7i9Zqa3TW_ti874R4FjevWRxqCspsRcOPyM3ZrUwOuSwX2w.6vFFL7LFJgP2LJIC.K9rAuw1qq9wU91AipIb_11LZr7RpQX2s3JJspKMC3hi5ou9aZqCdY2z9AOcSiA7Ynnc-bnoG1dBuysUILGZXas9OGiq7KUgAEEAGENeA3jF3kIQ7VCmrL-OgmsgBj17WT2f9Fr4WskX_5HoQQxxuCmHk70eGdBiZSFYAnII5XMG9skeGyn5I4cwV1NCoU3ZRN5EufuLFGsS4wSk2SgHp2nnegwG-EIDo1W5Ci-GFE2hoNW2vxGVyoc9OCPQllU1f_2WUe7MhW74TfHqqbE_xvvoIdl1vWZYEONmku46O2iu00GuWWLleJGy9XaBrvkOZ-gqB2fXWZAX7fqXwMiKiFidjI5RINeUGBaQjyi0LoGDHQsGXsIZ0xRF1G1Z-NrqwcSTZX63naRMpLq13K0NHA9DRYeFrP_Vi2qO47fNU9Vv-Cmpsr8FmET7FQEN8cq6XG07ZbtNYLlA.m4DGni1Ma4vlfuwXUvEnUw \ No newline at end of file diff --git a/docker/rollup_config_0.toml b/docker/rollup_config_0.toml new file mode 100644 index 000000000..33d79a284 --- /dev/null +++ b/docker/rollup_config_0.toml @@ -0,0 +1,15 @@ +[da] +celestia_rpc_auth_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJwdWJsaWMiLCJyZWFkIiwid3JpdGUiLCJhZG1pbiJdfQ.Ie5-ulwuVPjzs6ahngRXunEsU4oLV46-AYfbJLz94Pw" +celestia_rpc_address = "http://127.0.0.1:0.0.0.0:26658" +max_celestia_response_body_size = 104_857_600 +celestia_rpc_timeout_seconds = 60 + +[storage] +path = "demo_data_0" + +[runner] +start_height = 1 + +[runner.rpc_config] +bind_host = "127.0.0.1" +bind_port = 12340 diff --git a/docker/run-bridge.sh b/docker/run-bridge.sh new file mode 100755 index 000000000..e493fe42c --- /dev/null +++ b/docker/run-bridge.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +# be strict +set -euo pipefail + +# Name for this node, with suffix taken from the first argument +# or `bridge-0` if not provided +NODE_NAME="bridge-${1:-0}" +# a private local network +P2P_NETWORK="private" +# a bridge node configuration directory +CONFIG_DIR="$CELESTIA_HOME/.celestia-bridge-$P2P_NETWORK" +# directory and the files shared with the validator node +CREDENTIALS_DIR="/credentials" +# node credentials +NODE_KEY_FILE="$CREDENTIALS_DIR/$NODE_NAME.key" +NODE_JWT_FILE="$CREDENTIALS_DIR/$NODE_NAME.jwt" +# directory where validator will write the genesis hash +GENESIS_DIR="/genesis" +GENESIS_HASH_FILE="$GENESIS_DIR/genesis_hash" + +# Wait for the validator to set up and provision us via shared dirs +wait_for_provision() { + echo "Waiting for the validator node to start" + while [[ ! ( -e "$GENESIS_HASH_FILE" && -e "$NODE_KEY_FILE" ) ]]; do + sleep 0.5 + done + + sleep 1 # let the validator finish setup + echo "Validator is ready" +} + +# Import the test account key shared by the validator +import_shared_key() { + echo "password" | cel-key import "$NODE_NAME" "$NODE_KEY_FILE" \ + --keyring-backend="test" \ + --p2p.network "$P2P_NETWORK" \ + --node.type bridge +} + +add_trusted_genesis() { + local genesis_hash + + # Read the hash of the genesis block + genesis_hash="$(cat "$GENESIS_HASH_FILE")" + # and make it trusted in the node's config + echo "Trusting a genesis: $genesis_hash" + sed -i'.bak' "s/TrustedHash = .*/TrustedHash = $genesis_hash/" "$CONFIG_DIR/config.toml" +} + +write_jwt_token() { + echo "Saving jwt token to $NODE_JWT_FILE" + celestia bridge auth admin --p2p.network "$P2P_NETWORK" > "$NODE_JWT_FILE" +} + +main() { + # Wait for a validator + wait_for_provision + # Import the key with the coins + import_shared_key + # Initialize the bridge node + celestia bridge init --p2p.network "$P2P_NETWORK" + # Trust the private blockchain + add_trusted_genesis + # Update the JWT token + write_jwt_token + # Start the bridge node + echo "Configuration finished. Running a bridge node..." + celestia bridge start \ + --core.ip validator \ + --keyring.accname "$NODE_NAME" \ + --p2p.network "$P2P_NETWORK" +} + +main diff --git a/docker/run-validator.sh b/docker/run-validator.sh new file mode 100755 index 000000000..68984a25a --- /dev/null +++ b/docker/run-validator.sh @@ -0,0 +1,163 @@ +#!/bin/bash + +# be strict +set -euo pipefail + +# Amount of bridge nodes to setup, taken from the first argument +# or 1 if not provided +BRIDGE_COUNT="${1:-1}" +# a private local network +P2P_NETWORK="private" +# a validator node configuration directory +CONFIG_DIR="$CELESTIA_HOME/.celestia-app" +# the names of the keys +NODE_NAME=validator-0 +# amounts of the coins for the keys +BRIDGE_COINS="200000000000000utia" +VALIDATOR_COINS="1000000000000000utia" +# a directory and the files shared with the bridge nodes +CREDENTIALS_DIR="/credentials" +# directory where validator will write the genesis hash +GENESIS_DIR="/genesis" +GENESIS_HASH_FILE="$GENESIS_DIR/genesis_hash" + +# Get the address of the node of given name +node_address() { + local node_name="$1" + local node_address + + node_address=$(celestia-appd keys show "$node_name" -a --keyring-backend="test") + echo "$node_address" +} + +# Waits for the given block to be created and returns it's hash +wait_for_block() { + local block_num="$1" + local block_hash="" + + # Wait for the block to be created + while [[ -z "$block_hash" ]]; do + # `|| echo` fallbacks to an empty string in case it's not ready + block_hash="$(celestia-appd query block "$block_num" 2>/dev/null | jq '.block_id.hash' || echo)" + sleep 0.5 + done + + echo "$block_hash" +} + +# Saves the hash of the genesis node and the keys funded with the coins +# to the directory shared with the bridge node +provision_bridge_nodes() { + local genesis_hash + local last_node_idx=$((BRIDGE_COUNT - 1)) + + # Save the genesis hash for the bridge + genesis_hash=$(wait_for_block 1) + echo "Saving a genesis hash to $GENESIS_HASH_FILE" + echo "$genesis_hash" > "$GENESIS_HASH_FILE" + + # Get or create the keys for bridge nodes + for node_idx in $(seq 0 "$last_node_idx"); do + local bridge_name="bridge-$node_idx" + local key_file="$CREDENTIALS_DIR/$bridge_name.key" + local addr_file="$CREDENTIALS_DIR/$bridge_name.addr" + + if [ ! -e "$key_file" ]; then + # if key don't exist yet, then create and export it + # create a new key + echo "Creating a new keys for the $bridge_name" + celestia-appd keys add "$bridge_name" --keyring-backend "test" + # export it + echo "password" | celestia-appd keys export "$bridge_name" 2> "$key_file" + # export associated address + node_address "$bridge_name" > "$addr_file" + else + # otherwise, just import it + echo "password" | celestia-appd keys import "$bridge_name" "$key_file" \ + --keyring-backend="test" + fi + done + + # Transfer the coins to bridge nodes addresses + # Coins transfer need to be after validator registers EVM address, which happens in block 2. + # see `setup_private_validator` + local start_block=2 + + for node_idx in $(seq 0 "$last_node_idx"); do + # TODO: create an issue in celestia-app and link it here + # we need to transfer the coins for each node in separate + # block, or the signing of all but the first one will fail + wait_for_block $((start_block + node_idx)) + + local bridge_name="bridge-$node_idx" + local bridge_address + + bridge_address=$(node_address "$bridge_name") + + echo "Transfering $BRIDGE_COINS coins to the $bridge_name" + echo "y" | celestia-appd tx bank send \ + "$NODE_NAME" \ + "$bridge_address" \ + "$BRIDGE_COINS" \ + --fees 21000utia + done + + # !! This is the last log entry that indicates the setup has finished for all the nodes + echo "Provisioning finished." +} + +# Set up the validator for a private alone network. +# Based on +# https://github.com/celestiaorg/celestia-app/blob/main/scripts/single-node.sh +setup_private_validator() { + local validator_addr + + # Initialize the validator + celestia-appd init "$P2P_NETWORK" --chain-id "$P2P_NETWORK" + # Derive a new private key for the validator + celestia-appd keys add "$NODE_NAME" --keyring-backend="test" + validator_addr=$(node_address "$NODE_NAME") + # Create a validator's genesis account for the genesis.json with an initial bag of coins + celestia-appd add-genesis-account "$validator_addr" "$VALIDATOR_COINS" + # Generate a genesis transaction that creates a validator with a self-delegation + celestia-appd gentx "$NODE_NAME" 5000000000utia \ + --keyring-backend="test" \ + --chain-id "$P2P_NETWORK" + # Collect the genesis transactions and form a genesis.json + celestia-appd collect-gentxs + + # Set proper defaults and change ports + # If you encounter: `sed: -I or -i may not be used with stdin` on MacOS you can mitigate by installing gnu-sed + # https://gist.github.com/andre3k1/e3a1a7133fded5de5a9ee99c87c6fa0d?permalink_comment_id=3082272#gistcomment-3082272 + sed -i'.bak' 's|"tcp://127.0.0.1:26657"|"tcp://0.0.0.0:26657"|g' "$CONFIG_DIR/config/config.toml" + sed -i'.bak' 's|"null"|"kv"|g' "$CONFIG_DIR/config/config.toml" + + # Register the validator EVM address in background + { + # wait for the genesis + wait_for_block 1 + + # private key: da6ed55cb2894ac2c9c10209c09de8e8b9d109b910338d5bf3d747a7e1fc9eb9 + celestia-appd tx qgb register \ + "$(celestia-appd keys show "$NODE_NAME" --bech val -a)" \ + 0x966e6f22781EF6a6A82BBB4DB3df8E225DfD9488 \ + --from "$NODE_NAME" \ + --fees 30000utia \ + -b block \ + -y + + echo "Registered validator's EVM address" + } & +} + +main() { + # Configure stuff + setup_private_validator + # Spawn a job to provision a bridge node later + provision_bridge_nodes & + # Start the celestia-app + echo "Configuration finished. Running a validator node..." + celestia-appd start --api.enable +} + +main diff --git a/docker/template.toml b/docker/template.toml index 57280b6a0..ed2b70ca9 100644 --- a/docker/template.toml +++ b/docker/template.toml @@ -1,14 +1,14 @@ [da] -celestia_rpc_auth_token = "" -celestia_rpc_address = "http://127.0.0.1:26658" +celestia_rpc_auth_token = "" +celestia_rpc_address = "
" max_celestia_response_body_size = 104_857_600 celestia_rpc_timeout_seconds = 60 [storage] -path = "demo_data" +path = "" [runner] -start_height = 1 +start_height = 3 [runner.rpc_config] bind_host = "127.0.0.1" diff --git a/examples/const-rollup-config/src/lib.rs b/examples/const-rollup-config/src/lib.rs index 8c1ecd54f..a220febcf 100644 --- a/examples/const-rollup-config/src/lib.rs +++ b/examples/const-rollup-config/src/lib.rs @@ -1,8 +1,8 @@ /// The namespace used by the rollup to store its data. This is a raw slice of 8 bytes. /// The rollup stores its data in the namespace b"sov-test" on Celestia. Which in this case is encoded using the /// ascii representation of each character. -pub const ROLLUP_NAMESPACE_RAW: [u8; 8] = [115, 111, 118, 45, 116, 101, 115, 116]; +pub const ROLLUP_NAMESPACE_RAW: [u8; 10] = [0, 0, 115, 111, 118, 45, 116, 101, 115, 116]; /// The DA address of the sequencer (for now we use a centralized sequencer) in the tests. /// Here this is the address of the sequencer on the celestia blockchain. -pub const SEQUENCER_DA_ADDRESS: &str = "celestia1w7wcupk5gswj25c0khnkey5fwmlndx6t5aarmk"; +pub const SEQUENCER_DA_ADDRESS: &str = "celestia1a68m2l85zn5xh0l07clk4rfvnezhywc53g8x7s"; diff --git a/examples/demo-prover/Cargo.lock b/examples/demo-prover/Cargo.lock deleted file mode 100644 index cafc0d785..000000000 --- a/examples/demo-prover/Cargo.lock +++ /dev/null @@ -1,4872 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addchain" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "addr2line" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" -dependencies = [ - "cpp_demangle", - "fallible-iterator", - "gimli", - "memmap2", - "object", - "rustc-demangle", - "smallvec", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" -dependencies = [ - "memchr", -] - -[[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.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is-terminal", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" - -[[package]] -name = "anstyle-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "anyhow" -version = "1.0.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" - -[[package]] -name = "arc-swap" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-trait" -version = "0.1.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "autotools" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8da1805e028a172334c3b680f93e71126f2327622faef2ec3d893c0a4ad77" -dependencies = [ - "cc", -] - -[[package]] -name = "backtrace" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bcs" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd3ffe8b19a604421a5d461d4a70346223e535903fbc3067138bddbebddcf77" -dependencies = [ - "serde", - "thiserror", -] - -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - -[[package]] -name = "beef" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" -dependencies = [ - "serde", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bindgen" -version = "0.65.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" -dependencies = [ - "bitflags 1.3.2", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "prettyplease 0.2.10", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.29", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" - -[[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 = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[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 = "bonsai-sdk" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94478e373742b9d1de02e13399633348e5b230dfe6364f65e80056c7df7438c5" -dependencies = [ - "reqwest", - "serde", - "thiserror", -] - -[[package]] -name = "borsh" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" -dependencies = [ - "borsh-derive", - "bytes", - "hashbrown 0.13.2", -] - -[[package]] -name = "borsh-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" -dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", - "proc-macro-crate 0.1.5", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "bstr" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "bumpalo" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" - -[[package]] -name = "bytemuck" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" -dependencies = [ - "serde", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.11+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "camino" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cc" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" -dependencies = [ - "jobserver", - "libc", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "time 0.1.45", - "wasm-bindgen", - "winapi", -] - -[[package]] -name = "clang-sys" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "4.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0827b011f6f8ab38590295339817b0d26f344aa4932c3ced71b45b0c54b4a9" -dependencies = [ - "clap_builder", - "clap_derive", - "once_cell", -] - -[[package]] -name = "clap_builder" -version = "4.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9441b403be87be858db6a23edb493e7f694761acdc3343d5a0fcaafd304cbc9e" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "clap_lex" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "const-oid" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" - -[[package]] -name = "const-rollup-config" -version = "0.2.0" - -[[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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "cpp_demangle" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "cpufeatures" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" -dependencies = [ - "autocfg", - "cfg-if", - "crossbeam-utils", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-bigint" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" -dependencies = [ - "rand_core", - "subtle", -] - -[[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 = "csv" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626ae34994d3d8d668f4269922248239db4ae42d538b14c398b74a52208e8086" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" -dependencies = [ - "memchr", -] - -[[package]] -name = "curve25519-dalek" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f711ade317dd348950a9910f81c5947e3d8907ebd2b83f76203ff1807e6a2bc2" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "platforms", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "curve25519-dalek-ng" -version = "4.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core", - "subtle-ng", - "zeroize", -] - -[[package]] -name = "demo-stf" -version = "0.2.0" -dependencies = [ - "anyhow", - "borsh", - "clap", - "const-rollup-config", - "hex", - "jsonrpsee 0.18.2", - "serde", - "serde_json", - "sov-accounts", - "sov-bank", - "sov-blob-storage", - "sov-chain-state", - "sov-cli", - "sov-modules-api", - "sov-modules-stf-template", - "sov-rollup-interface", - "sov-sequencer", - "sov-sequencer-registry", - "sov-state", - "sov-stf-runner", - "sov-value-setter", - "tokio", - "toml 0.8.0", - "tracing", -] - -[[package]] -name = "der" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" -dependencies = [ - "const-oid", - "zeroize", -] - -[[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_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 1.0.109", -] - -[[package]] -name = "destructure_traitobject" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7" - -[[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 0.10.4", - "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-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "downcast-rs" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" - -[[package]] -name = "dyn-clone" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" - -[[package]] -name = "ed25519" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963" -dependencies = [ - "pkcs8", - "serde", - "signature", -] - -[[package]] -name = "ed25519-consensus" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" -dependencies = [ - "curve25519-dalek-ng", - "hex", - "rand_core", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "ed25519-dalek" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core", - "serde", - "sha2 0.10.7", - "zeroize", -] - -[[package]] -name = "either" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" - -[[package]] -name = "elf" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b183d6ce6ca4cf30e3db37abf5b52568b5f9015c97d9fbdd7026aa5dcdd758" - -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "encoding_rs" -version = "0.8.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "env_logger" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "erased-serde" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da96524cc884f6558f1769b6c46686af2fe8e8b4cd253bd5a3cdba8181b8e070" -dependencies = [ - "serde", -] - -[[package]] -name = "errno" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "eyre" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[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", - "num-integer", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "fiat-crypto" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "flex-error" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" -dependencies = [ - "eyre", - "paste", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -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.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-timer" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" -dependencies = [ - "gloo-timers", - "send_wrapper", -] - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "gimli" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" -dependencies = [ - "fallible-iterator", - "stable_deref_trait", -] - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "globset" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1391ab1f92ffcc08911957149833e682aa3fe252b9f45f966d2ef972274c97df" -dependencies = [ - "aho-corasick", - "bstr", - "fnv", - "log", - "regex", -] - -[[package]] -name = "gloo-net" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9902a044653b26b99f7e3693a42f171312d9be8b26b5697bd1e43ad1f8a35e10" -dependencies = [ - "futures-channel", - "futures-core", - "futures-sink", - "gloo-utils", - "js-sys", - "pin-project", - "serde", - "serde_json", - "thiserror", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "gloo-utils" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037fcb07216cb3a30f7292bd0176b050b7b9a052ba830ef7d5d65f6dc64ba58e" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "h2" -version = "0.3.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 1.9.3", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[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.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "0.14.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" -dependencies = [ - "http", - "hyper", - "log", - "rustls 0.20.8", - "rustls-native-certs", - "tokio", - "tokio-rustls 0.23.4", - "webpki-roots 0.22.6", -] - -[[package]] -name = "hyper-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" -dependencies = [ - "futures-util", - "http", - "hyper", - "log", - "rustls 0.21.5", - "rustls-native-certs", - "tokio", - "tokio-rustls 0.24.1", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows", -] - -[[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 = "ics23" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9e8f569c5cc88e08b8d076dc207e0748aa1f52d4b84910ec919c8f2bed6ea7" -dependencies = [ - "anyhow", - "bytes", - "hex", - "pbjson", - "prost 0.11.9", - "ripemd", - "serde", - "sha2 0.10.7", - "sha3", -] - -[[package]] -name = "idna" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" -dependencies = [ - "equivalent", - "hashbrown 0.14.0", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "inventory" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b1d6b4b9fb75fc419bdef998b689df5080a32931cb3395b86202046b56a9ea" - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys", -] - -[[package]] -name = "ipnet" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" - -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi", - "rustix 0.38.4", - "windows-sys", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "jmt" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e49c5d2c13e15f77f22cee3df3dc822b46051b217112035d72687cb57a9cbde" -dependencies = [ - "anyhow", - "borsh", - "digest 0.10.7", - "hashbrown 0.13.2", - "hex", - "ics23", - "itertools", - "mirai-annotations", - "num-derive 0.3.3", - "num-traits", - "serde", - "sha2 0.10.7", - "thiserror", - "tracing", -] - -[[package]] -name = "jobserver" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonrpsee" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d291e3a5818a2384645fd9756362e6d89cf0541b0b916fa7702ea4a9833608e" -dependencies = [ - "jsonrpsee-core 0.16.2", - "jsonrpsee-http-client 0.16.2", - "jsonrpsee-server 0.16.2", - "jsonrpsee-types 0.16.2", -] - -[[package]] -name = "jsonrpsee" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1822d18e4384a5e79d94dc9e4d1239cfa9fad24e55b44d2efeff5b394c9fece4" -dependencies = [ - "jsonrpsee-client-transport", - "jsonrpsee-core 0.18.2", - "jsonrpsee-http-client 0.18.2", - "jsonrpsee-proc-macros", - "jsonrpsee-server 0.18.2", - "jsonrpsee-types 0.18.2", - "jsonrpsee-wasm-client", - "jsonrpsee-ws-client", - "tracing", -] - -[[package]] -name = "jsonrpsee-client-transport" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11aa5766d5c430b89cb26a99b88f3245eb91534be8126102cea9e45ee3891b22" -dependencies = [ - "futures-channel", - "futures-util", - "gloo-net", - "http", - "jsonrpsee-core 0.18.2", - "pin-project", - "rustls-native-certs", - "soketto", - "thiserror", - "tokio", - "tokio-rustls 0.24.1", - "tokio-util", - "tracing", - "webpki-roots 0.23.1", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e70b4439a751a5de7dd5ed55eacff78ebf4ffe0fc009cb1ebb11417f5b536b" -dependencies = [ - "anyhow", - "arrayvec", - "async-trait", - "beef", - "futures-channel", - "futures-util", - "globset", - "hyper", - "jsonrpsee-types 0.16.2", - "parking_lot 0.12.1", - "rand", - "rustc-hash", - "serde", - "serde_json", - "soketto", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c6832a55f662b5a6ecc844db24b8b9c387453f923de863062c60ce33d62b81" -dependencies = [ - "anyhow", - "async-lock", - "async-trait", - "beef", - "futures-timer", - "futures-util", - "globset", - "hyper", - "jsonrpsee-types 0.18.2", - "parking_lot 0.12.1", - "rand", - "rustc-hash", - "serde", - "serde_json", - "soketto", - "thiserror", - "tokio", - "tokio-stream", - "tracing", - "wasm-bindgen-futures", -] - -[[package]] -name = "jsonrpsee-http-client" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc345b0a43c6bc49b947ebeb936e886a419ee3d894421790c969cc56040542ad" -dependencies = [ - "async-trait", - "hyper", - "hyper-rustls 0.23.2", - "jsonrpsee-core 0.16.2", - "jsonrpsee-types 0.16.2", - "rustc-hash", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee-http-client" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1705c65069729e3dccff6fd91ee431d5d31cabcf00ce68a62a2c6435ac713af9" -dependencies = [ - "async-trait", - "hyper", - "hyper-rustls 0.24.1", - "jsonrpsee-core 0.18.2", - "jsonrpsee-types 0.18.2", - "serde", - "serde_json", - "thiserror", - "tokio", - "tower", - "tracing", -] - -[[package]] -name = "jsonrpsee-proc-macros" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6027ac0b197ce9543097d02a290f550ce1d9432bf301524b013053c0b75cc94" -dependencies = [ - "heck", - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "jsonrpsee-server" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb69dad85df79527c019659a992498d03f8495390496da2f07e6c24c2b356fc" -dependencies = [ - "futures-channel", - "futures-util", - "http", - "hyper", - "jsonrpsee-core 0.16.2", - "jsonrpsee-types 0.16.2", - "serde", - "serde_json", - "soketto", - "tokio", - "tokio-stream", - "tokio-util", - "tower", - "tracing", -] - -[[package]] -name = "jsonrpsee-server" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f06661d1a6b6e5b85469dc9c29acfbb9b3bb613797a6fd10a3ebb8a70754057" -dependencies = [ - "futures-util", - "hyper", - "jsonrpsee-core 0.18.2", - "jsonrpsee-types 0.18.2", - "serde", - "serde_json", - "soketto", - "tokio", - "tokio-stream", - "tokio-util", - "tower", - "tracing", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd522fe1ce3702fd94812965d7bb7a3364b1c9aba743944c5a00529aae80f8c" -dependencies = [ - "anyhow", - "beef", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5bf6c75ce2a4217421154adfc65a24d2b46e77286e59bba5d9fa6544ccc8f4" -dependencies = [ - "anyhow", - "beef", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "jsonrpsee-wasm-client" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34e6ea7c6d862e60f8baebd946c037b70c6808a4e4e31e792a4029184e3ce13a" -dependencies = [ - "jsonrpsee-client-transport", - "jsonrpsee-core 0.18.2", - "jsonrpsee-types 0.18.2", -] - -[[package]] -name = "jsonrpsee-ws-client" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64b2589680ba1ad7863f279cd2d5083c1dc0a7c0ea959d22924553050f8ab9f" -dependencies = [ - "http", - "jsonrpsee-client-transport", - "jsonrpsee-core 0.18.2", - "jsonrpsee-types 0.18.2", -] - -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "lazy-regex" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff63c423c68ea6814b7da9e88ce585f793c87ddd9e78f646970891769c8235d4" -dependencies = [ - "lazy-regex-proc_macros", - "once_cell", - "regex", -] - -[[package]] -name = "lazy-regex-proc_macros" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8edfc11b8f56ce85e207e62ea21557cfa09bb24a8f6b04ae181b086ff8611c22" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn 1.0.109", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "libm" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" - -[[package]] -name = "librocksdb-sys" -version = "0.11.0+8.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e" -dependencies = [ - "bindgen", - "bzip2-sys", - "cc", - "glob", - "libc", - "libz-sys", - "lz4-sys", - "zstd-sys", -] - -[[package]] -name = "libz-sys" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" -dependencies = [ - "serde", -] - -[[package]] -name = "log-mdc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" - -[[package]] -name = "log4rs" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d36ca1786d9e79b8193a68d480a0907b612f109537115c6ff655a3a1967533fd" -dependencies = [ - "anyhow", - "arc-swap", - "chrono", - "derivative", - "fnv", - "humantime", - "libc", - "log", - "log-mdc", - "parking_lot 0.12.1", - "serde", - "serde-value", - "serde_json", - "serde_yaml", - "thiserror", - "thread-id", - "typemap-ors", - "winapi", -] - -[[package]] -name = "lz4-sys" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "matrixmultiply" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77" -dependencies = [ - "autocfg", - "rawpointer", -] - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - -[[package]] -name = "methods" -version = "0.2.0" -dependencies = [ - "risc0-build", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", -] - -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - -[[package]] -name = "multimap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndarray" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "rawpointer", - "rayon", -] - -[[package]] -name = "nmt-rs" -version = "0.1.0" -source = "git+https://github.com/Sovereign-Labs/nmt-rs.git?rev=dd37588444fca72825d11fe4a46838f66525c49f#dd37588444fca72825d11fe4a46838f66525c49f" -dependencies = [ - "borsh", - "bytes", - "serde", - "sha2 0.10.7", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[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-complex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num-derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6a0fd4f737c707bd9086cc16c925f294943eb62eb71499e9fd4cf71f8b9f4e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" -dependencies = [ - "flate2", - "memchr", - "ruzstd", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "openssl" -version = "0.10.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "foreign-types", - "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.29", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" -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 = "ordered-float" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" -dependencies = [ - "num-traits", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core 0.9.8", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.3.5", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "pbjson" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048f9ac93c1eab514f9470c4bc8d97ca2a0a236b84f45cc19d69a59fc11467f6" -dependencies = [ - "base64 0.13.1", - "serde", -] - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "petgraph" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" -dependencies = [ - "fixedbitset", - "indexmap 1.9.3", -] - -[[package]] -name = "pin-project" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] -name = "platforms" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "prettyplease" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" -dependencies = [ - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "prettyplease" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92139198957b410250d43fad93e630d956499a625c527eda65175c8680f83387" -dependencies = [ - "proc-macro2", - "syn 2.0.29", -] - -[[package]] -name = "prettytable-rs" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea25e07510aa6ab6547308ebe3c036016d162b8da920dbb079e3ba8acf3d95a" -dependencies = [ - "csv", - "encode_unicode", - "is-terminal", - "lazy_static", - "term", - "unicode-width", -] - -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml 0.5.11", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.14", -] - -[[package]] -name = "proc-macro2" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "prometheus" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" -dependencies = [ - "cfg-if", - "fnv", - "lazy_static", - "memchr", - "parking_lot 0.12.1", - "thiserror", -] - -[[package]] -name = "prost" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" -dependencies = [ - "bytes", - "prost-derive 0.11.9", -] - -[[package]] -name = "prost" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa8473a65b88506c106c28ae905ca4a2b83a2993640467a41bb3080627ddfd2c" -dependencies = [ - "bytes", - "prost-derive 0.12.0", -] - -[[package]] -name = "prost-build" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" -dependencies = [ - "bytes", - "heck", - "itertools", - "lazy_static", - "log", - "multimap", - "petgraph", - "prettyplease 0.1.25", - "prost 0.11.9", - "prost-types 0.11.9", - "regex", - "syn 1.0.109", - "tempfile", - "which", -] - -[[package]] -name = "prost-build" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d3e647e9eb04ddfef78dfee2d5b3fefdf94821c84b710a3d8ebc89ede8b164" -dependencies = [ - "bytes", - "heck", - "itertools", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease 0.2.10", - "prost 0.12.0", - "prost-types 0.12.0", - "regex", - "syn 2.0.29", - "tempfile", - "which", -] - -[[package]] -name = "prost-derive" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "prost-derive" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56075c27b20ae524d00f247b8a4dc333e5784f889fe63099f8e626bc8d73486c" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "prost-types" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" -dependencies = [ - "prost 0.11.9", -] - -[[package]] -name = "prost-types" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cebe0a918c97f86c217b0f76fd754e966f8b9f41595095cf7d74cb4e59d730f6" -dependencies = [ - "prost 0.12.0", -] - -[[package]] -name = "protobuf-src" -version = "1.1.0+21.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7ac8852baeb3cc6fb83b93646fb93c0ffe5d14bf138c945ceb4b9948ee0e3c1" -dependencies = [ - "autotools", -] - -[[package]] -name = "quote" -version = "1.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" -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", -] - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "num_cpus", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom", - "redox_syscall 0.2.16", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" - -[[package]] -name = "reqwest" -version = "0.11.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" -dependencies = [ - "base64 0.21.2", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "risc0-binfmt" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede27631e6b2a946a43db812063453c9701d5d2544d82f9abec2cc12574ebb8e" -dependencies = [ - "anyhow", - "elf", - "log", - "risc0-zkp", - "risc0-zkvm-platform", - "serde", -] - -[[package]] -name = "risc0-build" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703b79671cd148f6535e1f78b8a74f665c920493eb6546c516c67ab0bc0bbde1" -dependencies = [ - "cargo_metadata", - "risc0-binfmt", - "risc0-zkp", - "risc0-zkvm-platform", - "serde", - "serde_json", -] - -[[package]] -name = "risc0-build-kernel" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80b88d565a721641f355cb889fee75c12c719dec7b910aa42ecabffa30d99f87" -dependencies = [ - "cc", - "directories", - "glob", - "hex", - "sha2 0.10.7", - "tempfile", -] - -[[package]] -name = "risc0-circuit-rv32im" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e00222152fdc94cacc9b6682b5c0cbe8138f1ee82e80c24a64d9ad2c6d7415" -dependencies = [ - "anyhow", - "log", - "rand", - "rayon", - "risc0-circuit-rv32im-sys", - "risc0-core", - "risc0-sys", - "risc0-zkp", - "risc0-zkvm-platform", - "tracing", -] - -[[package]] -name = "risc0-circuit-rv32im-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca6ec6b1a7aad859af0009d19946ffdded8e3bd5d9accf893846b6bf996ac08" -dependencies = [ - "glob", - "risc0-build-kernel", - "risc0-core", - "risc0-sys", -] - -[[package]] -name = "risc0-core" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08605aec93ea22ed83f7f81f42e2d7287a5b0c749d8671f94de9d5994020045c" -dependencies = [ - "bytemuck", - "rand_core", -] - -[[package]] -name = "risc0-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6d308c2ebc79e32c100f57722914b3172d2f0d69321703b684ea0c302e4f3a9" -dependencies = [ - "cc", - "glob", - "risc0-build-kernel", - "risc0-core", -] - -[[package]] -name = "risc0-zkp" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28166926bb177824939f4e91083198f9f3da8137aeac32361bd34548c0526fa5" -dependencies = [ - "anyhow", - "blake2", - "bytemuck", - "digest 0.10.7", - "ff", - "hex", - "lazy_static", - "log", - "ndarray", - "paste", - "rand", - "rand_core", - "rayon", - "risc0-core", - "risc0-sys", - "risc0-zkvm-platform", - "serde", - "sha2 0.10.7", - "tracing", -] - -[[package]] -name = "risc0-zkvm" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec972152bcaa1a2967e412e22a84f6e2984a95c701bcc7943ca8ca10126ee0a2" -dependencies = [ - "addr2line", - "anyhow", - "bincode", - "bonsai-sdk", - "bytemuck", - "bytes", - "cfg-if", - "crypto-bigint", - "generic-array", - "getrandom", - "hex", - "lazy-regex", - "libm", - "log", - "num-derive 0.4.0", - "num-traits", - "prost 0.12.0", - "prost-build 0.12.0", - "protobuf-src", - "rand", - "rayon", - "risc0-binfmt", - "risc0-circuit-rv32im", - "risc0-core", - "risc0-zkp", - "risc0-zkvm-platform", - "rrs-lib", - "serde", - "sha2 0.10.7", - "tempfile", - "thiserror", - "tracing", - "typetag", -] - -[[package]] -name = "risc0-zkvm-platform" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8524b46783b58b00e9b2a4712e837093c975b23cf25bfaf99e1cf69e9011bf6b" - -[[package]] -name = "rocksdb" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe" -dependencies = [ - "libc", - "librocksdb-sys", -] - -[[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 = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.37.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys", -] - -[[package]] -name = "rustix" -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" -dependencies = [ - "bitflags 2.3.3", - "errno", - "libc", - "linux-raw-sys 0.4.3", - "windows-sys", -] - -[[package]] -name = "rustls" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" -dependencies = [ - "log", - "ring", - "sct", - "webpki", -] - -[[package]] -name = "rustls" -version = "0.21.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ea77c539259495ce8ca47f53e66ae0330a8819f67e23ac96ca02f50e7b7d36" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.2", - "sct", -] - -[[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", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" -dependencies = [ - "base64 0.21.2", -] - -[[package]] -name = "rustls-webpki" -version = "0.100.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98ff011474fa39949b7e5c0428f9b4937eda7da7848bbb947786b7be0b27dab" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513722fd73ad80a71f72b61009ea1b584bcfa1483ca93949c8f290298837fa59" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "ruzstd" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a15e661f0f9dac21f3494fe5d23a6338c0ac116a2d22c2b63010acd89467ffe" -dependencies = [ - "byteorder", - "thiserror", - "twox-hash", -] - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "schannel" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "schemars" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" -dependencies = [ - "dyn-clone", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 1.0.109", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "security-framework" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" -dependencies = [ - "serde", -] - -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - -[[package]] -name = "serde" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-value" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" -dependencies = [ - "ordered-float", - "serde", -] - -[[package]] -name = "serde_bytes" -version = "0.11.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "serde_derive_internals" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "serde_json" -version = "1.0.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d89a8107374290037607734c0b73a85db7ed80cae314b3c5791f192a496e731" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "serde_spanned" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" -dependencies = [ - "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 = "serde_yaml" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" -dependencies = [ - "indexmap 1.9.3", - "ryu", - "serde", - "yaml-rust", -] - -[[package]] -name = "sha-1" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "sharded-slab" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" - -[[package]] -name = "slab" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "soketto" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" -dependencies = [ - "base64 0.13.1", - "bytes", - "futures", - "http", - "httparse", - "log", - "rand", - "sha-1", -] - -[[package]] -name = "sov-accounts" -version = "0.2.0" -dependencies = [ - "anyhow", - "borsh", - "clap", - "jsonrpsee 0.18.2", - "schemars", - "serde", - "serde_json", - "sov-modules-api", - "sov-state", - "thiserror", -] - -[[package]] -name = "sov-bank" -version = "0.2.0" -dependencies = [ - "anyhow", - "borsh", - "clap", - "hex", - "jsonrpsee 0.18.2", - "schemars", - "serde", - "serde_json", - "sov-modules-api", - "sov-rollup-interface", - "sov-state", - "thiserror", -] - -[[package]] -name = "sov-blob-storage" -version = "0.2.0" -dependencies = [ - "anyhow", - "bincode", - "borsh", - "hex", - "jsonrpsee 0.18.2", - "schemars", - "serde", - "serde_json", - "sov-chain-state", - "sov-modules-api", - "sov-sequencer-registry", - "sov-state", - "tracing", -] - -[[package]] -name = "sov-celestia-adapter" -version = "0.2.0" -dependencies = [ - "anyhow", - "async-trait", - "base64 0.21.2", - "bech32", - "borsh", - "hex", - "hex-literal", - "jsonrpsee 0.18.2", - "nmt-rs", - "prost 0.11.9", - "prost-build 0.11.9", - "prost-types 0.11.9", - "risc0-zkvm", - "risc0-zkvm-platform", - "serde", - "serde_json", - "sha2 0.10.7", - "sov-rollup-interface", - "sov-zk-cycle-macros", - "tendermint", - "tendermint-proto", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "sov-chain-state" -version = "0.2.0" -dependencies = [ - "anyhow", - "borsh", - "jsonrpsee 0.18.2", - "serde", - "serde_json", - "sov-modules-api", - "sov-rollup-interface", - "sov-state", -] - -[[package]] -name = "sov-cli" -version = "0.2.0" -dependencies = [ - "anyhow", - "borsh", - "directories", - "hex", - "jsonrpsee 0.18.2", - "serde", - "serde_json", - "sov-accounts", - "sov-bank", - "sov-modules-api", - "tokio", -] - -[[package]] -name = "sov-db" -version = "0.2.0" -dependencies = [ - "anyhow", - "bincode", - "borsh", - "byteorder", - "jmt", - "rocksdb", - "serde", - "sov-rollup-interface", - "sov-schema-db", - "tokio", -] - -[[package]] -name = "sov-demo-prover-host" -version = "0.2.0" -dependencies = [ - "anyhow", - "bincode", - "borsh", - "const-rollup-config", - "demo-stf", - "env_logger", - "hex", - "jsonrpsee 0.16.2", - "log", - "log4rs", - "methods", - "once_cell", - "parking_lot 0.11.2", - "prettytable-rs", - "regex", - "risc0-zkvm", - "serde", - "serde_json", - "sha2 0.10.7", - "sov-celestia-adapter", - "sov-modules-api", - "sov-risc0-adapter", - "sov-rollup-interface", - "sov-state", - "sov-stf-runner", - "sov-zk-cycle-macros", - "tempfile", - "tokio", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "sov-first-read-last-write-cache" -version = "0.2.0" -dependencies = [ - "thiserror", -] - -[[package]] -name = "sov-modules-api" -version = "0.2.0" -dependencies = [ - "anyhow", - "bech32", - "borsh", - "clap", - "derive_more", - "ed25519-dalek", - "hex", - "jsonrpsee 0.18.2", - "rand", - "schemars", - "serde", - "serde_json", - "sha2 0.10.7", - "sov-modules-macros", - "sov-rollup-interface", - "sov-sequencer", - "sov-state", - "thiserror", -] - -[[package]] -name = "sov-modules-macros" -version = "0.2.0" -dependencies = [ - "anyhow", - "borsh", - "jsonrpsee 0.18.2", - "proc-macro2", - "quote", - "schemars", - "syn 1.0.109", - "toml 0.8.0", -] - -[[package]] -name = "sov-modules-stf-template" -version = "0.2.0" -dependencies = [ - "anyhow", - "borsh", - "hex", - "jmt", - "serde", - "sov-modules-api", - "sov-rollup-interface", - "sov-state", - "thiserror", - "tracing", -] - -[[package]] -name = "sov-risc0-adapter" -version = "0.2.0" -dependencies = [ - "anyhow", - "bincode", - "bytemuck", - "once_cell", - "parking_lot 0.12.1", - "risc0-circuit-rv32im", - "risc0-zkp", - "risc0-zkvm", - "risc0-zkvm-platform", - "serde", - "sov-rollup-interface", - "sov-zk-cycle-utils", -] - -[[package]] -name = "sov-rollup-interface" -version = "0.2.0" -dependencies = [ - "anyhow", - "async-trait", - "bincode", - "borsh", - "bytes", - "digest 0.10.7", - "hex", - "serde", - "sha2 0.10.7", - "thiserror", - "tokio", -] - -[[package]] -name = "sov-schema-db" -version = "0.2.0" -dependencies = [ - "anyhow", - "once_cell", - "prometheus", - "rocksdb", - "thiserror", - "tracing", -] - -[[package]] -name = "sov-sequencer" -version = "0.2.0" -dependencies = [ - "anyhow", - "borsh", - "hex", - "jsonrpsee 0.18.2", - "serde", - "sov-rollup-interface", - "tracing", -] - -[[package]] -name = "sov-sequencer-registry" -version = "0.2.0" -dependencies = [ - "anyhow", - "borsh", - "clap", - "jsonrpsee 0.18.2", - "schemars", - "serde", - "serde_json", - "sov-bank", - "sov-modules-api", - "sov-state", -] - -[[package]] -name = "sov-state" -version = "0.2.0" -dependencies = [ - "anyhow", - "bcs", - "borsh", - "hex", - "jmt", - "serde", - "serde_json", - "sha2 0.10.7", - "sov-db", - "sov-first-read-last-write-cache", - "sov-rollup-interface", - "thiserror", -] - -[[package]] -name = "sov-stf-runner" -version = "0.2.0" -dependencies = [ - "anyhow", - "borsh", - "futures", - "hex", - "jsonrpsee 0.18.2", - "serde", - "serde_json", - "sov-celestia-adapter", - "sov-db", - "sov-modules-api", - "sov-rollup-interface", - "sov-state", - "tokio", - "toml 0.8.0", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "sov-value-setter" -version = "0.2.0" -dependencies = [ - "anyhow", - "borsh", - "clap", - "jsonrpsee 0.18.2", - "schemars", - "serde", - "serde_json", - "sov-modules-api", - "sov-state", - "thiserror", -] - -[[package]] -name = "sov-zk-cycle-macros" -version = "0.2.0" -dependencies = [ - "anyhow", - "borsh", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "sov-zk-cycle-utils" -version = "0.2.0" -dependencies = [ - "risc0-zkvm", - "risc0-zkvm-platform", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spki" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" -dependencies = [ - "base64ct", - "der", -] - -[[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 = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "subtle-encoding" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" -dependencies = [ - "zeroize", -] - -[[package]] -name = "subtle-ng" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" - -[[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.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" -dependencies = [ - "autocfg", - "cfg-if", - "fastrand", - "redox_syscall 0.3.5", - "rustix 0.37.23", - "windows-sys", -] - -[[package]] -name = "tendermint" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f0a7d05cf78524782337f8edd55cbc578d159a16ad4affe2135c92f7dbac7f0" -dependencies = [ - "bytes", - "digest 0.10.7", - "ed25519", - "ed25519-consensus", - "flex-error", - "futures", - "num-traits", - "once_cell", - "prost 0.11.9", - "prost-types 0.11.9", - "serde", - "serde_bytes", - "serde_json", - "serde_repr", - "sha2 0.10.7", - "signature", - "subtle", - "subtle-encoding", - "tendermint-proto", - "time 0.3.23", - "zeroize", -] - -[[package]] -name = "tendermint-proto" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cec054567d16d85e8c3f6a3139963d1a66d9d3051ed545d31562550e9bcc3d" -dependencies = [ - "bytes", - "flex-error", - "num-derive 0.3.3", - "num-traits", - "prost 0.11.9", - "prost-types 0.11.9", - "serde", - "serde_bytes", - "subtle-encoding", - "time 0.3.23", -] - -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "thread-id" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee93aa2b8331c0fec9091548843f2c90019571814057da3b783f9de09349d73" -dependencies = [ - "libc", - "redox_syscall 0.2.16", - "winapi", -] - -[[package]] -name = "thread_local" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" -dependencies = [ - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" -dependencies = [ - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -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.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" -dependencies = [ - "autocfg", - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot 0.12.1", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.8", - "tokio", - "webpki", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.5", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c226a7bba6d859b63c92c4b4fe69c5b6b72d0cb897dbc8e6012298e6154cb56e" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.20.0", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.19.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" -dependencies = [ - "indexmap 2.0.0", - "toml_datetime", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ff63e60a958cefbb518ae1fd6566af80d9d4be430a33f3723dfc47d1d411d95" -dependencies = [ - "indexmap 2.0.0", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[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-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if", - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "tracing-core" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" -dependencies = [ - "nu-ansi-term", - "sharded-slab", - "smallvec", - "thread_local", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[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 = "typemap-ors" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68c24b707f02dd18f1e4ccceb9d49f2058c2fb86384ef9972592904d7a28867" -dependencies = [ - "unsafe-any-ors", -] - -[[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "typetag" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66aafcfb982bf1f9a28755ac6bcbdcd4631ff516cb038fa61299201ebb4364" -dependencies = [ - "erased-serde", - "inventory", - "once_cell", - "serde", - "typetag-impl", -] - -[[package]] -name = "typetag-impl" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d836cd032f71d90cbaa3c1f85ce84266af23659766d8c0b1c4c6524a0fb4c36f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-ident" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - -[[package]] -name = "unsafe-any-ors" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a303d30665362d9680d7d91d78b23f5f899504d4f08b3c4cf08d055d87c0ad" -dependencies = [ - "destructure_traitobject", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "url" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[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.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.29", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.29", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[package]] -name = "web-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] - -[[package]] -name = "webpki-roots" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" -dependencies = [ - "rustls-webpki 0.100.2", -] - -[[package]] -name = "which" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" -dependencies = [ - "either", - "libc", - "once_cell", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[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" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" - -[[package]] -name = "winnow" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" -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.29", -] - -[[package]] -name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" -dependencies = [ - "cc", - "libc", - "pkg-config", -] diff --git a/examples/demo-prover/Cargo.toml b/examples/demo-prover/Cargo.toml deleted file mode 100644 index 444267b6d..000000000 --- a/examples/demo-prover/Cargo.toml +++ /dev/null @@ -1,54 +0,0 @@ -[package] -name = "sov-demo-prover-host" -version = "0.2.0" -edition = "2021" -publish = false -license = "MIT OR Apache-2.0" -resolver = "2" - -[dependencies] -anyhow = { workspace = true } -borsh = { workspace = true } -bincode = { workspace = true } -hex = { workspace = true } -jsonrpsee = { workspace = true, features = ["http-client", "server"] } -risc0-zkvm = { workspace = true } -serde = { workspace = true, features = ["derive"] } -serde_json = { workspace = true } -sha2 = { workspace = true } -tokio = { workspace = true } -tracing = "0.1.37" -tracing-subscriber = "0.3.16" - -sov-celestia-adapter = { path = "../../adapters/celestia", features = ["native", "bench"] } -sov-demo-rollup = { path = "../demo-rollup", features = ["native"] } -demo-stf = { path = "../demo-stf", optional = true } -sov-rollup-interface = { path = "../../rollup-interface" } -sov-risc0-adapter = { path = "../../adapters/risc0", features = ["native"] } -const-rollup-config = { path = "../const-rollup-config" } -sov-modules-api = { path = "../../module-system/sov-modules-api", features = ["native"] } -sov-state = { path = "../../module-system/sov-state", features = ["native"] } -sov-zk-cycle-macros = { path = "../../utils/zk-cycle-macros", optional = true } -sov-stf-runner = { path = "../../full-node/sov-stf-runner" } - -methods = { path = "./methods" } - - -[dev-dependencies] -tempfile = { workspace = true } -once_cell = "1.7.2" -parking_lot = "0.12.1" -prettytable-rs = "^0.10" -env_logger = "0.10.0" -log = "0.4" -log4rs = "1.0" -regex = "1.5" - -[[bench]] -name = "prover_bench" -harness = false -required-features = ["bench"] - -[features] -bench = ["sov-risc0-adapter/bench", "sov-zk-cycle-macros/bench", "methods/bench", "demo-stf"] -experimental = ["sov-demo-rollup/experimental"] diff --git a/examples/demo-prover/Makefile b/examples/demo-prover/Makefile deleted file mode 100644 index 3c6fb360f..000000000 --- a/examples/demo-prover/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# Directories and paths -TRACER_DIR = ../../utils/zk-cycle-utils/tracer -ELF_PATH_TRACER = ../../../examples/demo-prover/target/riscv-guest/riscv32im-risc0-zkvm-elf/release/rollup -TRACE_PATH_TRACER = ../../../examples/demo-prover/host/rollup.trace - -# This allows you to pass additional flags when you call `make run-tracer`. -# For example: `make run-tracer ADDITIONAL_FLAGS="--some-flag"` -ADDITIONAL_FLAGS ?= - -.PHONY: generate-files run-tracer - -all: generate-files run-tracer - -generate-files: - ROLLUP_TRACE=rollup.trace cargo bench --bench prover_bench --features bench - -run-tracer: - @cd $(TRACER_DIR) && \ - cargo run --release -- --no-raw-counts --rollup-elf $(ELF_PATH_TRACER) --rollup-trace $(TRACE_PATH_TRACER) $(ADDITIONAL_FLAGS) diff --git a/examples/demo-prover/README.md b/examples/demo-prover/README.md deleted file mode 100644 index 460995456..000000000 --- a/examples/demo-prover/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Demo Prover ![Time - ~10 mins](https://img.shields.io/badge/Time-~10_mins-informational) - -This is a demo running a simple Sovereign SDK rollup **prover** on [Celestia](https://celestia.org/), with [RiscZero](https://www.risczero.com/) as a prover. - -

- -
- Stuck, facing problems, or unsure about something? -
- Join our Discord and ask your questions in #support! -

- -### Disclaimer - -> ⚠️ Warning! ⚠️ - -`demo-prover` is a prototype! It contains known vulnerabilities and inefficiencies, and no part of its code not be used in production under any circumstances. - -## What is it? - -This demo shows how to integrate the [RiscZero](https://risczero.com) prover into a rollup built with the Sovereign SDK. It reads blocks from Celestia, executes them inside the RiscZero zkVM, and creates a cryptographic proof of the result. - -This package implements the same logic as [`demo-rollup`](../demo-rollup/), but it splits the logic between -a "host" and a "guest" (respectively the prover and ZK-circuit) to create actual ZK proofs. This separation makes it slightly harder to follow at first glance, so we recommend diving into the `demo-rollup` before attempting to use this package. - -## Prerequisites - -You'll need at least 96GiB of RAM to run this example on a x86_64 CPU. If you don't have that much memory available, you can still still run the demo but skip proof generation by setting the environment variable `SKIP_PROVER`. - -## Getting Started - -1. Make sure Celestia light node is running as described in [Demo Rollup README](../demo-rollup/README.md). - - `make clean` - - `make start` - - `make test-create-token` to produce blob with transaction -2. Make sure you're in `examples/demo-prover` folder after previous step -3. Make sure that there's no data from previous runs `rm -rf demo_data` -4. Execute `cargo run -- ../demo-rollup/rollup_config.toml`. - - -## License - -Licensed under the [Apache License, Version 2.0](../../LICENSE). - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in this repository by you, as defined in the Apache-2.0 license, shall be -licensed as above, without any additional terms or conditions. diff --git a/examples/demo-prover/rollup_config.toml b/examples/demo-prover/rollup_config.toml deleted file mode 100644 index 3560c1212..000000000 --- a/examples/demo-prover/rollup_config.toml +++ /dev/null @@ -1,20 +0,0 @@ -[da] -celestia_rpc_auth_token = "SUPER_SECRET_TOKEN" -celestia_rpc_address = "http://localhost:11111/" -# 100 MB -max_celestia_response_body_size = 104_857_600 - -[storage] -# The path to the rollup's data directory. Paths that do not begin with `/` are interpreted as relative paths. -path = "demo_data" - -[runner.storage] -path = "demo_data" - -[runner] -start_height = 671431 - -[runner.rpc_config] -# the host and port to bind the rpc server for -bind_host = "127.0.0.1" -bind_port = 12345 diff --git a/examples/demo-prover/rust-toolchain.toml b/examples/demo-prover/rust-toolchain.toml deleted file mode 100644 index a9808cc4d..000000000 --- a/examples/demo-prover/rust-toolchain.toml +++ /dev/null @@ -1,4 +0,0 @@ -[toolchain] -channel = "stable" -components = [ "rustfmt", "rust-src" ] -profile = "minimal" diff --git a/examples/demo-rollup/Cargo.toml b/examples/demo-rollup/Cargo.toml index 2814df35e..1936e75fb 100644 --- a/examples/demo-rollup/Cargo.toml +++ b/examples/demo-rollup/Cargo.toml @@ -19,11 +19,12 @@ sov-stf-runner = { path = "../../full-node/sov-stf-runner" } sov-rollup-interface = { path = "../../rollup-interface" } sov-modules-stf-template = { path = "../../module-system/sov-modules-stf-template" } sov-modules-api = { path = "../../module-system/sov-modules-api" } +sov-nft-module = { path = "../../module-system/module-implementations/sov-nft-module" } demo-stf = { path = "../demo-stf" } -methods = { path = "../demo-prover/methods" } +risc0 = { path = "./provers/risc0" } +borsh = { workspace = true, features = ["bytes"]} async-trait = { workspace = true, optional = true } anyhow = { workspace = true, optional = true } -borsh = { workspace = true, features = ["bytes"], optional = true } jsonrpsee = { workspace = true, features = ["http-client", "server"], optional = true } serde = { workspace = true, features = ["derive"], optional = true } serde_json = { workspace = true, optional = true } @@ -43,24 +44,21 @@ sov-state = { path = "../../module-system/sov-state" } sov-cli = { path = "../../module-system/sov-cli", optional = true } clap = { workspace = true, optional = true} - [dev-dependencies] +sov-rollup-interface = { path = "../../rollup-interface", features = ["fuzzing"] } +sov-demo-rollup = { path = ".", features = ["native"] } sov-evm = { path = "../../module-system/module-implementations/sov-evm", features = ["smart_contracts"] } sov-bank = { path = "../../module-system/module-implementations/sov-bank", features = ["native"] } +sov-zk-cycle-macros = { path = "../../utils/zk-cycle-macros"} + borsh = { workspace = true } +bincode = { workspace = true } sha2 = { workspace = true } hex = { workspace = true } serde_json = { workspace = true } -reqwest = "0.11" -tendermint = "0.32" tempfile = { workspace = true } proptest = { workspace = true } -sov-rollup-interface = { path = "../../rollup-interface", features = ["fuzzing"] } tokio = { workspace = true } -sov-demo-rollup = { path = ".", features = ["native"] } -prometheus = "0.11.0" -prettytable-rs = "^0.10" -criterion = "0.5.1" ethereum-types = { workspace = true } ethers-core = { workspace = true } @@ -71,6 +69,15 @@ ethers-signers = { workspace = true } ethers = { workspace = true } revm = { workspace = true } +reqwest = "0.11" +tendermint = "0.32" +prometheus = "0.11.0" +prettytable-rs = "^0.10" +criterion = "0.5.1" +log = "0.4" +log4rs = "1.0" +regex = "1.5" + [features] default = ["native"] # Deviate from convention by making the "native" feature active by default. This aligns with how this package is meant to be used (as a binary first, library second). experimental = ["default", "sov-ethereum/experimental", "reth-primitives", "secp256k1", "demo-stf/experimental", "sov-ethereum/local"] @@ -78,28 +85,45 @@ native = ["anyhow", "jsonrpsee", "serde", "serde_json", "tracing", "tokio", "tra "demo-stf/native", "sov-modules-stf-template/native", "sov-risc0-adapter/native", "sov-modules-api/native", "sov-state/native", "sov-cli", "clap", "sov-celestia-adapter/native", "sov-db", "sov-sequencer", "sov-stf-runner/native", "sov-modules-api/native", "sov-rollup-interface/native"] -bench = ["native", "async-trait", "borsh", "hex"] + +bench = ["native", "async-trait", "hex", "sov-risc0-adapter/bench", "sov-zk-cycle-macros/bench", "risc0/bench"] offchain = ["demo-stf/offchain"] [[bench]] name = "rollup_bench" +path = "benches/node/rollup_bench.rs" harness = false required-features = ["bench"] [[bench]] name = "rollup_coarse_measure" +path = "benches/node/rollup_coarse_measure.rs" harness = false required-features = ["bench"] [[bench]] name = "rng_xfers" +path = "benches/node/rng_xfers.rs" required-features = ["bench"] + +[[bench]] +name = "prover_bench" +path = "benches/prover/prover_bench.rs" +harness = false +required-features = ["bench"] + + [[bin]] name = "sov-cli" path = "src/sov-cli/main.rs" required-features = ["native"] +[[bin]] +name = "sov-nft-script" +path = "src/bin/sov_nft_script.rs" +required-features = ["native"] + [[bin]] name = "sov-demo-rollup" path = "src/main.rs" diff --git a/examples/demo-rollup/Makefile b/examples/demo-rollup/Makefile index a49036df0..87d1164d1 100644 --- a/examples/demo-rollup/Makefile +++ b/examples/demo-rollup/Makefile @@ -1,64 +1,68 @@ -.PHONY: start start-existing start-new config submit-txn - -CONTAINER_NAME=sov-celestia-local -VALIDATOR_ADDRESS=celestia1w7wcupk5gswj25c0khnkey5fwmlndx6t5aarmk -IMAGE_NAME=dubbelosix/sov-celestia-local:genesis-v0.7.1 -RPC_PORT=26658 -KEY_NAME=validator -AMOUNT=10000000utia -START_HEIGHT=1 -BLOB_TXN_FEE=300utia -TEST_PRIVATE_KEY_PATH=../test-data/keys/minter_private_key.json -SOV_CLI_REL_PATH=../../target/debug/sov-cli - -ifndef SERIALIZED_BLOB_PATH -CONTENT := -else -CONTENT := $(shell cat $(SERIALIZED_BLOB_PATH)) -endif - -get_address = $(shell docker exec $(CONTAINER_NAME) celestia-appd keys show $(KEY_NAME) | sed -n 's/- address: \(.*\)/\1/p') -get_auth = $(shell docker exec $(CONTAINER_NAME) /celestia bridge auth admin --node.store /bridge) -get_namespace = $(shell $(SOV_CLI_REL_PATH) util print-namespace) +PROJECT_ROOT := $(shell git rev-parse --show-toplevel) +DOCKER_COMPOSE_DIR := $(PROJECT_ROOT)/docker +DOCKER_COMPOSE_CFG := $(DOCKER_COMPOSE_DIR)/docker-compose.yml +CREDENTIALS_DIR := $(DOCKER_COMPOSE_DIR)/credentials +TEST_PRIVATE_KEY_PATH := $(PROJECT_ROOT)/examples/test-data/keys/minter_private_key.json +SOV_CLI_REL_PATH := $(PROJECT_ROOT)/target/debug/sov-cli + +# at height 3 the credits will already belong to the keys +START_HEIGHT := 3 +KEY_NAME := bridge-0 +RPC_PORT := 26658 + +# get the jwt token +get_auth = $(shell cat $(CREDENTIALS_DIR)/$(KEY_NAME).jwt) + +# Docker compose commands +docker_compose := docker compose -f $(DOCKER_COMPOSE_CFG) +# start the service +compose_up := $(docker_compose) up --build --force-recreate -d +# stop the service +compose_down := $(docker_compose) down +# follow the logs +compose_logs := $(docker_compose) logs -f +# check if service is running +# we need a bridge and validator so naive check is to have at least 2 services +compose_is_running = test 2 -le "$(shell $(docker_compose) ps --filter status=running --format json | jq 'length')" + +# start the celestia network and generate a new config +start: check-docker start-network update-config + @$(compose_logs) + +# start the celestia network or attach to existing +start-network: check-docker + @echo "Starting local celestia network setup" + @if $(compose_is_running); then $(compose_logs); else $(compose_up); fi + +# stop the celestia network +stop: check-docker + @echo "Stopping local celestia network setup" + @$(compose_down) -key-exists: check-container-running - @docker exec $(CONTAINER_NAME) celestia-appd keys show $(KEY_NAME) || make create-new-key +# clean up rollup data and stop the celestia network +clean: stop clean-rollup-db -create-new-key: check-container-running - @echo "Creating new key..." - @output=$$(docker exec $(CONTAINER_NAME) celestia-appd keys add $(KEY_NAME)) - -fund-address: check-container-running - @docker exec $(CONTAINER_NAME) celestia-appd query bank balances $(get_address) | grep amount || docker exec $(CONTAINER_NAME) celestia-appd tx bank send validator $(get_address) $(AMOUNT) --fees=300utia -y +# listen to celestia network logs +compose-logs: check-docker + @echo "Showing celestia logs" + @$(compose_logs) +# check if docker is installed check-docker: @command -v docker > /dev/null 2>&1 || { echo "Docker is not installed"; exit 1; } + @# TODO: check docker compose too -check-container-running: - @echo "Container $(CONTAINER_NAME) running" - @docker ps --format '{{.Names}}' | grep -w $(CONTAINER_NAME) > /dev/null 2>&1 - -check-container-exists: - @echo "Container $(CONTAINER_NAME) exists" - @docker ps -a --format '{{.Names}}' | grep -w $(CONTAINER_NAME) > /dev/null 2>&1 - -start-existing: - @echo "Resuming existing container: $(CONTAINER_NAME)" - docker start $(CONTAINER_NAME) - -start-new: - @echo "Starting new container: $(CONTAINER_NAME)" - docker run -d --name $(CONTAINER_NAME) --platform linux/amd64 -p 26657:26657 -p 26659:26659 -p $(RPC_PORT):$(RPC_PORT) $(IMAGE_NAME) +# check if celestia network is running +check-compose-running: check-docker + @$(compose_is_running) -start-container: - @$(MAKE) check-container-running || { $(MAKE) check-container-exists && $(MAKE) start-existing || $(MAKE) start-new; } +# wait for the celestia network to perform setup and coins transfers +wait-compose-ready: + @echo "Waiting for services to finish setup" + @$(compose_logs) | awk '/Provisioning finished./ {print;exit}' # exit when encounter this log entry -validator-funded: - @until docker exec $(CONTAINER_NAME) celestia-appd query bank balances $(VALIDATOR_ADDRESS) | grep amount ; do \ - sleep 5; \ - done - -config: check-container-running +# update the rollup configuration with local network params +update-config: wait-compose-ready ifeq ($(shell uname -s),Darwin) @sed -i '' 's/^\(celestia_rpc_auth_token = \)"[^"]*"/\1"$(get_auth)"/' rollup_config.toml @sed -i '' 's#^\(celestia_rpc_address = \)"[^"]*"#\1"http://127.0.0.1:$(RPC_PORT)"#' rollup_config.toml @@ -69,31 +73,10 @@ else @sed -i 's#^\(start_height = \)[0-9]*#\1$(START_HEIGHT)#' rollup_config.toml endif -start: check-docker start-container validator-funded key-exists fund-address config - -stop: check-docker - docker stop $(CONTAINER_NAME) -clean: check-docker - -docker stop $(CONTAINER_NAME) - echo 1 - -docker rm $(CONTAINER_NAME) - echo 2 - $(MAKE) clean-rollup-db - -submit-txn : check-container-running build-sov-cli -ifndef SERIALIZED_BLOB_PATH - $(error SERIALIZED_BLOB_PATH is not defined) -else ifeq ($(wildcard $(SERIALIZED_BLOB_PATH)),) - $(error The file $(SERIALIZED_BLOB_PATH) does not exist) -else - @echo CONTENT:$(CONTENT) - @docker exec $(CONTAINER_NAME) celestia-appd tx blob PayForBlobs $(get_namespace) $(CONTENT) --from $(KEY_NAME) --chain-id=test --fees=$(BLOB_TXN_FEE) -y -endif - build-sov-cli: cargo build --bin sov-cli -test-generate-create-token-tx: check-container-running build-sov-cli +test-generate-create-token-tx: wait-compose-ready build-sov-cli $(SOV_CLI_REL_PATH) transactions import from-file bank --path ../test-data/requests/create_token.json set-rpc-url: build-sov-cli @@ -111,8 +94,8 @@ remove-insecure-keys: build-sov-cli clean-rollup-db: $(eval path := ./$(shell awk -F'=' '/^path/ {print $$2}' rollup_config.toml | tr -d '[:space:]"\n')) @if [ -z "${path}" ] || [ "${path}" = "./" ]; then \ - echo "Path is empty or too short, not safe to remove"; \ - exit 1; \ - fi + echo "Path is empty or too short, not safe to remove"; \ + exit 1; \ + fi @echo removing rollup database "${path}" rm -rf "${path}" diff --git a/examples/demo-rollup/README.md b/examples/demo-rollup/README.md index 776d604c3..90a2455a3 100644 --- a/examples/demo-rollup/README.md +++ b/examples/demo-rollup/README.md @@ -63,17 +63,26 @@ understand how to build your own state transition function, check out at the doc 1. Install Docker: . -2. Switch to the `examples/demo-rollup` directory (which is where this `README.md` is located!). +2. Follow [this guide](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-with-a-personal-access-token-classic) +to authorize yourself in github's container registry. (we use original celestia images which they publish in ghcr) + +```shell +# this has to be ran only once, unless your token expires +$ echo $MY_PERSONAL_GITHUB_TOKEN | docker login ghcr.io -u $MY_GITHUB_USERNAME --password-stdin +``` + +3. Switch to the `examples/demo-rollup` directory (which is where this `README.md` is located!). ```shell,test-ci $ cd examples/demo-rollup/ ``` -3. Spin up a local Celestia instance as your DA layer. We've built a small Makefile to simplify that process: +4. Spin up a local Celestia instance as your DA layer. We've built a small Makefile to simplify that process: -```sh,test-ci +```sh,test-ci,bashtestmd:long-running $ make clean -$ make start # Make sure to run `make stop` when you're done with this demo! +# Make sure to run `make stop` or `make clean` when you're done with this demo! +$ make start ``` If interested, you can check out what the Makefile does [here](#Makefile). @@ -298,32 +307,23 @@ $ curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method" `demo-rollup/Makefile` automates a number of things for convenience: -- Pull a docker container that runs a single instance of a Celestia full node for a local setup -- The docker container is built with Celestia 0.7.1 at present and is compatible with Sovereign's Celestia adapter) -- `make clean`: - - Stops any running containers with the name `sov-celestia-local` and also removes them - - Removes `demo-data` (or the configured path of the rollup database from rollup_config.toml) +- Starts docker compose with a Celestia network for a local setup - `make start`: - - Pulls the `sov-celestia-local:genesis-v0.7.1` docker image - - Performs a number of checks to ensure container is not already running - - Starts the container with the name `sov-celestia-local` - - Exposes the RPC port `26658` (as configured in the Makefile) + - Performs a number of checks to ensure services are not already running + - Starts the docker compose setup + - Exposes the RPC port `26658` - Waits until the container is started - - It polls the running service inside the container for a specific RPC call, so there will be some errors printed while the container is starting up. This is ok - - Creates a key inside the docker container using `celestia-appd` that is bundled inside the container - the key is named `sequencer-da-address` - - The `sequencer-da-address` key is then funded with `10000000utia` configured by the `AMOUNT` variable in the Makefile - - The validator itself runs with the key name `validator` and is also accessible inside the container but this shouldn't be necessary - Sets up the config - - `examples/const-rollup-config/src/lib.rs` is modified by the `make` command so that `pub const SEQUENCER_DA_ADDRESS` is set to the address of the key ``sov-celestia-local` that was created and funded in the previous steps - `examples/demo-rollup/rollup_config.toml` is modified - - - `start_height` is set to `1` since this is a fresh start - - `celestia_rpc_auth_token` is set to the auth token retrieved by running the container bundled `celestia-appd` - - `/celestia bridge auth admin --node.store /bridge` is the command that is run inside the container to get the token - - `celestia_rpc_address` is set to point to `127.0.0.1` and the `RPC_PORT` configured in the Makefile (default 26658) - - The config is stashed and the changes are visible once you do a `git status` after running `make start` + - `start_height` is set to `3`, which is the block in which sequencers are funded with credits + - `celestia_rpc_auth_token` is set to the auth token exposed by sequencer (in /docker/credentials directory) + - `celestia_rpc_address` is set to point to `127.0.0.1` and the `RPC_PORT` - `make stop`: - - Stops the Celestia Docker image, if running. + - Shuts down the Celestia docker compose setup, if running. - Deletes all contents of the demo-rollup database. +- `make clean`: + - Stops any running containers with the name `sov-celestia-local` and also removes them + - Removes `demo-data` (or the configured path of the rollup database from rollup_config.toml) ### Remote setup diff --git a/examples/demo-rollup/benches/flamegraph_sample.svg b/examples/demo-rollup/benches/flamegraph_sample.svg deleted file mode 100644 index 02b4c5564..000000000 --- a/examples/demo-rollup/benches/flamegraph_sample.svg +++ /dev/null @@ -1,491 +0,0 @@ -Flame Graph Reset ZoomSearch libsystem_malloc.dylib`free (35 samples, 0.02%)libsystem_malloc.dylib`small_free_list_add_ptr (37 samples, 0.02%)libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (69 samples, 0.03%)libsystem_malloc.dylib`small_free_scan_madvise_free (25 samples, 0.01%)libsystem_kernel.dylib`madvise (132 samples, 0.06%)libsystem_malloc.dylib`free_small (365 samples, 0.17%)libsystem_malloc.dylib`small_madvise_free_range_no_lock (138 samples, 0.06%)libsystem_platform.dylib`_platform_memmove (57 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (42 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (42 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<ed25519_dalek::secret::SecretKey as zeroize::Zeroize>::zeroize (24 samples, 0.01%)libsystem_malloc.dylib`free (24 samples, 0.01%)libsystem_malloc.dylib`free_small (111 samples, 0.05%)libsystem_platform.dylib`_platform_memmove (32 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (37 samples, 0.02%)libsystem_malloc.dylib`szone_malloc_should_clear (31 samples, 0.01%)libsystem_malloc.dylib`small_malloc_should_clear (30 samples, 0.01%)libsystem_malloc.dylib`small_malloc_from_free_list (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`borsh::ser::BorshSerialize::try_to_vec (64 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`demo_stf::runtime::Runtime<C>::encode_bank_call (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (352 samples, 0.16%)rollup_coarse_measure-64f9a1d8b33892a3`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold (96 samples, 0.04%)libsystem_malloc.dylib`malloc_zone_realloc (35 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (64 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::finish_grow (51 samples, 0.02%)libsystem_malloc.dylib`realloc (48 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (353 samples, 0.17%)rollup_coarse_measure-64f9a1d8b33892a3`hex::val (145 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold (114 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (43 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (133 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (39 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (141 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (2,614 samples, 1.22%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::to_bytes (41 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::field::_<impl curve25519_dalek::backend::serial::u64::field::FieldElement51>::sqrt_ratio_i (2,862 samples, 1.34%)rollup_coarse_measure-64f9a1d8b33892a3`subtle::black_box (57 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::edwards::CompressedEdwardsY::decompress (3,041 samples, 1.42%)rollup_coarse_measure-64f9a1d8b33892a3`sov_modules_api::default_signature::private_key::DefaultPrivateKey::from_hex (3,597 samples, 1.68%)rollup_coarse_measure-64f9a1d8b33892a3`ed25519_dalek::keypair::Keypair::from_bytes (3,105 samples, 1.45%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (3,135 samples, 1.47%)rollup_coarse_measure-64f9a1d8b33892a3`<sha2::sha512::Sha512 as digest::fixed::FixedOutputDirty>::finalize_into_dirty (238 samples, 0.11%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha512::soft::compress (235 samples, 0.11%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::_<impl core::ops::arith::Add<&curve25519_dalek::backend::serial::curve_models::AffineNielsPoint> for &curve25519_dalek::edwards::EdwardsPoint>::add (73 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (62 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (2,113 samples, 0.99%)rollup_coarse_measure-64f9a1d8b33892a3`<curve25519_dalek::backend::serial::curve_models::AffineNielsPoint as subtle::ConditionallySelectable>::conditional_assign (1,574 samples, 0.74%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::ProjectivePoint::double (39 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::_<impl core::ops::arith::Add<&curve25519_dalek::backend::serial::curve_models::AffineNielsPoint> for &curve25519_dalek::edwards::EdwardsPoint>::add (472 samples, 0.22%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (137 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::window::LookupTable<T>::select (221 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::edwards::EdwardsBasepointTable::basepoint_mul (4,945 samples, 2.31%)r..rollup_coarse_measure-64f9a1d8b33892a3`subtle::black_box (265 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (137 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::edwards::EdwardsPoint::compress (2,802 samples, 1.31%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (2,664 samples, 1.25%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::scalar::Scalar::to_radix_16 (89 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::window::LookupTable<T>::select (62 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`<ed25519_dalek::public::PublicKey as core::convert::From<&ed25519_dalek::secret::SecretKey>>::from (11,449 samples, 5.36%)rollup_..libsystem_kernel.dylib`getentropy (283 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`<rand_core::os::OsRng as rand_core::RngCore>::fill_bytes (285 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`sov_modules_api::default_signature::private_key::DefaultPrivateKey::generate (11,741 samples, 5.50%)rollup_..rollup_coarse_measure-64f9a1d8b33892a3`<sha2::sha512::Sha512 as digest::fixed::FixedOutputDirty>::finalize_into_dirty (256 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha512::soft::compress (252 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (3,143 samples, 1.47%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::scalar::Scalar as core::ops::arith::Add<&curve25519_dalek::scalar::Scalar>>::add (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<sha2::sha512::Sha512 as digest::fixed::FixedOutputDirty>::finalize_into_dirty (430 samples, 0.20%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha512::soft::compress (415 samples, 0.19%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::_<impl core::ops::arith::Add<&curve25519_dalek::backend::serial::curve_models::AffineNielsPoint> for &curve25519_dalek::edwards::EdwardsPoint>::add (67 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (58 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::scalar::Scalar52::from_bytes (40 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::scalar::Scalar52::mul (57 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (2,105 samples, 0.99%)rollup_coarse_measure-64f9a1d8b33892a3`<curve25519_dalek::backend::serial::curve_models::AffineNielsPoint as subtle::ConditionallySelectable>::conditional_assign (1,529 samples, 0.72%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::ProjectivePoint::double (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::_<impl core::ops::arith::Add<&curve25519_dalek::backend::serial::curve_models::AffineNielsPoint> for &curve25519_dalek::edwards::EdwardsPoint>::add (473 samples, 0.22%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (117 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::window::LookupTable<T>::select (209 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::edwards::EdwardsBasepointTable::basepoint_mul (4,859 samples, 2.27%)r..rollup_coarse_measure-64f9a1d8b33892a3`subtle::black_box (274 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (131 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (2,626 samples, 1.23%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::edwards::EdwardsPoint::compress (2,759 samples, 1.29%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::scalar::Scalar52::from_bytes_wide (48 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::scalar::Scalar::from_bytes_mod_order_wide (161 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::scalar::Scalar52::montgomery_mul (113 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::scalar::Scalar::to_radix_16 (88 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::window::LookupTable<T>::select (67 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`ed25519_dalek::secret::ExpandedSecretKey::sign (11,874 samples, 5.56%)rollup_..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha512::Engine512::update (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<ed25519_dalek::keypair::Keypair as signature::signer::Signer<ed25519::Signature>>::try_sign (12,177 samples, 5.70%)rollup_..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (166 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_demo_rollup::rng_xfers::RngDaService as sov_rollup_interface::node::services::da::DaService>::extract_relevant_txs (28,506 samples, 13.34%)rollup_coarse_measur..rollup_coarse_measure-64f9a1d8b33892a3`sov_modules_api::transaction::Transaction<sov_modules_api::default_context::DefaultContext>::new_signed_tx (12,365 samples, 5.79%)rollup_..libsystem_pthread.dylib`pthread_mutex_unlock (40 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::start_timer (47 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (45 samples, 0.02%)libsystem_c.dylib`clock_gettime (45 samples, 0.02%)libsystem_kernel.dylib`mach_absolute_time (42 samples, 0.02%)libsystem_malloc.dylib`small_free_list_add_ptr (25 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (49 samples, 0.02%)libsystem_malloc.dylib`szone_malloc_should_clear (48 samples, 0.02%)libsystem_malloc.dylib`small_malloc_should_clear (45 samples, 0.02%)libsystem_malloc.dylib`small_malloc_from_free_list (42 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::ledger_db::LedgerDB::put_transaction (257 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::SchemaBatch::put (254 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::schema::tables::_<impl sov_rollup_interface::node::db::ValueCodec<sov_db::schema::tables::TxByNumber> for sov_db::schema::types::StoredTransaction>::encode_value (58 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::schema::types::split_tx_for_storage (23 samples, 0.01%)libsystem_malloc.dylib`free (38 samples, 0.02%)libsystem_malloc.dylib`small_free_detach_region (36 samples, 0.02%)libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (32 samples, 0.01%)libsystem_malloc.dylib`small_free_list_add_ptr (28 samples, 0.01%)libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (24 samples, 0.01%)libsystem_kernel.dylib`madvise (66 samples, 0.03%)libsystem_malloc.dylib`free_small (248 samples, 0.12%)libsystem_malloc.dylib`small_madvise_free_range_no_lock (71 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`<hashbrown::raw::RawTable<T,A> as core::ops::drop::Drop>::drop (321 samples, 0.15%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::WriteToWAL (35 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::log::Writer::AddRecord (35 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::log::Writer::EmitPhysicalRecord (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::WriteToWAL (48 samples, 0.02%)libdyld.dylib`tlv_get_addr (49 samples, 0.02%)libsystem_platform.dylib`_platform_memcmp (40 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (130 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (357 samples, 0.17%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_level (75 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::InlineSkipList<rocksdb::MemTableRep::KeyComparator const&>::Insert<false>(char const*, rocksdb::InlineSkipList (1,215 samples, 0.57%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_level (75 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::Allocate (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::MemTableInserter::PutCFImpl(unsigned int, rocksdb::Slice const&, rocksdb::Slice const&, rocksdb::ValueType, rocksdb::ProtectionInfoKVOS (1,335 samples, 0.62%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::Add(unsigned long long, rocksdb::ValueType, rocksdb::Slice const&, rocksdb::Slice const&, rocksdb::ProtectionInfoKVOS (1,285 samples, 0.60%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::MemTableInserter::PutCF (1,341 samples, 0.63%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::db::DBCommon<T,rocksdb::db::DBWithThreadModeInner>::write_opt (1,397 samples, 0.65%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_write (1,397 samples, 0.65%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::Write (1,397 samples, 0.65%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::WriteImpl (1,397 samples, 0.65%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatchInternal::InsertInto (1,349 samples, 0.63%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatchInternal::Iterate (1,348 samples, 0.63%)libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append (33 samples, 0.02%)libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append (65 samples, 0.03%)libsystem_platform.dylib`_platform_memmove (45 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatch::Put (178 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatchInternal::Put (126 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::write_schemas (1,959 samples, 0.92%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_writebatch_put_cf (179 samples, 0.08%)libsystem_malloc.dylib`small_free_list_add_ptr (86 samples, 0.04%)libsystem_malloc.dylib`_malloc_zone_malloc (139 samples, 0.07%)libsystem_malloc.dylib`szone_malloc_should_clear (124 samples, 0.06%)libsystem_malloc.dylib`small_malloc_should_clear (124 samples, 0.06%)libsystem_malloc.dylib`small_malloc_from_free_list (112 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`<prometheus::histogram::HistogramTimer as core::ops::drop::Drop>::drop (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::start_timer (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (27 samples, 0.01%)libsystem_c.dylib`clock_gettime (26 samples, 0.01%)libsystem_kernel.dylib`mach_absolute_time (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::ledger_db::LedgerDB::commit_slot (2,550 samples, 1.19%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::SchemaBatch::put (257 samples, 0.12%)libsystem_malloc.dylib`free (35 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<alloc::string::String as core::iter::traits::collect::FromIterator<char>>::from_iter (53 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<hex::BytesToHexChars as core::iter::traits::iterator::Iterator>::next (72 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`core::fmt::Formatter::debug_tuple (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<&mut W as core::fmt::Write>::write_str (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<str as core::fmt::Debug>::fmt (376 samples, 0.18%)rollup_coarse_measure-64f9a1d8b33892a3`core::unicode::unicode_data::grapheme_extend::lookup (255 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`core::fmt::builders::DebugTuple::field (404 samples, 0.19%)rollup_coarse_measure-64f9a1d8b33892a3`core::unicode::printable::is_printable (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::KeyHash as core::fmt::Debug>::fmt (578 samples, 0.27%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::fmt::format::format_inner (604 samples, 0.28%)rollup_coarse_measure-64f9a1d8b33892a3`core::fmt::write (591 samples, 0.28%)rollup_coarse_measure-64f9a1d8b33892a3`anyhow::__private::format_err (624 samples, 0.29%)libsystem_malloc.dylib`free (28 samples, 0.01%)libsystem_c.dylib`clock_gettime (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<prometheus::histogram::HistogramTimer as core::ops::drop::Drop>::drop (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (23 samples, 0.01%)libsystem_kernel.dylib`mach_absolute_time (46 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::start_timer (52 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (52 samples, 0.02%)libsystem_c.dylib`clock_gettime (52 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::vec::MetricVec<T>::with_label_values (32 samples, 0.01%)libsystem_malloc.dylib`free (23 samples, 0.01%)libdyld.dylib`tlv_get_addr (51 samples, 0.02%)libsystem_platform.dylib`_platform_memcmp (165 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (45 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (459 samples, 0.21%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_level (56 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::SaveValue (34 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::Get(rocksdb::LookupKey const&, void*, bool (*) (949 samples, 0.44%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::Get(rocksdb::LookupKey const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (971 samples, 0.45%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Version::Get(rocksdb::ReadOptions const&, rocksdb::LookupKey const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::TableCache::Get(rocksdb::ReadOptions const&, rocksdb::InternalKeyComparator const&, rocksdb::FileMetaData const&, rocksdb::Slice const&, rocksdb::GetContext*, std::__1::shared_ptr (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTable::Get (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::GetImpl (1,065 samples, 0.50%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::Get(rocksdb::ReadOptions const&, rocksdb::ColumnFamilyHandle*, rocksdb::Slice const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (1,079 samples, 0.51%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_get_pinned_cf (1,093 samples, 0.51%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::db::DBCommon<T,D>::get_cf (1,194 samples, 0.56%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::schema::tables::_<impl sov_rollup_interface::node::db::ValueCodec<sov_db::schema::tables::KeyHashToKey> for alloc::vec::Vec<u8>>::decode_value (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::get (1,416 samples, 0.66%)libsystem_platform.dylib`_platform_memmove (56 samples, 0.03%)libsystem_pthread.dylib`pthread_mutex_init (22 samples, 0.01%)libsystem_pthread.dylib`pthread_mutex_lock (36 samples, 0.02%)libsystem_kernel.dylib`mach_absolute_time (72 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (81 samples, 0.04%)libsystem_c.dylib`clock_gettime (81 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`<prometheus::histogram::HistogramTimer as core::ops::drop::Drop>::drop (92 samples, 0.04%)libsystem_malloc.dylib`nanov2_allocate (33 samples, 0.02%)libsystem_malloc.dylib`_malloc_zone_malloc (65 samples, 0.03%)libsystem_malloc.dylib`nanov2_malloc (51 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<std::sys::unix::locks::pthread_mutex::AllocatedMutex as std::sys_common::lazy_box::LazyInit>::init (98 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::RawVec<T,A>::reserve_for_push (80 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::finish_grow (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`core::hash::BuildHasher::hash_one (60 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (158 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::reserve_rehash (52 samples, 0.02%)libsystem_malloc.dylib`_malloc_zone_malloc (40 samples, 0.02%)libsystem_malloc.dylib`nanov2_malloc (35 samples, 0.02%)libsystem_kernel.dylib`mach_absolute_time (256 samples, 0.12%)libsystem_c.dylib`clock_gettime (278 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::start_timer (286 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (279 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::vec::MetricVec<T>::with_label_values (62 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::schema::tables::_<impl sov_rollup_interface::node::db::KeyEncoder<sov_db::schema::tables::JmtNodes> for jmt::node_type::NodeKey>::encode_key (27 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (103 samples, 0.05%)libsystem_malloc.dylib`szone_malloc_should_clear (91 samples, 0.04%)libsystem_malloc.dylib`small_malloc_should_clear (66 samples, 0.03%)libsystem_malloc.dylib`small_malloc_from_free_list (54 samples, 0.03%)libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (29 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::schema::tables::_<impl sov_rollup_interface::node::db::ValueCodec<sov_db::schema::tables::JmtNodes> for jmt::node_type::Node>::encode_value (466 samples, 0.22%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::Child as borsh::ser::BorshSerialize>::serialize (89 samples, 0.04%)libsystem_malloc.dylib`nanov2_pointer_size (28 samples, 0.01%)libsystem_malloc.dylib`free (78 samples, 0.04%)libsystem_malloc.dylib`nanov2_free_to_block (39 samples, 0.02%)libsystem_malloc.dylib`nanov2_pointer_size (23 samples, 0.01%)libsystem_malloc.dylib`small_size (23 samples, 0.01%)libsystem_malloc.dylib`free (150 samples, 0.07%)libsystem_malloc.dylib`szone_size (41 samples, 0.02%)libsystem_malloc.dylib`tiny_size (30 samples, 0.01%)libsystem_malloc.dylib`free_small (75 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`<hashbrown::raw::RawTable<T,A> as core::ops::drop::Drop>::drop (307 samples, 0.14%)libsystem_c.dylib`clock_gettime_nsec_np (24 samples, 0.01%)libsystem_kernel.dylib`mach_absolute_time (223 samples, 0.10%)libsystem_c.dylib`clock_gettime (267 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (268 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`<prometheus::histogram::HistogramTimer as core::ops::drop::Drop>::drop (285 samples, 0.13%)libsystem_malloc.dylib`_malloc_zone_malloc (34 samples, 0.02%)libsystem_malloc.dylib`nanov2_malloc (26 samples, 0.01%)libsystem_malloc.dylib`nanov2_allocate (22 samples, 0.01%)libc++abi.dylib`operator new(unsigned long) (37 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<rocksdb::db_options::WriteOptions as core::default::Default>::default (41 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_writeoptions_create (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`core::hash::BuildHasher::hash_one (45 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::observe (133 samples, 0.06%)libsystem_c.dylib`clock_gettime (183 samples, 0.09%)libsystem_kernel.dylib`mach_absolute_time (166 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::start_timer (190 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (184 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::vec::MetricVec<T>::with_label_values (101 samples, 0.05%)libsystem_malloc.dylib`free (29 samples, 0.01%)libdyld.dylib`tlv_get_addr (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::VersionEdit::~VersionEdit (31 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::port::CondVar::SignalAll (27 samples, 0.01%)libsystem_pthread.dylib`pthread_cond_broadcast (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::MarkLogsSynced (122 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::PreprocessWrite (80 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::WriteContext::~WriteContext (44 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`crc32c_arm64(unsigned int, unsigned char const*, unsigned long) (72 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::SetPerfLevel (38 samples, 0.02%)libsystem_kernel.dylib`write (17,633 samples, 8.25%)libsystem_k..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::PosixWritableFile::Append (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::WriteBuffered (17,770 samples, 8.32%)rollup_coars..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::Flush (17,859 samples, 8.36%)rollup_coars..libsystem_platform.dylib`_platform_memmove (29 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::Append (98 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::log::Writer::AddRecord (18,720 samples, 8.76%)rollup_coars..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::log::Writer::EmitPhysicalRecord (727 samples, 0.34%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::crc32c::Crc32cCombine (570 samples, 0.27%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::WriteToWAL (18,750 samples, 8.78%)rollup_coars..libdyld.dylib`tlv_get_addr (64 samples, 0.03%)libsystem_kernel.dylib`fsync (26,899 samples, 12.59%)libsystem_kernel.dy..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::PosixWritableFile::Sync (35 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::SyncInternal (27,146 samples, 12.71%)rollup_coarse_measu..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::Sync (27,206 samples, 12.74%)rollup_coarse_measu..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::WriteToWAL (46,080 samples, 21.57%)rollup_coarse_measure-64f9a1d8b338..rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::InstrumentedMutex::Lock (89 samples, 0.04%)libsystem_platform.dylib`_platform_memmove (126 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::MemTableInserter::CheckMemtableFull (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::BytewiseComparatorImpl::Compare (56 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::GetVarint32PtrFallback (107 samples, 0.05%)libdyld.dylib`tlv_get_addr (61 samples, 0.03%)libsystem_platform.dylib`_platform_memcmp (220 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`DYLD-STUB$$memcmp (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (97 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (576 samples, 0.27%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_level (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTableRep::KeyComparator::decode_key (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::InlineSkipList<rocksdb::MemTableRep::KeyComparator const&>::Insert<false>(char const*, rocksdb::InlineSkipList (1,447 samples, 0.68%)rollup_coarse_measure-64f9a1d8b33892a3`char* rocksdb::ConcurrentArena::AllocateImpl<rocksdb::ConcurrentArena::AllocateAligned(unsigned long, unsigned long, rocksdb::Logger*)::'lambda'()>(unsigned long, bool, rocksdb::ConcurrentArena::AllocateAligned(unsigned long, unsigned long, rocksdb::Logger*)::'lambda' (42 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::ConcurrentArena::AllocateAligned (62 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::Allocate (136 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (40 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::MemTableInserter::PutCFImpl(unsigned int, rocksdb::Slice const&, rocksdb::Slice const&, rocksdb::ValueType, rocksdb::ProtectionInfoKVOS (1,951 samples, 0.91%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::Add(unsigned long long, rocksdb::ValueType, rocksdb::Slice const&, rocksdb::Slice const&, rocksdb::ProtectionInfoKVOS (1,688 samples, 0.79%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::MemTableInserter::PutCF (1,992 samples, 0.93%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatchInternal::InsertInto (2,239 samples, 1.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatchInternal::Iterate (2,196 samples, 1.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::ReadRecordFromWriteBatch (136 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteThread::ExitAsBatchGroupLeader (55 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::port::Mutex::Unlock (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (46 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::WriteImpl (49,211 samples, 23.04%)rollup_coarse_measure-64f9a1d8b33892a..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::Write (49,342 samples, 23.10%)rollup_coarse_measure-64f9a1d8b33892a..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_write (49,371 samples, 23.11%)rollup_coarse_measure-64f9a1d8b33892a..libsystem_malloc.dylib`szone_size (23 samples, 0.01%)libsystem_malloc.dylib`free (52 samples, 0.02%)libsystem_malloc.dylib`free_tiny (85 samples, 0.04%)libsystem_malloc.dylib`tiny_free_no_lock (68 samples, 0.03%)libsystem_malloc.dylib`tiny_free_list_remove_ptr (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::db::DBCommon<T,rocksdb::db::DBWithThreadModeInner>::write_opt (49,715 samples, 23.27%)rollup_coarse_measure-64f9a1d8b33892a..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_writebatch_destroy (241 samples, 0.11%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatch::~WriteBatch (183 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_writebatch_create (54 samples, 0.03%)libsystem_malloc.dylib`nanov2_malloc (36 samples, 0.02%)libsystem_malloc.dylib`nanov2_allocate (28 samples, 0.01%)libsystem_malloc.dylib`szone_malloc_should_clear (68 samples, 0.03%)libsystem_malloc.dylib`tiny_malloc_should_clear (65 samples, 0.03%)libsystem_malloc.dylib`tiny_malloc_from_free_list (45 samples, 0.02%)libsystem_malloc.dylib`tiny_free_list_add_ptr (26 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (120 samples, 0.06%)libc++abi.dylib`operator new(unsigned long) (124 samples, 0.06%)libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__grow_by_and_replace (173 samples, 0.08%)libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append (290 samples, 0.14%)libsystem_platform.dylib`_platform_memmove (60 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatch::Put (398 samples, 0.19%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatchInternal::Put (344 samples, 0.16%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_writebatch_put_cf (410 samples, 0.19%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::write_schemas (51,652 samples, 24.18%)rollup_coarse_measure-64f9a1d8b33892a3..rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::put (53,302 samples, 24.95%)rollup_coarse_measure-64f9a1d8b33892a3`s..rollup_coarse_measure-64f9a1d8b33892a3`<sov_db::state_db::StateDB as jmt::writer::TreeWriter>::write_node_batch (55,446 samples, 25.95%)rollup_coarse_measure-64f9a1d8b33892a3`<s..rollup_coarse_measure-64f9a1d8b33892a3`<sov_state::witness::ArrayWitness as sov_state::witness::Witness>::add_hint (66 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`borsh::ser::BorshSerialize::try_to_vec (44 samples, 0.02%)libsystem_malloc.dylib`szone_size (25 samples, 0.01%)libsystem_malloc.dylib`tiny_size (23 samples, 0.01%)libsystem_malloc.dylib`free (87 samples, 0.04%)libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (32 samples, 0.01%)libsystem_malloc.dylib`free_small (79 samples, 0.04%)libsystem_malloc.dylib`tiny_free_list_remove_ptr (24 samples, 0.01%)libsystem_malloc.dylib`tiny_free_no_lock (240 samples, 0.11%)libsystem_malloc.dylib`tiny_madvise_free_range_no_lock (65 samples, 0.03%)libsystem_kernel.dylib`madvise (64 samples, 0.03%)libsystem_malloc.dylib`free_tiny (255 samples, 0.12%)libsystem_malloc.dylib`nanov2_free_to_block (51 samples, 0.02%)libsystem_malloc.dylib`szone_free_definite_size (31 samples, 0.01%)libsystem_malloc.dylib`free_small (25 samples, 0.01%)libsystem_malloc.dylib`free_tiny (41 samples, 0.02%)libsystem_malloc.dylib`tiny_free_no_lock (40 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<alloc::collections::btree::map::BTreeMap<K,V,A> as core::ops::drop::Drop>::drop (644 samples, 0.30%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::collections::btree::navigate::_<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next_unchecked (93 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`core::ptr::drop_in_place<jmt::writer::TreeUpdateBatch> (714 samples, 0.33%)libsystem_malloc.dylib`nanov2_pointer_size (42 samples, 0.02%)libsystem_malloc.dylib`free (116 samples, 0.05%)libsystem_malloc.dylib`free_tiny (95 samples, 0.04%)libsystem_malloc.dylib`tiny_free_no_lock (85 samples, 0.04%)libsystem_malloc.dylib`tiny_free_list_remove_ptr (23 samples, 0.01%)libsystem_malloc.dylib`nanov2_free_to_block (29 samples, 0.01%)libsystem_malloc.dylib`nanov2_realloc (39 samples, 0.02%)libsystem_malloc.dylib`szone_realloc (28 samples, 0.01%)libsystem_malloc.dylib`malloc_zone_realloc (93 samples, 0.04%)libsystem_malloc.dylib`realloc (109 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (148 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::finish_grow (128 samples, 0.06%)libsystem_malloc.dylib`_malloc_zone_malloc (51 samples, 0.02%)libsystem_malloc.dylib`nanov2_malloc (38 samples, 0.02%)libsystem_malloc.dylib`nanov2_allocate (34 samples, 0.02%)libsystem_malloc.dylib`nanov2_allocate_from_block (29 samples, 0.01%)libsystem_malloc.dylib`nanov2_allocate (33 samples, 0.02%)libsystem_malloc.dylib`_malloc_zone_malloc (58 samples, 0.03%)libsystem_malloc.dylib`nanov2_malloc (44 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::RawVec<T,A>::reserve_for_push (103 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::finish_grow (81 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::generate_bitmaps (113 samples, 0.05%)libsystem_platform.dylib`_platform_memset (45 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`digest::FixedOutput::finalize_fixed (32 samples, 0.01%)libsystem_platform.dylib`_platform_memset (66 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`digest::FixedOutput::finalize_fixed (50 samples, 0.02%)libsystem_platform.dylib`_platform_memset (68 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`anyhow::context::_<impl anyhow::Context<T,core::convert::Infallible> for core::option::Option<T>>::with_context (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (71 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (3,405 samples, 1.59%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (3,030 samples, 1.42%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (9,772 samples, 4.57%)rollu..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (6,114 samples, 2.86%)ro..rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (15,538 samples, 7.27%)rollup_coa..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (5,594 samples, 2.62%)ro..rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::get_child_with_siblings (18,321 samples, 8.58%)rollup_coars..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (2,428 samples, 1.14%)libsystem_malloc.dylib`free (70 samples, 0.03%)libsystem_malloc.dylib`tiny_free_list_add_ptr (34 samples, 0.02%)libsystem_malloc.dylib`free_tiny (91 samples, 0.04%)libsystem_malloc.dylib`tiny_free_no_lock (82 samples, 0.04%)libsystem_malloc.dylib`tiny_free_list_remove_ptr (22 samples, 0.01%)libsystem_platform.dylib`_platform_memmove (50 samples, 0.02%)libsystem_kernel.dylib`mach_absolute_time (106 samples, 0.05%)libsystem_c.dylib`clock_gettime (125 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (126 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`<prometheus::histogram::HistogramTimer as core::ops::drop::Drop>::drop (177 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::observe (50 samples, 0.02%)libsystem_c.dylib`clock_gettime (263 samples, 0.12%)libsystem_kernel.dylib`mach_absolute_time (235 samples, 0.11%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::start_timer (273 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (266 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::vec::MetricVec<T>::with_label_values (125 samples, 0.06%)libsystem_malloc.dylib`nanov2_allocate (22 samples, 0.01%)libsystem_malloc.dylib`nanov2_malloc (30 samples, 0.01%)libsystem_malloc.dylib`set_tiny_meta_header_in_use (26 samples, 0.01%)libsystem_malloc.dylib`szone_malloc_should_clear (85 samples, 0.04%)libsystem_malloc.dylib`tiny_malloc_should_clear (81 samples, 0.04%)libsystem_malloc.dylib`tiny_malloc_from_free_list (43 samples, 0.02%)libsystem_malloc.dylib`_malloc_zone_malloc (124 samples, 0.06%)libsystem_malloc.dylib`nanov2_pointer_size (51 samples, 0.02%)libsystem_malloc.dylib`free (127 samples, 0.06%)libsystem_malloc.dylib`free_small (27 samples, 0.01%)libsystem_malloc.dylib`nanov2_free_to_block (27 samples, 0.01%)libsystem_malloc.dylib`nanov2_allocate (45 samples, 0.02%)libsystem_malloc.dylib`nanov2_allocate_from_block (28 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (66 samples, 0.03%)libsystem_malloc.dylib`nanov2_malloc (51 samples, 0.02%)libc++abi.dylib`operator new(unsigned long) (71 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`<rocksdb::db_options::ReadOptions as core::default::Default>::default (108 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_readoptions_create (90 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`<rocksdb::db_pinnable_slice::DBPinnableSlice as core::convert::AsRef<[u8]>>::as_ref (100 samples, 0.05%)libsystem_malloc.dylib`nanov2_allocate_from_block (25 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (74 samples, 0.03%)libsystem_malloc.dylib`nanov2_malloc (58 samples, 0.03%)libsystem_malloc.dylib`nanov2_allocate (53 samples, 0.02%)libc++abi.dylib`operator new(unsigned long) (78 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::FailIfCfHasTs (25 samples, 0.01%)libdyld.dylib`tlv_get_addr (37 samples, 0.02%)libsystem_platform.dylib`_platform_memmove (50 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::ThreadLocalPtr::StaticMeta::CompareAndSwap (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::ColumnFamilyData::ReturnThreadLocalSuperVersion (41 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::FailIfCfHasTs (45 samples, 0.02%)libdyld.dylib`tlv_get_addr (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::BytewiseComparatorImpl::Compare (94 samples, 0.04%)libdyld.dylib`tlv_get_addr (209 samples, 0.10%)libsystem_platform.dylib`_platform_memcmp (781 samples, 0.37%)rollup_coarse_measure-64f9a1d8b33892a3`DYLD-STUB$$memcmp (80 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (204 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (1,583 samples, 0.74%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_level (162 samples, 0.08%)libsystem_malloc.dylib`szone_malloc_should_clear (46 samples, 0.02%)libsystem_malloc.dylib`tiny_malloc_should_clear (40 samples, 0.02%)libsystem_malloc.dylib`tiny_malloc_from_free_list (25 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (65 samples, 0.03%)libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__grow_by_and_replace (90 samples, 0.04%)libc++abi.dylib`operator new(unsigned long) (72 samples, 0.03%)libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__assign_external (155 samples, 0.07%)libsystem_platform.dylib`_platform_memmove (54 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::SaveValue (276 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::Get(rocksdb::LookupKey const&, void*, bool (*) (3,093 samples, 1.45%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (58 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::Get(rocksdb::LookupKey const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (3,270 samples, 1.53%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::FindFileInRange (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::FilePicker::PrepareNextLevel (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::FilePicker::GetNextFile (64 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Block::NewIndexIterator (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::IndexBlockIter::Initialize (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTable::IndexReaderCommon::GetOrReadIndexBlock(bool, rocksdb::Env::IOPriority, rocksdb::GetContext*, rocksdb::BlockCacheLookupContext*, rocksdb::CachableEntry (32 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BinarySearchIndexReader::NewIterator (72 samples, 0.03%)libsystem_platform.dylib`_platform_memcmp (172 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`DYLD-STUB$$memcmp (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::BlockIter<rocksdb::IndexValue>::BinarySeek<rocksdb::DecodeKeyV4> (492 samples, 0.23%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::IndexValue>::CompareCurrentKey (224 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::IndexBlockIter::DecodeCurrentValue (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::IndexBlockIter::NextImpl (44 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::Slice>::Seek (570 samples, 0.27%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::IndexBlockIter::SeekImpl (563 samples, 0.26%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Block::NewDataIterator (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`crc32c_arm64(unsigned int, unsigned char const*, unsigned long) (154 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockFetcher::ProcessTrailerIfPresent (163 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::VerifyBlockChecksum(rocksdb::ChecksumType, char const*, unsigned long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (163 samples, 0.08%)libsystem_kernel.dylib`pread (1,027 samples, 0.48%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::RandomAccessFileReader::Read(rocksdb::IOOptions const&, unsigned long long, unsigned long, rocksdb::Slice*, char*, std::__1::unique_ptr<char [], std::__1::default_delete (1,057 samples, 0.49%)libsystem_malloc.dylib`small_free_list_add_ptr (48 samples, 0.02%)libc++abi.dylib`operator new(unsigned long) (96 samples, 0.04%)libsystem_malloc.dylib`_malloc_zone_malloc (96 samples, 0.04%)libsystem_malloc.dylib`szone_malloc_should_clear (91 samples, 0.04%)libsystem_malloc.dylib`small_malloc_should_clear (89 samples, 0.04%)libsystem_malloc.dylib`small_malloc_from_free_list (81 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`LZ4_decompress_safe_continue (872 samples, 0.41%)rollup_coarse_measure-64f9a1d8b33892a3`LZ4_decompress_safe (864 samples, 0.40%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::UncompressBlockContentsForCompressionType (1,003 samples, 0.47%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::LZ4_Uncompress (992 samples, 0.46%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockFetcher::ReadBlockContents (2,273 samples, 1.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::lru_cache::LRUCacheShard::Lookup(rocksdb::Slice const&, unsigned int, rocksdb::Cache::CacheItemHelper const*, std::__1::function<rocksdb::Status (52 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::GetDataBlockFromCache<rocksdb::Block>(rocksdb::Slice const&, rocksdb::Cache*, rocksdb::Cache*, rocksdb::ReadOptions const&, rocksdb::CachableEntry (124 samples, 0.06%)libc++abi.dylib`operator new(unsigned long) (22 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Block::Block (33 samples, 0.02%)libsystem_malloc.dylib`nanov2_allocate (34 samples, 0.02%)libsystem_malloc.dylib`nanov2_find_block_and_allocate (27 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (38 samples, 0.02%)libsystem_malloc.dylib`nanov2_malloc (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::lru_cache::LRUCacheShard::Insert (40 samples, 0.02%)libc++abi.dylib`operator new(unsigned long) (39 samples, 0.02%)libsystem_malloc.dylib`free (30 samples, 0.01%)libsystem_malloc.dylib`nanov2_free_to_block (24 samples, 0.01%)libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (22 samples, 0.01%)libsystem_kernel.dylib`madvise (36 samples, 0.02%)libsystem_malloc.dylib`free_small (125 samples, 0.06%)libsystem_malloc.dylib`small_madvise_free_range_no_lock (37 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::cache_entry_roles_detail::RegisteredDeleter<rocksdb::Block, (rocksdb::CacheEntryRole)0>::Delete (145 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Block::~Block (138 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::PutDataBlockToCache<rocksdb::Block>(rocksdb::Slice const&, rocksdb::Cache*, rocksdb::Cache*, rocksdb::CachableEntry (415 samples, 0.19%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::lru_cache::LRUCacheShard::InsertItem (262 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::MaybeReadBlockAndLoadToCache<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, bool, bool, rocksdb::CachableEntry (2,892 samples, 1.35%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::RetrieveBlock<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, rocksdb::CachableEntry (2,911 samples, 1.36%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter* rocksdb::BlockBasedTable::NewDataBlockIterator<rocksdb::DataBlockIter> (2,999 samples, 1.40%)libsystem_platform.dylib`_platform_memcmp (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::BlockIter<rocksdb::IndexValue>::BinarySeek<rocksdb::DecodeKey> (68 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::IndexValue>::CompareCurrentKey (37 samples, 0.02%)libsystem_platform.dylib`_platform_memcmp (50 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::IndexValue>::CompareCurrentKey (132 samples, 0.06%)libsystem_platform.dylib`_platform_memmove (49 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::BlockIter<rocksdb::IndexValue>::ParseNextKey<rocksdb::DecodeEntry> (51 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter::NextImpl (126 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::GetVarint32PtrFallback (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter::SeekImpl (377 samples, 0.18%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter::~DataBlockIter (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::GetContext::SaveValue (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::IndexBlockIter::~IndexBlockIter (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTable::Get (4,190 samples, 1.96%)r..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::TableCache::Get(rocksdb::ReadOptions const&, rocksdb::InternalKeyComparator const&, rocksdb::FileMetaData const&, rocksdb::Slice const&, rocksdb::GetContext*, std::__1::shared_ptr (4,216 samples, 1.97%)r..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Version::Get(rocksdb::ReadOptions const&, rocksdb::LookupKey const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (4,367 samples, 2.04%)r..rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (69 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::GetImpl (8,114 samples, 3.80%)roll..rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_level (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::Get(rocksdb::ReadOptions const&, rocksdb::ColumnFamilyHandle*, rocksdb::Slice const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (8,197 samples, 3.84%)roll..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_get_pinned_cf (8,291 samples, 3.88%)roll..libsystem_malloc.dylib`free (35 samples, 0.02%)libsystem_malloc.dylib`free_tiny (47 samples, 0.02%)libsystem_malloc.dylib`tiny_free_no_lock (34 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::lru_cache::LRUCacheShard::Release (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Cleanable::~Cleanable (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_pinnableslice_destroy (128 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::db::DBCommon<T,D>::get_cf (9,090 samples, 4.26%)rollu..libsystem_malloc.dylib`_malloc_zone_malloc (41 samples, 0.02%)libsystem_malloc.dylib`szone_malloc_should_clear (32 samples, 0.01%)libsystem_malloc.dylib`small_malloc_should_clear (30 samples, 0.01%)libsystem_malloc.dylib`small_malloc_from_free_list (26 samples, 0.01%)libsystem_platform.dylib`_platform_memmove (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::schema::tables::_<impl sov_rollup_interface::node::db::KeyEncoder<sov_db::schema::tables::JmtNodes> for jmt::node_type::NodeKey>::encode_key (84 samples, 0.04%)libsystem_platform.dylib`_platform_memmove (132 samples, 0.06%)libsystem_malloc.dylib`szone_malloc_should_clear (81 samples, 0.04%)libsystem_malloc.dylib`tiny_malloc_should_clear (74 samples, 0.03%)libsystem_malloc.dylib`tiny_malloc_from_free_list (42 samples, 0.02%)libsystem_malloc.dylib`_malloc_zone_malloc (101 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`<[T (661 samples, 0.31%) N] as borsh::de::BorshDeserialize>::deserialize_reader::ArrayDropGuard<T,_>::fill_buffer (661 samples, 0.31%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::Child as borsh::de::BorshDeserialize>::deserialize_reader (301 samples, 0.14%)rollup_coarse_measure-64f9a1d8b33892a3`<alloc::boxed::Box<T> as borsh::de::BorshDeserialize>::deserialize_reader (867 samples, 0.41%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::Child as borsh::de::BorshDeserialize>::deserialize_reader (81 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::schema::tables::_<impl sov_rollup_interface::node::db::ValueCodec<sov_db::schema::tables::JmtNodes> for jmt::node_type::Node>::decode_value (1,041 samples, 0.49%)libsystem_platform.dylib`_platform_memcmp (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::get_cf_handle (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::get (11,272 samples, 5.28%)rollup..rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::get_with_proof (30,150 samples, 14.11%)rollup_coarse_measure..libsystem_platform.dylib`_platform_memmove (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::sync::Arc<T>::drop_slow (58 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::map::HashMap<K,V,S,A>::insert (76 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::insert (49 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::reserve_rehash (40 samples, 0.02%)libsystem_malloc.dylib`free_tiny (24 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::InternalNode as core::clone::Clone>::clone (90 samples, 0.04%)libsystem_platform.dylib`_platform_memset (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (1,652 samples, 0.77%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (1,530 samples, 0.72%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (3,907 samples, 1.83%)r..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (2,210 samples, 1.03%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (5,101 samples, 2.39%)ro..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (1,168 samples, 0.55%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (5,680 samples, 2.66%)ro..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (566 samples, 0.26%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::NodeKey::gen_child_node_key (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::RawVec<T,A>::reserve_for_push (26 samples, 0.01%)libsystem_malloc.dylib`free_tiny (25 samples, 0.01%)libsystem_malloc.dylib`tiny_free_no_lock (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::InternalNode as core::clone::Clone>::clone (72 samples, 0.03%)libsystem_platform.dylib`_platform_memset (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (1,564 samples, 0.73%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (1,422 samples, 0.67%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (3,745 samples, 1.75%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (2,120 samples, 0.99%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (4,809 samples, 2.25%)r..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (1,032 samples, 0.48%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (5,368 samples, 2.51%)ro..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (546 samples, 0.26%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::Node::hash (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::generate_bitmaps (26 samples, 0.01%)libsystem_malloc.dylib`free_tiny (33 samples, 0.02%)libsystem_malloc.dylib`tiny_free_no_lock (29 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::Children as core::convert::From<jmt::node_type::InternalNode>>::from (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::InternalNode as core::clone::Clone>::clone (58 samples, 0.03%)libsystem_platform.dylib`_platform_memset (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (1,408 samples, 0.66%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (1,274 samples, 0.60%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (3,231 samples, 1.51%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (1,782 samples, 0.83%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (4,224 samples, 1.98%)r..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (964 samples, 0.45%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (4,744 samples, 2.22%)r..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (496 samples, 0.23%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::Node::hash (43 samples, 0.02%)libsystem_malloc.dylib`_malloc_zone_malloc (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::RawVec<T,A>::reserve_for_push (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::NodeKey::gen_child_node_key (55 samples, 0.03%)libsystem_malloc.dylib`free_tiny (26 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::InternalNode as core::clone::Clone>::clone (72 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (445 samples, 0.21%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (377 samples, 0.18%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (1,267 samples, 0.59%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (769 samples, 0.36%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (1,889 samples, 0.88%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (594 samples, 0.28%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (2,299 samples, 1.08%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (403 samples, 0.19%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::new (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::new_impl (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::generate_bitmaps (53 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::Node::hash (118 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::NodeKey::gen_child_node_key (31 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (25 samples, 0.01%)libsystem_malloc.dylib`nanov2_malloc (22 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (25 samples, 0.01%)libsystem_malloc.dylib`szone_malloc_should_clear (23 samples, 0.01%)libsystem_malloc.dylib`tiny_malloc_should_clear (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::InternalNode as core::clone::Clone>::clone (110 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (42 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (100 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (49 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::merkle_hash (193 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (91 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::new (44 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::InternalNode::new_impl (44 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::Node::hash (121 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (97 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::NodeKey::gen_child_node_key (37 samples, 0.02%)libsystem_malloc.dylib`realloc (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::RawVec<T,A>::reserve_for_push (41 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::finish_grow (34 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::create_leaf_node (135 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::types::nibble::nibble_path::NibbleIterator::get_nibble_path (104 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::insert_at_leaf_node (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockFetcher::ReadBlockContents (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter* rocksdb::BlockBasedTable::NewDataBlockIterator<rocksdb::DataBlockIter> (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::RetrieveBlock<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, rocksdb::CachableEntry (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::MaybeReadBlockAndLoadToCache<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, bool, bool, rocksdb::CachableEntry (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTable::Get (44 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::db::DBCommon<T,D>::get_cf (50 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_get_pinned_cf (49 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::Get(rocksdb::ReadOptions const&, rocksdb::ColumnFamilyHandle*, rocksdb::Slice const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (48 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::GetImpl (48 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Version::Get(rocksdb::ReadOptions const&, rocksdb::LookupKey const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (46 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::TableCache::Get(rocksdb::ReadOptions const&, rocksdb::InternalKeyComparator const&, rocksdb::FileMetaData const&, rocksdb::Slice const&, rocksdb::GetContext*, std::__1::shared_ptr (45 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::insert_at (80 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::get_node_option (56 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_state::tree_db::TreeReadLogger<W> as jmt::reader::TreeReader>::get_node_option (54 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::get (52 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::InternalNode as core::clone::Clone>::clone (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::LeafNode::hash (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (31 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::node_type::Node::hash (40 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (37 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::put_node (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::RawVec<T,A>::reserve_for_push (39 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::finish_grow (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::create_leaf_node (113 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::types::nibble::nibble_path::NibbleIterator::get_nibble_path (76 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::delete_node (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::put_node (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::insert_at_leaf_node (515 samples, 0.24%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (120 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::Get(rocksdb::LookupKey const&, void*, bool (*) (87 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::Get(rocksdb::LookupKey const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (90 samples, 0.04%)libsystem_platform.dylib`_platform_memcmp (54 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::BlockIter<rocksdb::IndexValue>::BinarySeek<rocksdb::DecodeKeyV4> (149 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::IndexValue>::CompareCurrentKey (63 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::Slice>::Seek (163 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::IndexBlockIter::SeekImpl (163 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`crc32c_arm64(unsigned int, unsigned char const*, unsigned long) (37 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockFetcher::ProcessTrailerIfPresent (43 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::VerifyBlockChecksum(rocksdb::ChecksumType, char const*, unsigned long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (42 samples, 0.02%)libsystem_kernel.dylib`pread (286 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::RandomAccessFileReader::Read(rocksdb::IOOptions const&, unsigned long long, unsigned long, rocksdb::Slice*, char*, std::__1::unique_ptr<char [], std::__1::default_delete (304 samples, 0.14%)libc++abi.dylib`operator new(unsigned long) (30 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (30 samples, 0.01%)libsystem_malloc.dylib`szone_malloc_should_clear (29 samples, 0.01%)libsystem_malloc.dylib`small_malloc_should_clear (29 samples, 0.01%)libsystem_malloc.dylib`small_malloc_from_free_list (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`LZ4_decompress_safe_continue (193 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`LZ4_decompress_safe (192 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::UncompressBlockContentsForCompressionType (236 samples, 0.11%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::LZ4_Uncompress (230 samples, 0.11%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockFetcher::ReadBlockContents (601 samples, 0.28%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::GetDataBlockFromCache<rocksdb::Block>(rocksdb::Slice const&, rocksdb::Cache*, rocksdb::Cache*, rocksdb::ReadOptions const&, rocksdb::CachableEntry (31 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::cache_entry_roles_detail::RegisteredDeleter<rocksdb::Block, (rocksdb::CacheEntryRole)0>::Delete (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Block::~Block (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::lru_cache::LRUCacheShard::InsertItem (65 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::PutDataBlockToCache<rocksdb::Block>(rocksdb::Slice const&, rocksdb::Cache*, rocksdb::Cache*, rocksdb::CachableEntry (113 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::MaybeReadBlockAndLoadToCache<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, bool, bool, rocksdb::CachableEntry (767 samples, 0.36%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::RetrieveBlock<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, rocksdb::CachableEntry (772 samples, 0.36%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter* rocksdb::BlockBasedTable::NewDataBlockIterator<rocksdb::DataBlockIter> (790 samples, 0.37%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::BlockIter<rocksdb::IndexValue>::BinarySeek<rocksdb::DecodeKey> (34 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::IndexValue>::CompareCurrentKey (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter::NextImpl (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter::SeekImpl (102 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTable::Get (1,117 samples, 0.52%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Version::Get(rocksdb::ReadOptions const&, rocksdb::LookupKey const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (1,160 samples, 0.54%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::TableCache::Get(rocksdb::ReadOptions const&, rocksdb::InternalKeyComparator const&, rocksdb::FileMetaData const&, rocksdb::Slice const&, rocksdb::GetContext*, std::__1::shared_ptr (1,124 samples, 0.53%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::GetImpl (1,271 samples, 0.59%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_get_pinned_cf (1,287 samples, 0.60%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::Get(rocksdb::ReadOptions const&, rocksdb::ColumnFamilyHandle*, rocksdb::Slice const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (1,277 samples, 0.60%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::db::DBCommon<T,D>::get_cf (1,329 samples, 0.62%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_state::tree_db::TreeReadLogger<W> as jmt::reader::TreeReader>::get_node_option (1,457 samples, 0.68%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::get (1,414 samples, 0.66%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::get_node_option (1,473 samples, 0.69%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::insert_at (2,189 samples, 1.02%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::insert_at_leaf_node (137 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::map::HashMap<K,V,S,A>::insert (60 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::insert (40 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::reserve_rehash (37 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`core::hash::BuildHasher::hash_one (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::delete_node (111 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::Node as core::clone::Clone>::clone (24 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (32 samples, 0.01%)libsystem_malloc.dylib`szone_malloc_should_clear (30 samples, 0.01%)libsystem_malloc.dylib`small_malloc_should_clear (28 samples, 0.01%)libsystem_malloc.dylib`small_malloc_from_free_list (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_state::witness::ArrayWitness as sov_state::witness::Witness>::add_hint (43 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`borsh::ser::BorshSerialize::try_to_vec (60 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`<prometheus::histogram::HistogramTimer as core::ops::drop::Drop>::drop (29 samples, 0.01%)libsystem_c.dylib`clock_gettime (38 samples, 0.02%)libsystem_kernel.dylib`mach_absolute_time (37 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::start_timer (40 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (39 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::vec::MetricVec<T>::with_label_values (28 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (28 samples, 0.01%)libsystem_malloc.dylib`free (23 samples, 0.01%)libdyld.dylib`tlv_get_addr (24 samples, 0.01%)libsystem_platform.dylib`_platform_memcmp (178 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (264 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::Get(rocksdb::LookupKey const&, void*, bool (*) (567 samples, 0.27%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::SaveValue (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::Get(rocksdb::LookupKey const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (598 samples, 0.28%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BinarySearchIndexReader::NewIterator (27 samples, 0.01%)libsystem_platform.dylib`_platform_memcmp (84 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::BlockIter<rocksdb::IndexValue>::BinarySeek<rocksdb::DecodeKeyV4> (219 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::IndexValue>::CompareCurrentKey (105 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::Slice>::Seek (237 samples, 0.11%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::IndexBlockIter::SeekImpl (236 samples, 0.11%)rollup_coarse_measure-64f9a1d8b33892a3`crc32c_arm64(unsigned int, unsigned char const*, unsigned long) (60 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::VerifyBlockChecksum(rocksdb::ChecksumType, char const*, unsigned long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (67 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockFetcher::ProcessTrailerIfPresent (74 samples, 0.03%)libsystem_kernel.dylib`pread (440 samples, 0.21%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::RandomAccessFileReader::Read(rocksdb::IOOptions const&, unsigned long long, unsigned long, rocksdb::Slice*, char*, std::__1::unique_ptr<char [], std::__1::default_delete (467 samples, 0.22%)libsystem_malloc.dylib`small_free_list_add_ptr (31 samples, 0.01%)libc++abi.dylib`operator new(unsigned long) (49 samples, 0.02%)libsystem_malloc.dylib`_malloc_zone_malloc (49 samples, 0.02%)libsystem_malloc.dylib`szone_malloc_should_clear (48 samples, 0.02%)libsystem_malloc.dylib`small_malloc_should_clear (47 samples, 0.02%)libsystem_malloc.dylib`small_malloc_from_free_list (46 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`LZ4_decompress_safe_continue (325 samples, 0.15%)rollup_coarse_measure-64f9a1d8b33892a3`LZ4_decompress_safe (324 samples, 0.15%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::UncompressBlockContentsForCompressionType (393 samples, 0.18%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::LZ4_Uncompress (390 samples, 0.18%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockFetcher::ReadBlockContents (969 samples, 0.45%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::lru_cache::LRUCacheShard::Lookup(rocksdb::Slice const&, unsigned int, rocksdb::Cache::CacheItemHelper const*, std::__1::function<rocksdb::Status (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::GetDataBlockFromCache<rocksdb::Block>(rocksdb::Slice const&, rocksdb::Cache*, rocksdb::Cache*, rocksdb::ReadOptions const&, rocksdb::CachableEntry (67 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::cache_entry_roles_detail::RegisteredDeleter<rocksdb::Block, (rocksdb::CacheEntryRole)0>::Delete (34 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Block::~Block (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::lru_cache::LRUCacheShard::InsertItem (88 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::PutDataBlockToCache<rocksdb::Block>(rocksdb::Slice const&, rocksdb::Cache*, rocksdb::Cache*, rocksdb::CachableEntry (148 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::RetrieveBlock<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, rocksdb::CachableEntry (1,238 samples, 0.58%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::MaybeReadBlockAndLoadToCache<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, bool, bool, rocksdb::CachableEntry (1,228 samples, 0.57%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter* rocksdb::BlockBasedTable::NewDataBlockIterator<rocksdb::DataBlockIter> (1,262 samples, 0.59%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::BlockIter<rocksdb::IndexValue>::BinarySeek<rocksdb::DecodeKey> (35 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::IndexValue>::CompareCurrentKey (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter::NextImpl (50 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter::SeekImpl (133 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTable::Get (1,725 samples, 0.81%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::TableCache::Get(rocksdb::ReadOptions const&, rocksdb::InternalKeyComparator const&, rocksdb::FileMetaData const&, rocksdb::Slice const&, rocksdb::GetContext*, std::__1::shared_ptr (1,738 samples, 0.81%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Version::Get(rocksdb::ReadOptions const&, rocksdb::LookupKey const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (1,797 samples, 0.84%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::GetImpl (2,464 samples, 1.15%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::Get(rocksdb::ReadOptions const&, rocksdb::ColumnFamilyHandle*, rocksdb::Slice const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (2,489 samples, 1.17%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_get_pinned_cf (2,510 samples, 1.17%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::db::DBCommon<T,D>::get_cf (2,629 samples, 1.23%)libsystem_platform.dylib`_platform_memmove (41 samples, 0.02%)libsystem_malloc.dylib`szone_malloc_should_clear (34 samples, 0.02%)libsystem_malloc.dylib`tiny_malloc_should_clear (33 samples, 0.02%)libsystem_malloc.dylib`tiny_malloc_from_free_list (24 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<[T (125 samples, 0.06%) N] as borsh::de::BorshDeserialize>::deserialize_reader::ArrayDropGuard<T,_>::fill_buffer (125 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::Child as borsh::de::BorshDeserialize>::deserialize_reader (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<alloc::boxed::Box<T> as borsh::de::BorshDeserialize>::deserialize_reader (172 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::schema::tables::_<impl sov_rollup_interface::node::db::ValueCodec<sov_db::schema::tables::JmtNodes> for jmt::node_type::Node>::decode_value (223 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::get (3,053 samples, 1.43%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_state::tree_db::TreeReadLogger<W> as jmt::reader::TreeReader>::get_node_option (3,203 samples, 1.50%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::get_node_option (3,286 samples, 1.54%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::put_node (87 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (81 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::reserve_rehash (54 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`core::hash::BuildHasher::hash_one (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::insert_at (6,705 samples, 3.14%)rol..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (162 samples, 0.08%)libsystem_malloc.dylib`free_tiny (35 samples, 0.02%)libsystem_malloc.dylib`tiny_free_no_lock (32 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::map::HashMap<K,V,S,A>::insert (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::insert (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::reserve_rehash (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::delete_node (139 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::remove_entry (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::Node as core::clone::Clone>::clone (186 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`borsh::ser::BorshSerialize::try_to_vec (25 samples, 0.01%)libsystem_platform.dylib`_platform_memcmp (136 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (201 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::Get(rocksdb::LookupKey const&, void*, bool (*) (372 samples, 0.17%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::SaveValue (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::Get(rocksdb::LookupKey const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (387 samples, 0.18%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::Slice>::Seek (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::IndexBlockIter::SeekImpl (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::UncompressBlockContentsForCompressionType (29 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::LZ4_Uncompress (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`LZ4_decompress_safe_continue (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`LZ4_decompress_safe (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockFetcher::ReadBlockContents (57 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::RetrieveBlock<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, rocksdb::CachableEntry (68 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::MaybeReadBlockAndLoadToCache<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, bool, bool, rocksdb::CachableEntry (68 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter* rocksdb::BlockBasedTable::NewDataBlockIterator<rocksdb::DataBlockIter> (69 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Version::Get(rocksdb::ReadOptions const&, rocksdb::LookupKey const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (116 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::TableCache::Get(rocksdb::ReadOptions const&, rocksdb::InternalKeyComparator const&, rocksdb::FileMetaData const&, rocksdb::Slice const&, rocksdb::GetContext*, std::__1::shared_ptr (114 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTable::Get (113 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::GetImpl (541 samples, 0.25%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::Get(rocksdb::ReadOptions const&, rocksdb::ColumnFamilyHandle*, rocksdb::Slice const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (546 samples, 0.26%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_get_pinned_cf (556 samples, 0.26%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::db::DBCommon<T,D>::get_cf (616 samples, 0.29%)rollup_coarse_measure-64f9a1d8b33892a3`<[T (50 samples, 0.02%) N] as borsh::de::BorshDeserialize>::deserialize_reader::ArrayDropGuard<T,_>::fill_buffer (50 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::Child as borsh::de::BorshDeserialize>::deserialize_reader (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<alloc::boxed::Box<T> as borsh::de::BorshDeserialize>::deserialize_reader (74 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::schema::tables::_<impl sov_rollup_interface::node::db::ValueCodec<sov_db::schema::tables::JmtNodes> for jmt::node_type::Node>::decode_value (88 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::get (793 samples, 0.37%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_state::tree_db::TreeReadLogger<W> as jmt::reader::TreeReader>::get_node_option (878 samples, 0.41%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::get_node_option (1,145 samples, 0.54%)rollup_coarse_measure-64f9a1d8b33892a3`core::hash::BuildHasher::hash_one (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::put_node (106 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (101 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::reserve_rehash (63 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`core::hash::BuildHasher::hash_one (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::insert_at (11,023 samples, 5.16%)rollup..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (168 samples, 0.08%)libsystem_malloc.dylib`free_tiny (40 samples, 0.02%)libsystem_malloc.dylib`tiny_free_no_lock (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::delete_node (108 samples, 0.05%)libsystem_malloc.dylib`_malloc_zone_malloc (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::Node as core::clone::Clone>::clone (211 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_get_pinned_cf (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::Get(rocksdb::ReadOptions const&, rocksdb::ColumnFamilyHandle*, rocksdb::Slice const&, rocksdb::PinnableSlice*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::GetImpl (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::db::DBCommon<T,D>::get_cf (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_state::tree_db::TreeReadLogger<W> as jmt::reader::TreeReader>::get_node_option (50 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::get (43 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::get_node_option (299 samples, 0.14%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::put_node (55 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (49 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::insert_at (16,715 samples, 7.82%)rollup_coar..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (144 samples, 0.07%)libsystem_malloc.dylib`free_tiny (44 samples, 0.02%)libsystem_malloc.dylib`tiny_free_no_lock (39 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::delete_node (116 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::Node as core::clone::Clone>::clone (90 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::get_node_option (149 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::put_node (39 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::insert_at (22,812 samples, 10.68%)rollup_coarse_me..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (160 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::delete_node (63 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`<jmt::node_type::Node as core::clone::Clone>::clone (72 samples, 0.03%)libsystem_malloc.dylib`_malloc_zone_malloc (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (43 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::get_node_option (177 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`core::hash::BuildHasher::hash_one (29 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::put_node (49 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (42 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::insert_at (29,226 samples, 13.68%)rollup_coarse_measure..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (195 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::put (29,339 samples, 13.73%)rollup_coarse_measure..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (441 samples, 0.21%)libsystem_pthread.dylib`pthread_mutexattr_settype (25 samples, 0.01%)libsystem_c.dylib`clock_gettime (28 samples, 0.01%)libsystem_kernel.dylib`mach_absolute_time (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<prometheus::histogram::HistogramTimer as core::ops::drop::Drop>::drop (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (29 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::raw_vec::RawVec<T,A>::reserve_for_push (31 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (29 samples, 0.01%)libsystem_c.dylib`clock_gettime (69 samples, 0.03%)libsystem_kernel.dylib`mach_absolute_time (66 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::start_timer (71 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (70 samples, 0.03%)libsystem_malloc.dylib`_malloc_zone_malloc (49 samples, 0.02%)libsystem_malloc.dylib`szone_malloc_should_clear (47 samples, 0.02%)libsystem_malloc.dylib`small_malloc_should_clear (45 samples, 0.02%)libsystem_malloc.dylib`small_malloc_from_free_list (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::schema::tables::_<impl sov_rollup_interface::node::db::ValueCodec<sov_db::schema::tables::KeyHashToKey> for alloc::vec::Vec<u8>>::encode_value (51 samples, 0.02%)libsystem_malloc.dylib`free (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<hashbrown::raw::RawTable<T,A> as core::ops::drop::Drop>::drop (51 samples, 0.02%)libsystem_c.dylib`clock_gettime (32 samples, 0.01%)libsystem_kernel.dylib`mach_absolute_time (32 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<prometheus::histogram::HistogramTimer as core::ops::drop::Drop>::drop (34 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::observe (29 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::start_timer (60 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (58 samples, 0.03%)libsystem_c.dylib`clock_gettime (58 samples, 0.03%)libsystem_kernel.dylib`mach_absolute_time (53 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::vec::MetricVec<T>::with_label_values (29 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::MarkLogsSynced (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::PreprocessWrite (30 samples, 0.01%)libsystem_kernel.dylib`write (5,235 samples, 2.45%)li..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::WriteBuffered (5,297 samples, 2.48%)ro..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::Flush (5,325 samples, 2.49%)ro..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::Append (37 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::crc32c::Crc32cCombine (123 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::log::Writer::AddRecord (5,543 samples, 2.59%)ro..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::log::Writer::EmitPhysicalRecord (192 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::WriteToWAL (5,554 samples, 2.60%)ro..libsystem_kernel.dylib`fsync (7,260 samples, 3.40%)lib..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::SyncInternal (7,306 samples, 3.42%)rol..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::Sync (7,326 samples, 3.43%)rol..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::WriteToWAL (12,919 samples, 6.05%)rollup_c..libsystem_platform.dylib`_platform_memmove (29 samples, 0.01%)libdyld.dylib`tlv_get_addr (78 samples, 0.04%)libsystem_platform.dylib`_platform_memcmp (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (132 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (424 samples, 0.20%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_level (122 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::InlineSkipList<rocksdb::MemTableRep::KeyComparator const&>::Insert<false>(char const*, rocksdb::InlineSkipList (1,313 samples, 0.61%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_level (59 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::Allocate (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::MemTableInserter::PutCFImpl(unsigned int, rocksdb::Slice const&, rocksdb::Slice const&, rocksdb::ValueType, rocksdb::ProtectionInfoKVOS (1,435 samples, 0.67%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::Add(unsigned long long, rocksdb::ValueType, rocksdb::Slice const&, rocksdb::Slice const&, rocksdb::ProtectionInfoKVOS (1,369 samples, 0.64%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::MemTableInserter::PutCF (1,448 samples, 0.68%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatchInternal::InsertInto (1,486 samples, 0.70%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatchInternal::Iterate (1,472 samples, 0.69%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::WriteImpl (14,656 samples, 6.86%)rollup_co..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::Write (14,686 samples, 6.87%)rollup_co..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_write (14,693 samples, 6.88%)rollup_co..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::db::DBCommon<T,rocksdb::db::DBWithThreadModeInner>::write_opt (14,732 samples, 6.90%)rollup_co..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_writebatch_destroy (28 samples, 0.01%)libc++abi.dylib`operator new(unsigned long) (31 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (31 samples, 0.01%)libsystem_malloc.dylib`nanov2_malloc (23 samples, 0.01%)libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__grow_by_and_replace (64 samples, 0.03%)libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append (109 samples, 0.05%)libsystem_platform.dylib`_platform_memmove (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatch::Put (151 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WriteBatchInternal::Put (129 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_writebatch_put_cf (156 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::write_schemas (15,232 samples, 7.13%)rollup_coa..rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::put (15,576 samples, 7.29%)rollup_coa..rollup_coarse_measure-64f9a1d8b33892a3`<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold (45,586 samples, 21.34%)rollup_coarse_measure-64f9a1d8b338..libsystem_platform.dylib`_platform_memcmp (34 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::collections::btree::map::entry::VacantEntry<K,V,A>::insert (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::collections::btree::map::BTreeMap<K,V,A>::insert (184 samples, 0.09%)libsystem_platform.dylib`_platform_memcmp (155 samples, 0.07%)libsystem_platform.dylib`_platform_memmove (66 samples, 0.03%)libsystem_malloc.dylib`small_free_list_add_ptr (29 samples, 0.01%)libsystem_malloc.dylib`small_malloc_should_clear (36 samples, 0.02%)libsystem_malloc.dylib`small_malloc_from_free_list (35 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::collections::btree::map::entry::VacantEntry<K,V,A>::insert (179 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (99 samples, 0.05%)libsystem_malloc.dylib`_malloc_zone_malloc (39 samples, 0.02%)libsystem_malloc.dylib`szone_malloc_should_clear (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::collections::btree::map::BTreeMap<K,V,A>::insert (532 samples, 0.25%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree_cache::TreeCache<R>::freeze (998 samples, 0.47%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::writer::NodeBatch::extend (767 samples, 0.36%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (437 samples, 0.20%)rollup_coarse_measure-64f9a1d8b33892a3`jmt::tree::JellyfishMerkleTree<R,H>::put_value_set (47,074 samples, 22.04%)rollup_coarse_measure-64f9a1d8b3389..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (160 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_state::prover_storage::ProverStorage<S> as sov_state::storage::Storage>::validate_and_commit (133,789 samples, 62.63%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_state::prover_storage::ProverStorage<S> as sov_state::storag..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (273 samples, 0.13%)libsystem_platform.dylib`_platform_memcmp (149 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`DYLD-STUB$$memcmp (38 samples, 0.02%)libsystem_platform.dylib`_platform_memcmp (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`core::slice::sort::merge_sort (84 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`core::slice::sort::insertion_sort_shift_left (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_modules_stf_template::_<impl sov_rollup_interface::state_machine::stf::StateTransitionFunction<Vm> for sov_modules_stf_template::app_template::AppTemplate<C,RT,Vm>>::end_slot (134,354 samples, 62.89%)rollup_coarse_measure-64f9a1d8b33892a3`sov_modules_stf_template::_<impl sov_rollup_interface::state_mach..rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::StateCheckpoint<S>::freeze (279 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_state::internal_cache::OrderedReadsAndWrites as core::convert::From<sov_state::internal_cache::StorageInternalCache>>::from (279 samples, 0.13%)libsystem_platform.dylib`_platform_memmove (51 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<demo_stf::runtime::Runtime<C> as sov_modules_api::dispatch::DispatchCall>::decode_call (66 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_bank::call::CallMessage<C> as borsh::de::BorshDeserialize>::deserialize_reader (41 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::get_decoded (94 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::get (92 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::internal_cache::StorageInternalCache::get_or_fetch (89 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::internal_cache::StorageInternalCache::get_value_from_cache (46 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_first_read_last_write_cache::cache::CacheLog::get_value (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (25 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::storage::StorageKey::new (41 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::map::StateMap<K,V>::get_or_err (142 samples, 0.07%)libsystem_malloc.dylib`_malloc_zone_malloc (30 samples, 0.01%)libsystem_malloc.dylib`szone_malloc_should_clear (27 samples, 0.01%)libsystem_malloc.dylib`small_malloc_should_clear (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_state::witness::ArrayWitness as sov_state::witness::Witness>::add_hint (38 samples, 0.02%)libsystem_malloc.dylib`free (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<prometheus::histogram::HistogramTimer as core::ops::drop::Drop>::drop (23 samples, 0.01%)libsystem_c.dylib`clock_gettime (49 samples, 0.02%)libsystem_kernel.dylib`mach_absolute_time (46 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`prometheus::histogram::Histogram::start_timer (52 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys::unix::time::inner::_<impl std::sys::unix::time::Timespec>::now (50 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MergingIterator::NextAndGetResult (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MergingIterator::Next (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBIter::FindNextUserEntryInternal (94 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBIter::FindNextUserEntry (105 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::IndexValue>::CompareCurrentKey (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter::SeekImpl (70 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableIterator::SeekImpl (93 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::GetVarint32PtrFallback (25 samples, 0.01%)libsystem_platform.dylib`_platform_memcmp (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (141 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::InlineSkipList<rocksdb::MemTableRep::KeyComparator const&>::Iterator::Seek (323 samples, 0.15%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTableIterator::Seek (347 samples, 0.16%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MergingIterator::NextAndGetResult (499 samples, 0.23%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MergingIterator::Next (495 samples, 0.23%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MergingIterator::SwitchToForward (469 samples, 0.22%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBIter::ReverseToForward (558 samples, 0.26%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBIter::Next (679 samples, 0.32%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::schema::tables::_<impl sov_rollup_interface::node::db::KeyDecoder<sov_db::schema::tables::JmtValues> for (alloc::vec::Vec<u8>,u64)>::decode_key (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_db::schema::tables::_<impl sov_rollup_interface::node::db::ValueCodec<sov_db::schema::tables::JmtValues> for core::option::Option<alloc::vec::Vec<u8>>>::decode_value (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_schema_db::iterator::SchemaIterator<S> as core::iter::traits::iterator::Iterator>::next (841 samples, 0.39%)libsystem_malloc.dylib`free_small (35 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Arena::~Arena (55 samples, 0.03%)libsystem_malloc.dylib`free (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableIterator::~BlockBasedTableIterator (94 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MergingIterator::~MergingIterator (140 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBIter::~DBIter (204 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::ArenaWrappedDBIter::~ArenaWrappedDBIter (275 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_iter_destroy (307 samples, 0.14%)libsystem_platform.dylib`_platform_memset (36 samples, 0.02%)libsystem_malloc.dylib`small_free_list_add_ptr (35 samples, 0.02%)libsystem_malloc.dylib`_malloc_zone_malloc (61 samples, 0.03%)libsystem_malloc.dylib`szone_malloc_should_clear (51 samples, 0.02%)libsystem_malloc.dylib`small_malloc_should_clear (48 samples, 0.02%)libsystem_malloc.dylib`small_malloc_from_free_list (46 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Arena::AllocateAligned (66 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Arena::AllocateNewBlock (64 samples, 0.03%)libc++abi.dylib`operator new(unsigned long) (64 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::GetIterator (71 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTableIterator::MemTableIterator (91 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Block::NewIndexIterator (31 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BinarySearchIndexReader::NewIterator (42 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTable::NewIterator (52 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::TableCache::NewIterator(rocksdb::ReadOptions const&, rocksdb::FileOptions const&, rocksdb::InternalKeyComparator const&, rocksdb::FileMetaData const&, rocksdb::RangeDelAggregator*, std::__1::shared_ptr (90 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Version::AddIterators (115 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Version::AddIteratorsForLevel (111 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::NewInternalIterator (274 samples, 0.13%)libsystem_malloc.dylib`_malloc_zone_malloc (31 samples, 0.01%)libsystem_malloc.dylib`szone_malloc_should_clear (29 samples, 0.01%)libsystem_malloc.dylib`small_malloc_should_clear (28 samples, 0.01%)libsystem_malloc.dylib`small_malloc_from_free_list (24 samples, 0.01%)libc++abi.dylib`operator new(unsigned long) (32 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBIter::DBIter(rocksdb::Env*, rocksdb::ReadOptions const&, rocksdb::ImmutableOptions const&, rocksdb::MutableCFOptions const&, rocksdb::Comparator const*, rocksdb::InternalIteratorBase (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::ArenaWrappedDBIter::Init (74 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::NewArenaWrappedDbIterator (134 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::NewIteratorImpl (473 samples, 0.22%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::NewIterator (479 samples, 0.22%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::db_iterator::DBRawIteratorWithThreadMode<D>::new_cf (499 samples, 0.23%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_create_iterator_cf (494 samples, 0.23%)rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::DB::iter (531 samples, 0.25%)libsystem_platform.dylib`_platform_memcmp (45 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (32 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (136 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::Iterator::Prev (232 samples, 0.11%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTableIterator::Prev (241 samples, 0.11%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableIterator::Prev (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter::PrevImpl (35 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (41 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MergingIterator::Prev (153 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTableIterator::Prev (75 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::Iterator::Prev (74 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBIter::FindValueForCurrentKey (452 samples, 0.21%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBIter::PrevInternal (478 samples, 0.22%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::GetVarint32PtrFallback (47 samples, 0.02%)libdyld.dylib`tlv_get_addr (34 samples, 0.02%)libsystem_platform.dylib`_platform_memcmp (119 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (32 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (269 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::InlineSkipList<rocksdb::MemTableRep::KeyComparator const&>::Iterator::Seek (647 samples, 0.30%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (22 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::GetVarint32PtrFallback (22 samples, 0.01%)libsystem_platform.dylib`_platform_memcmp (35 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::Iterator::Prev (198 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (123 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTableIterator::Prev (200 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTableIterator::SeekForPrev (891 samples, 0.42%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableIterator::InitDataBlock (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter* rocksdb::BlockBasedTable::NewDataBlockIterator<rocksdb::DataBlockIter> (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::RetrieveBlock<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, rocksdb::CachableEntry (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::MaybeReadBlockAndLoadToCache<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, bool, bool, rocksdb::CachableEntry (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableIterator::FindKeyBackward (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockFetcher::ProcessTrailerIfPresent (86 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::VerifyBlockChecksum(rocksdb::ChecksumType, char const*, unsigned long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (84 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`crc32c_arm64(unsigned int, unsigned char const*, unsigned long) (83 samples, 0.04%)libsystem_kernel.dylib`pread (482 samples, 0.23%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::RandomAccessFileReader::Read(rocksdb::IOOptions const&, unsigned long long, unsigned long, rocksdb::Slice*, char*, std::__1::unique_ptr<char [], std::__1::default_delete (509 samples, 0.24%)libsystem_malloc.dylib`small_free_list_add_ptr (31 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (50 samples, 0.02%)libsystem_malloc.dylib`szone_malloc_should_clear (47 samples, 0.02%)libsystem_malloc.dylib`small_malloc_should_clear (46 samples, 0.02%)libsystem_malloc.dylib`small_malloc_from_free_list (39 samples, 0.02%)libc++abi.dylib`operator new(unsigned long) (51 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`LZ4_decompress_safe_continue (373 samples, 0.17%)rollup_coarse_measure-64f9a1d8b33892a3`LZ4_decompress_safe (370 samples, 0.17%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::UncompressBlockContentsForCompressionType (459 samples, 0.21%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::LZ4_Uncompress (455 samples, 0.21%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockFetcher::ReadBlockContents (1,093 samples, 0.51%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::lru_cache::LRUCacheShard::Lookup(rocksdb::Slice const&, unsigned int, rocksdb::Cache::CacheItemHelper const*, std::__1::function<rocksdb::Status (29 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::GetDataBlockFromCache<rocksdb::Block>(rocksdb::Slice const&, rocksdb::Cache*, rocksdb::Cache*, rocksdb::ReadOptions const&, rocksdb::CachableEntry (59 samples, 0.03%)libsystem_kernel.dylib`madvise (47 samples, 0.02%)libsystem_malloc.dylib`free_small (96 samples, 0.04%)libsystem_malloc.dylib`small_madvise_free_range_no_lock (51 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::cache_entry_roles_detail::RegisteredDeleter<rocksdb::Block, (rocksdb::CacheEntryRole)0>::Delete (114 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Block::~Block (104 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::PutDataBlockToCache<rocksdb::Block>(rocksdb::Slice const&, rocksdb::Cache*, rocksdb::Cache*, rocksdb::CachableEntry (222 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::lru_cache::LRUCacheShard::InsertItem (156 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::MaybeReadBlockAndLoadToCache<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, bool, bool, rocksdb::CachableEntry (1,410 samples, 0.66%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter* rocksdb::BlockBasedTable::NewDataBlockIterator<rocksdb::DataBlockIter> (1,451 samples, 0.68%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::Status rocksdb::BlockBasedTable::RetrieveBlock<rocksdb::Block>(rocksdb::FilePrefetchBuffer*, rocksdb::ReadOptions const&, rocksdb::BlockHandle const&, rocksdb::UncompressionDict const&, rocksdb::CachableEntry (1,422 samples, 0.67%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableIterator::InitDataBlock (1,456 samples, 0.68%)libsystem_platform.dylib`_platform_memcmp (127 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::BlockIter<rocksdb::IndexValue>::BinarySeek<rocksdb::DecodeKeyV4> (276 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::IndexValue>::CompareCurrentKey (145 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::IndexBlockIter::NextImpl (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::Slice>::Seek (310 samples, 0.15%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::IndexBlockIter::SeekImpl (309 samples, 0.14%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::BlockIter<rocksdb::IndexValue>::BinarySeek<rocksdb::DecodeKey> (79 samples, 0.04%)libsystem_platform.dylib`_platform_memcmp (27 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockIter<rocksdb::IndexValue>::CompareCurrentKey (71 samples, 0.03%)libsystem_platform.dylib`_platform_memmove (39 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::BlockIter<rocksdb::IndexValue>::ParseNextKey<rocksdb::DecodeEntry> (34 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter::NextImpl (77 samples, 0.04%)libsystem_malloc.dylib`small_malloc_should_clear (34 samples, 0.02%)libsystem_malloc.dylib`small_malloc_from_free_list (32 samples, 0.01%)libsystem_malloc.dylib`szone_malloc_should_clear (58 samples, 0.03%)libsystem_malloc.dylib`tiny_malloc_should_clear (23 samples, 0.01%)libsystem_malloc.dylib`_malloc_zone_malloc (79 samples, 0.04%)libc++abi.dylib`operator new(unsigned long) (89 samples, 0.04%)libsystem_malloc.dylib`free (23 samples, 0.01%)libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__grow_by_and_replace (151 samples, 0.07%)libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append (196 samples, 0.09%)libsystem_malloc.dylib`nanov2_malloc (46 samples, 0.02%)libsystem_malloc.dylib`nanov2_allocate (45 samples, 0.02%)libsystem_malloc.dylib`nanov2_find_block_and_allocate (34 samples, 0.02%)libc++abi.dylib`operator new(unsigned long) (65 samples, 0.03%)libsystem_malloc.dylib`_malloc_zone_malloc (65 samples, 0.03%)libsystem_platform.dylib`_platform_memmove (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter::PrevImpl (386 samples, 0.18%)rollup_coarse_measure-64f9a1d8b33892a3`bool rocksdb::BlockIter<rocksdb::IndexValue>::ParseNextKey<rocksdb::DecodeEntry> (28 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableIterator::SeekForPrev (2,477 samples, 1.16%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DataBlockIter::SeekForPrevImpl (672 samples, 0.31%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::BytewiseComparatorImpl::Compare (29 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::GetVarint32PtrFallback (80 samples, 0.04%)libdyld.dylib`tlv_get_addr (55 samples, 0.03%)libsystem_platform.dylib`_platform_memcmp (151 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (47 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (366 samples, 0.17%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_level (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::InlineSkipList<rocksdb::MemTableRep::KeyComparator const&>::Iterator::Seek (891 samples, 0.42%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (42 samples, 0.02%)libsystem_platform.dylib`_platform_memcmp (58 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`thread-local wrapper routine for rocksdb::perf_context (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTable::KeyComparator::operator() (155 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::(anonymous namespace)::SkipListRep::Iterator::Prev (274 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTableIterator::Prev (282 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTableIterator::SeekForPrev (1,260 samples, 0.59%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MergingIterator::SeekForPrev (3,799 samples, 1.78%)r..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBIter::SeekForPrev (5,225 samples, 2.45%)ro..rollup_coarse_measure-64f9a1d8b33892a3`rocksdb_iter_seek_for_prev (5,229 samples, 2.45%)ro..rollup_coarse_measure-64f9a1d8b33892a3`sov_db::state_db::StateDB::get_value_option_by_key (7,010 samples, 3.28%)rol..rollup_coarse_measure-64f9a1d8b33892a3`sov_schema_db::iterator::SchemaIterator<S>::seek_for_prev (5,261 samples, 2.46%)ro..rollup_coarse_measure-64f9a1d8b33892a3`<sov_state::prover_storage::ProverStorage<S> as sov_state::storage::Storage>::get (7,098 samples, 3.32%)rol..rollup_coarse_measure-64f9a1d8b33892a3`<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (134 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::internal_cache::StorageInternalCache::add_read (227 samples, 0.11%)rollup_coarse_measure-64f9a1d8b33892a3`sov_first_read_last_write_cache::cache::CacheLog::add_read (221 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (187 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::reserve_rehash (144 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::internal_cache::StorageInternalCache::get_or_fetch (7,377 samples, 3.45%)rol..rollup_coarse_measure-64f9a1d8b33892a3`sov_state::internal_cache::StorageInternalCache::get_value_from_cache (41 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_first_read_last_write_cache::cache::CacheLog::get_value (36 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::get_decoded (7,383 samples, 3.46%)rol..rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::get (7,380 samples, 3.45%)rol..rollup_coarse_measure-64f9a1d8b33892a3`<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (50 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::map::HashMap<K,V,S,A>::insert (107 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::insert (44 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::raw::RawTable<T,A>::reserve_rehash (32 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::set (113 samples, 0.05%)libsystem_malloc.dylib`nanov2_allocate_from_block (47 samples, 0.02%)libsystem_malloc.dylib`nanov2_allocate (70 samples, 0.03%)libsystem_malloc.dylib`nanov2_malloc (85 samples, 0.04%)libsystem_malloc.dylib`_malloc_zone_malloc (180 samples, 0.08%)libsystem_malloc.dylib`szone_malloc_should_clear (65 samples, 0.03%)libsystem_malloc.dylib`small_malloc_should_clear (61 samples, 0.03%)libsystem_malloc.dylib`small_malloc_from_free_list (53 samples, 0.02%)libsystem_malloc.dylib`free_small (31 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::storage::StorageKey::new (277 samples, 0.13%)libsystem_malloc.dylib`_malloc_zone_malloc (39 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::storage::StorageValue::new (43 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_bank::token::Token<C>::transfer (8,015 samples, 3.75%)roll..rollup_coarse_measure-64f9a1d8b33892a3`<sov_bank::token::Token<C> as borsh::de::BorshDeserialize>::deserialize_reader (54 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::internal_cache::StorageInternalCache::get_or_fetch (73 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::internal_cache::StorageInternalCache::get_value_from_cache (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_first_read_last_write_cache::cache::CacheLog::get_value (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::get (84 samples, 0.04%)libsystem_malloc.dylib`_malloc_zone_malloc (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::storage::StorageKey::new (43 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::map::StateMap<K,V>::get_or_err (207 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::get_value (203 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`sov_bank::call::_<impl sov_bank::Bank<C>>::transfer_from (8,260 samples, 3.87%)roll..rollup_coarse_measure-64f9a1d8b33892a3`<demo_stf::runtime::Runtime<C> as sov_modules_api::dispatch::DispatchCall>::dispatch_call (8,278 samples, 3.87%)roll..rollup_coarse_measure-64f9a1d8b33892a3`<sov_bank::Bank<C> as sov_modules_api::Module>::call (8,276 samples, 3.87%)roll..libsystem_platform.dylib`_platform_memmove (79 samples, 0.04%)libsystem_malloc.dylib`_malloc_zone_calloc (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_modules_stf_template::tx_verifier::RawTx as borsh::de::BorshDeserialize>::deserialize_reader (59 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_modules_stf_template::batch::Batch as borsh::de::BorshDeserialize>::deserialize_reader (142 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (391 samples, 0.18%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::get_decoded (88 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::get (83 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::internal_cache::StorageInternalCache::get_or_fetch (76 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::internal_cache::StorageInternalCache::get_value_from_cache (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::storage::StorageKey::new (43 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::map::StateMap<K,V>::get_or_err (148 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::set (41 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::map::HashMap<K,V,S,A>::insert (38 samples, 0.02%)libsystem_malloc.dylib`_malloc_zone_malloc (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::storage::StorageKey::new (61 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`sov_accounts::hooks::_<impl sov_modules_api::hooks::TxHooks for sov_accounts::Accounts<C>>::post_dispatch_tx_hook (280 samples, 0.13%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::get_decoded (73 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::get (50 samples, 0.02%)libsystem_malloc.dylib`_malloc_zone_malloc (69 samples, 0.03%)libsystem_malloc.dylib`szone_malloc_should_clear (41 samples, 0.02%)libsystem_malloc.dylib`small_malloc_should_clear (36 samples, 0.02%)libsystem_malloc.dylib`small_malloc_from_free_list (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::storage::StorageKey::new (100 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`sov_accounts::hooks::_<impl sov_modules_api::hooks::TxHooks for sov_accounts::Accounts<C>>::pre_dispatch_tx_hook (201 samples, 0.09%)libsystem_malloc.dylib`nanov2_free_to_block (27 samples, 0.01%)libsystem_malloc.dylib`nanov2_madvise_block (23 samples, 0.01%)libsystem_kernel.dylib`madvise (23 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (42 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (129 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (52 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (160 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (2,554 samples, 1.20%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::to_bytes (52 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::field::_<impl curve25519_dalek::backend::serial::u64::field::FieldElement51>::sqrt_ratio_i (2,839 samples, 1.33%)rollup_coarse_measure-64f9a1d8b33892a3`subtle::black_box (65 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::edwards::CompressedEdwardsY::decompress (3,032 samples, 1.42%)rollup_coarse_measure-64f9a1d8b33892a3`<sov_modules_api::transaction::Transaction<C> as borsh::de::BorshDeserialize>::deserialize_reader (3,158 samples, 1.48%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (377 samples, 0.18%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (11,947 samples, 5.59%)rollup_..rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::to_bytes (42 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<curve25519_dalek::edwards::EdwardsPoint as core::cmp::PartialEq>::eq (80 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`subtle::black_box (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<ed25519_dalek::signature::InternalSignature as core::convert::TryFrom<&ed25519::Signature>>::try_from (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<sha2::sha512::Sha512 as digest::fixed::FixedOutputDirty>::finalize_into_dirty (247 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha512::soft::compress (240 samples, 0.11%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::ProjectivePoint::double (345 samples, 0.16%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::_<impl core::ops::arith::Add<&curve25519_dalek::backend::serial::curve_models::AffineNielsPoint> for &curve25519_dalek::edwards::EdwardsPoint>::add (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::_<impl core::ops::arith::Add<&curve25519_dalek::backend::serial::curve_models::ProjectiveNielsPoint> for &curve25519_dalek::edwards::EdwardsPoint>::add (29 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::_<impl core::ops::arith::Sub<&curve25519_dalek::backend::serial::curve_models::ProjectiveNielsPoint> for &curve25519_dalek::edwards::EdwardsPoint>::sub (33 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (3,027 samples, 1.42%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (308 samples, 0.14%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::_<impl core::ops::arith::Add<&curve25519_dalek::backend::serial::curve_models::ProjectiveNielsPoint> for &curve25519_dalek::edwards::EdwardsPoint>::add (61 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`<curve25519_dalek::window::NafLookupTable5<curve25519_dalek::backend::serial::curve_models::ProjectiveNielsPoint> as core::convert::From<&curve25519_dalek::edwards::EdwardsPoint>>::from (461 samples, 0.22%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (40 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::ProjectivePoint::double (1,406 samples, 0.66%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::_<impl core::ops::arith::Add<&curve25519_dalek::backend::serial::curve_models::AffineNielsPoint> for &curve25519_dalek::edwards::EdwardsPoint>::add (111 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::_<impl core::ops::arith::Add<&curve25519_dalek::backend::serial::curve_models::ProjectiveNielsPoint> for &curve25519_dalek::edwards::EdwardsPoint>::add (184 samples, 0.09%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::_<impl core::ops::arith::Sub<&curve25519_dalek::backend::serial::curve_models::AffineNielsPoint> for &curve25519_dalek::edwards::EdwardsPoint>::sub (131 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::_<impl core::ops::arith::Sub<&curve25519_dalek::backend::serial::curve_models::ProjectiveNielsPoint> for &curve25519_dalek::edwards::EdwardsPoint>::sub (170 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::scalar_mul::vartime_double_base::mul (15,127 samples, 7.08%)rollup_coa..rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (7,780 samples, 3.64%)roll..rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (161 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (38 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`<&curve25519_dalek::backend::serial::u64::field::FieldElement51 as core::ops::arith::Mul<&curve25519_dalek::backend::serial::u64::field::FieldElement51>>::mul (153 samples, 0.07%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (2,481 samples, 1.16%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::to_bytes (52 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::field::_<impl curve25519_dalek::backend::serial::u64::field::FieldElement51>::sqrt_ratio_i (2,746 samples, 1.29%)rollup_coarse_measure-64f9a1d8b33892a3`subtle::black_box (51 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::edwards::CompressedEdwardsY::decompress (2,956 samples, 1.38%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::curve_models::ProjectivePoint::double (41 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::pow2k (211 samples, 0.10%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::field::FieldElement51::to_bytes (68 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::edwards::EdwardsPoint::is_small_order (423 samples, 0.20%)rollup_coarse_measure-64f9a1d8b33892a3`subtle::black_box (81 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::scalar::Scalar52::from_bytes_wide (24 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::scalar::Scalar::from_bytes_mod_order_wide (80 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`curve25519_dalek::backend::serial::u64::scalar::Scalar52::montgomery_mul (56 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`ed25519_dalek::public::PublicKey::verify_strict (31,407 samples, 14.70%)rollup_coarse_measure-..rollup_coarse_measure-64f9a1d8b33892a3`<sov_modules_api::default_signature::DefaultSignature as sov_modules_api::Signature>::verify (31,444 samples, 14.72%)rollup_coarse_measure-..rollup_coarse_measure-64f9a1d8b33892a3`sov_modules_stf_template::tx_verifier::verify_txs_stateless (35,213 samples, 16.48%)rollup_coarse_measure-64f..rollup_coarse_measure-64f9a1d8b33892a3`sov_modules_api::transaction::Transaction<C>::verify (31,628 samples, 14.80%)rollup_coarse_measure-6..rollup_coarse_measure-64f9a1d8b33892a3`sha2::sha256::soft::compress (171 samples, 0.08%)libsystem_malloc.dylib`free (25 samples, 0.01%)libsystem_platform.dylib`_platform_memcmp (58 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::sync::Arc<T>::drop_slow (30 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`<std::collections::hash::map::DefaultHasher as core::hash::Hasher>::write (79 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`hashbrown::rustc_entry::_<impl hashbrown::map::HashMap<K,V,S,A>>::rustc_entry (112 samples, 0.05%)libsystem_malloc.dylib`free (26 samples, 0.01%)libsystem_malloc.dylib`free_small (32 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`alloc::sync::Arc<T>::drop_slow (67 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`sov_state::scratchpad::WorkingSet<S>::checkpoint (444 samples, 0.21%)rollup_coarse_measure-64f9a1d8b33892a3`sov_first_read_last_write_cache::cache::CacheLog::add_write (394 samples, 0.18%)rollup_coarse_measure-64f9a1d8b33892a3`sov_first_read_last_write_cache::access::Access::write_value (135 samples, 0.06%)rollup_coarse_measure-64f9a1d8b33892a3`sov_modules_stf_template::app_template::AppTemplate<C,RT,Vm>::apply_blob (45,165 samples, 21.14%)rollup_coarse_measure-64f9a1d8b33..dyld`start (211,262 samples, 98.89%)dyld`startrollup_coarse_measure-64f9a1d8b33892a3`main (211,261 samples, 98.89%)rollup_coarse_measure-64f9a1d8b33892a3`mainrollup_coarse_measure-64f9a1d8b33892a3`std::rt::lang_start_internal (211,261 samples, 98.89%)rollup_coarse_measure-64f9a1d8b33892a3`std::rt::lang_start_internalrollup_coarse_measure-64f9a1d8b33892a3`std::rt::lang_start::_{{closure}} (211,261 samples, 98.89%)rollup_coarse_measure-64f9a1d8b33892a3`std::rt::lang_start::_{{closure}}rollup_coarse_measure-64f9a1d8b33892a3`std::sys_common::backtrace::__rust_begin_short_backtrace (211,261 samples, 98.89%)rollup_coarse_measure-64f9a1d8b33892a3`std::sys_common::backtrace::__rust_begin_short_backtracerollup_coarse_measure-64f9a1d8b33892a3`rollup_coarse_measure::main (211,261 samples, 98.89%)rollup_coarse_measure-64f9a1d8b33892a3`rollup_coarse_measure::mainrollup_coarse_measure-64f9a1d8b33892a3`tokio::runtime::scheduler::multi_thread::MultiThread::block_on (211,261 samples, 98.89%)rollup_coarse_measure-64f9a1d8b33892a3`tokio::runtime::scheduler::multi_thread::MultiThread::block_onrollup_coarse_measure-64f9a1d8b33892a3`tokio::runtime::park::CachedParkThread::block_on (211,239 samples, 98.88%)rollup_coarse_measure-64f9a1d8b33892a3`tokio::runtime::park::CachedParkThread::block_onlibsystem_platform.dylib`_platform_memmove (22 samples, 0.01%)libsystem_platform.dylib`_platform_memset (40 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`LZ4_compress_fast_continue (1,054 samples, 0.49%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableBuilder::CompressAndVerifyBlock(rocksdb::Slice const&, bool, rocksdb::CompressionContext const&, rocksdb::UncompressionContext*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (1,125 samples, 0.53%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::CompressBlock(rocksdb::Slice const&, rocksdb::CompressionInfo const&, rocksdb::CompressionType*, unsigned int, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (1,121 samples, 0.52%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::LZ4_Compress(rocksdb::CompressionInfo const&, unsigned int, char const*, unsigned long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (1,114 samples, 0.52%)rollup_coarse_measure-64f9a1d8b33892a3`crc32c_arm64(unsigned int, unsigned char const*, unsigned long) (53 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::Flush (85 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::WriteBuffered (85 samples, 0.04%)libsystem_kernel.dylib`write (85 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableBuilder::WriteRawBlock (165 samples, 0.08%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::WritableFileWriter::Append (96 samples, 0.04%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableBuilder::WriteBlock (1,295 samples, 0.61%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableBuilder::Flush (1,318 samples, 0.62%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableBuilder::WriteBlock (1,315 samples, 0.62%)libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append (68 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBuilder::AddWithLastKeyImpl (212 samples, 0.10%)libsystem_platform.dylib`_platform_memmove (70 samples, 0.03%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBuilder::AddWithLastKey (247 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BlockBasedTableBuilder::Add (1,715 samples, 0.80%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::ShortenedIndexBuilder::AddIndexEntry(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator (44 samples, 0.02%)libsystem_platform.dylib`_platform_memmove (23 samples, 0.01%)libsystem_platform.dylib`_platform_memcmp (26 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTableIterator::key (31 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::CompactionIterator::NextFromInput (249 samples, 0.12%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::MemTableIterator::Next (35 samples, 0.02%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::CompactionIterator::Next (344 samples, 0.16%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::FileMetaData::UpdateBoundaries (35 samples, 0.02%)libsystem_platform.dylib`_platform_memmove (23 samples, 0.01%)libsystem_platform.dylib`_platform_memcmp (22 samples, 0.01%)libsystem_platform.dylib`_platform_memmove (25 samples, 0.01%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::OutputValidator::Add (100 samples, 0.05%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::BuildTable(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, rocksdb::VersionSet*, rocksdb::ImmutableDBOptions const&, rocksdb::TableBuilderOptions const&, rocksdb::FileOptions const&, rocksdb::TableCache*, rocksdb::InternalIteratorBase<rocksdb::Slice>*, std::__1::vector<std::__1::unique_ptr<rocksdb::FragmentedRangeTombstoneIterator, std::__1::default_delete<rocksdb::FragmentedRangeTombstoneIterator> >, std::__1::allocator<std::__1::unique_ptr<rocksdb::FragmentedRangeTombstoneIterator, std::__1::default_delete<rocksdb::FragmentedRangeTombstoneIterator> > > >, rocksdb::FileMetaData*, std::__1::vector<rocksdb::BlobFileAddition, std::__1::allocator<rocksdb::BlobFileAddition> >*, std::__1::vector<unsigned long long, std::__1::allocator<unsigned long long> >, unsigned long long, unsigned long long, rocksdb::SnapshotChecker*, bool, rocksdb::InternalStats*, rocksdb::IOStatus*, std::__1::shared_ptr (2,321 samples, 1.09%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::BackgroundFlush (2,334 samples, 1.09%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::FlushMemTablesToOutputFiles(rocksdb::autovector (2,334 samples, 1.09%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::FlushMemTableToOutputFile(rocksdb::ColumnFamilyData*, rocksdb::MutableCFOptions const&, bool*, rocksdb::JobContext*, rocksdb::SuperVersionContext*, std::__1::vector<unsigned long long, std::__1::allocator (2,334 samples, 1.09%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::FlushJob::Run (2,334 samples, 1.09%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::FlushJob::WriteLevel0Table (2,334 samples, 1.09%)rollup_coarse_measure-64f9a1d8b33892a3`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(void*), rocksdb::BGThreadMetadata*> > (2,364 samples, 1.11%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::ThreadPoolImpl::Impl::BGThreadWrapper (2,364 samples, 1.11%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::ThreadPoolImpl::Impl::BGThread (2,364 samples, 1.11%)rollup_coarse_measure-64f9a1d8b33892a3`rocksdb::DBImpl::BackgroundCallFlush (2,362 samples, 1.11%)all (213,631 samples, 100%)libsystem_pthread.dylib`thread_start (2,366 samples, 1.11%)libsystem_pthread.dylib`_pthread_start (2,366 samples, 1.11%) \ No newline at end of file diff --git a/examples/demo-rollup/benches/Makefile b/examples/demo-rollup/benches/node/Makefile similarity index 84% rename from examples/demo-rollup/benches/Makefile rename to examples/demo-rollup/benches/node/Makefile index 2ebdc3f58..8b04bbdb8 100644 --- a/examples/demo-rollup/benches/Makefile +++ b/examples/demo-rollup/benches/node/Makefile @@ -9,19 +9,19 @@ criterion: @echo "Running criterion bench with $(TXNS_PER_BLOCK) transactions per block" @echo "Method: Criterion" @echo "Output: Criterion" - @cd .. && cargo bench --bench rollup_bench + @cd ../.. && cargo bench --features="bench" rollup_bench basic: @echo "Running basic benchmark with $(BLOCKS) blocks and $(TXNS_PER_BLOCK) transactions per block" @echo "Method: Coarse Timers" @echo "Output: Standard" - @cd .. && cargo bench --bench rollup_coarse_measure + @cd ../.. && cargo bench --features="bench" rollup_coarse_measure prometheus: @echo "Running basic benchmark with $(BLOCKS) blocks and $(TXNS_PER_BLOCK) transactions per block" @echo "Method: Coarse Timers" @echo "Output: Prometheus" - @cd .. && PROMETHEUS=1 cargo bench --bench rollup_coarse_measure + @cd ../.. && PROMETHEUS=1 cargo bench --features="bench" rollup_coarse_measure flamegraph: @echo "Running basic benchmark with $(BLOCKS) blocks and $(TXNS_PER_BLOCK) transactions per block" @@ -30,5 +30,5 @@ flamegraph: @echo "WARNING: Flamegraph requires sudo. The Makefile does cleanup, but there is a unforeseen risk of files being owned by root after the script is done. The Makefile also does full cleanup so subsequent builds with default user will be from scratch." @read -p "Proceed (y/n): " REPLY; if [ $$REPLY = "y" ]; then \ cd .. && sudo BLOCKS=$(BLOCKS) TXNS_PER_BLOCK=$(TXNS_PER_BLOCK) cargo flamegraph -o benches/flamegraph.svg --bench rollup_coarse_measure && sudo rm -rf benches/demo_data ; \ - sudo rm -rf ../../../target ; \ + sudo rm -rf ../../../../target ; \ fi diff --git a/examples/demo-rollup/benches/README.md b/examples/demo-rollup/benches/node/README.md similarity index 100% rename from examples/demo-rollup/benches/README.md rename to examples/demo-rollup/benches/node/README.md diff --git a/examples/demo-rollup/benches/rng_xfers.rs b/examples/demo-rollup/benches/node/rng_xfers.rs similarity index 97% rename from examples/demo-rollup/benches/rng_xfers.rs rename to examples/demo-rollup/benches/node/rng_xfers.rs index dd23e284d..0121c3bcc 100644 --- a/examples/demo-rollup/benches/rng_xfers.rs +++ b/examples/demo-rollup/benches/node/rng_xfers.rs @@ -11,11 +11,10 @@ use sov_modules_api::{Address, AddressBech32, EncodeCall, PrivateKey, PublicKey, use sov_rollup_interface::da::{DaSpec, DaVerifier}; use sov_rollup_interface::mocks::{ MockAddress, MockBlob, MockBlock, MockBlockHeader, MockHash, MockValidityCond, + MOCK_SEQUENCER_DA_ADDRESS, }; use sov_rollup_interface::services::da::DaService; -pub const SEQUENCER_DA_ADDRESS: [u8; 32] = [99; 32]; - #[derive(Clone)] /// A simple DaService for a random number generator. pub struct RngDaService; @@ -135,7 +134,7 @@ impl DaService for RngDaService { unimplemented!() } - fn extract_relevant_txs( + fn extract_relevant_blobs( &self, block: &Self::FilteredBlock, ) -> Vec<::BlobTransaction> { @@ -154,7 +153,7 @@ impl DaService for RngDaService { generate_transfers(num_txns, (block.header.height - 1) * (num_txns as u64)) }; - let address = MockAddress::from(SEQUENCER_DA_ADDRESS); + let address = MockAddress::from(MOCK_SEQUENCER_DA_ADDRESS); let blob = MockBlob::new(data, address, [0u8; 32]); vec![blob] diff --git a/examples/demo-rollup/benches/rollup_bench.rs b/examples/demo-rollup/benches/node/rollup_bench.rs similarity index 81% rename from examples/demo-rollup/benches/rollup_bench.rs rename to examples/demo-rollup/benches/node/rollup_bench.rs index d11cf98ec..a7064bba4 100644 --- a/examples/demo-rollup/benches/rollup_bench.rs +++ b/examples/demo-rollup/benches/node/rollup_bench.rs @@ -6,12 +6,14 @@ use std::time::Duration; use anyhow::Context; use criterion::{criterion_group, criterion_main, Criterion}; -use demo_stf::app::App; -use demo_stf::genesis_config::get_genesis_config; -use rng_xfers::{RngDaService, RngDaSpec, SEQUENCER_DA_ADDRESS}; +use demo_stf::genesis_config::{get_genesis_config, GenesisPaths}; +use demo_stf::App; +use rng_xfers::{RngDaService, RngDaSpec}; use sov_db::ledger_db::{LedgerDB, SlotCommit}; use sov_risc0_adapter::host::Risc0Verifier; -use sov_rollup_interface::mocks::{MockAddress, MockBlock, MockBlockHeader}; +use sov_rollup_interface::mocks::{ + MockAddress, MockBlock, MockBlockHeader, MOCK_SEQUENCER_DA_ADDRESS, +}; use sov_rollup_interface::services::da::DaService; use sov_rollup_interface::stf::StateTransitionFunction; use sov_stf_runner::{from_toml_path, RollupConfig}; @@ -27,7 +29,7 @@ fn rollup_bench(_bench: &mut Criterion) { let mut c = Criterion::default() .sample_size(10) .measurement_time(Duration::from_secs(20)); - let rollup_config_path = "benches/rollup_config.toml".to_string(); + let rollup_config_path = "benches/node/rollup_config.toml".to_string(); let mut rollup_config: RollupConfig = from_toml_path(&rollup_config_path) .context("Failed to read rollup configuration") @@ -40,12 +42,17 @@ fn rollup_bench(_bench: &mut Criterion) { let da_service = Arc::new(RngDaService::new()); - let demo_runner = App::::new(rollup_config.storage); + let storage_config = sov_state::config::Config { + path: rollup_config.storage.path, + }; + let demo_runner = App::::new(storage_config); let mut demo = demo_runner.stf; - let sequencer_da_address = MockAddress::from(SEQUENCER_DA_ADDRESS); + let sequencer_da_address = MockAddress::from(MOCK_SEQUENCER_DA_ADDRESS); + let demo_genesis_config = get_genesis_config( sequencer_da_address, + &GenesisPaths::from_dir("../test-data/genesis/integration-tests"), #[cfg(feature = "experimental")] Default::default(), ); @@ -70,7 +77,7 @@ fn rollup_bench(_bench: &mut Criterion) { }; blocks.push(filtered_block.clone()); - let blob_txs = da_service.extract_relevant_txs(&filtered_block); + let blob_txs = da_service.extract_relevant_blobs(&filtered_block); blobs.push(blob_txs.clone()); } diff --git a/examples/demo-rollup/benches/rollup_coarse_measure.rs b/examples/demo-rollup/benches/node/rollup_coarse_measure.rs similarity index 89% rename from examples/demo-rollup/benches/rollup_coarse_measure.rs rename to examples/demo-rollup/benches/node/rollup_coarse_measure.rs index 888ee536b..7ff625cd1 100644 --- a/examples/demo-rollup/benches/rollup_coarse_measure.rs +++ b/examples/demo-rollup/benches/node/rollup_coarse_measure.rs @@ -5,13 +5,15 @@ use std::sync::Arc; use std::time::{Duration, Instant}; use anyhow::Context; -use demo_stf::app::App; -use demo_stf::genesis_config::get_genesis_config; +use demo_stf::genesis_config::{get_genesis_config, GenesisPaths}; +use demo_stf::App; use prometheus::{Histogram, HistogramOpts, Registry}; -use rng_xfers::{RngDaService, RngDaSpec, SEQUENCER_DA_ADDRESS}; +use rng_xfers::{RngDaService, RngDaSpec}; use sov_db::ledger_db::{LedgerDB, SlotCommit}; use sov_risc0_adapter::host::Risc0Verifier; -use sov_rollup_interface::mocks::{MockAddress, MockBlock, MockBlockHeader}; +use sov_rollup_interface::mocks::{ + MockAddress, MockBlock, MockBlockHeader, MOCK_SEQUENCER_DA_ADDRESS, +}; use sov_rollup_interface::services::da::DaService; use sov_rollup_interface::stf::StateTransitionFunction; use sov_stf_runner::{from_toml_path, RollupConfig}; @@ -84,7 +86,7 @@ async fn main() -> Result<(), anyhow::Error> { timer_output = true; } - let rollup_config_path = "benches/rollup_config.toml".to_string(); + let rollup_config_path = "benches/node/rollup_config.toml".to_string(); let mut rollup_config: RollupConfig = from_toml_path(&rollup_config_path) .context("Failed to read rollup configuration") @@ -97,12 +99,17 @@ async fn main() -> Result<(), anyhow::Error> { let da_service = Arc::new(RngDaService::new()); - let demo_runner = App::::new(rollup_config.storage); + let storage_config = sov_state::config::Config { + path: rollup_config.storage.path, + }; + let demo_runner = App::::new(storage_config); let mut demo = demo_runner.stf; - let sequencer_da_address = MockAddress::from(SEQUENCER_DA_ADDRESS); + let sequencer_da_address = MockAddress::from(MOCK_SEQUENCER_DA_ADDRESS); + let demo_genesis_config = get_genesis_config( sequencer_da_address, + &GenesisPaths::from_dir("../test-data/genesis/integration-tests"), #[cfg(feature = "experimental")] Default::default(), ); @@ -127,7 +134,7 @@ async fn main() -> Result<(), anyhow::Error> { }; blocks.push(filtered_block.clone()); - let blob_txs = da_service.extract_relevant_txs(&filtered_block); + let blob_txs = da_service.extract_relevant_blobs(&filtered_block); blobs.push(blob_txs); } diff --git a/examples/demo-rollup/benches/rollup_config.toml b/examples/demo-rollup/benches/node/rollup_config.toml similarity index 100% rename from examples/demo-rollup/benches/rollup_config.toml rename to examples/demo-rollup/benches/node/rollup_config.toml diff --git a/examples/demo-prover/benches/README.md b/examples/demo-rollup/benches/prover/README.md similarity index 99% rename from examples/demo-prover/benches/README.md rename to examples/demo-rollup/benches/prover/README.md index 617438032..9882b7fb0 100644 --- a/examples/demo-prover/benches/README.md +++ b/examples/demo-rollup/benches/prover/README.md @@ -5,7 +5,7 @@ ## Running the bench * From sovereign-sdk ``` -$ cd examples/demo-prover/host/benches +$ cd examples/demo-rollup/benches/prover $ cargo bench --features bench --bench prover_bench ``` diff --git a/examples/demo-prover/benches/blocks.hex b/examples/demo-rollup/benches/prover/blocks.hex similarity index 100% rename from examples/demo-prover/benches/blocks.hex rename to examples/demo-rollup/benches/prover/blocks.hex diff --git a/examples/demo-prover/benches/prover_bench.rs b/examples/demo-rollup/benches/prover/prover_bench.rs similarity index 92% rename from examples/demo-prover/benches/prover_bench.rs rename to examples/demo-rollup/benches/prover/prover_bench.rs index 8b9b4a901..996b308f6 100644 --- a/examples/demo-prover/benches/prover_bench.rs +++ b/examples/demo-rollup/benches/prover/prover_bench.rs @@ -8,12 +8,12 @@ use std::sync::{Arc, Mutex}; use anyhow::Context; use const_rollup_config::{ROLLUP_NAMESPACE_RAW, SEQUENCER_DA_ADDRESS}; -use demo_stf::app::App; -use demo_stf::genesis_config::get_genesis_config; +use demo_stf::genesis_config::{get_genesis_config, GenesisPaths}; +use demo_stf::App; use log4rs::config::{Appender, Config, Root}; -use methods::ROLLUP_ELF; use regex::Regex; -use sov_celestia_adapter::types::{FilteredCelestiaBlock, NamespaceId}; +use risc0::ROLLUP_ELF; +use sov_celestia_adapter::types::{FilteredCelestiaBlock, Namespace}; use sov_celestia_adapter::verifier::address::CelestiaAddress; use sov_celestia_adapter::verifier::{CelestiaSpec, RollupParams}; use sov_celestia_adapter::CelestiaService; @@ -92,7 +92,7 @@ fn get_config(rollup_trace: &str) -> Config { use sov_risc0_adapter::metrics::GLOBAL_HASHMAP; // The rollup stores its data in the namespace b"sov-test" on Celestia -const ROLLUP_NAMESPACE: NamespaceId = NamespaceId(ROLLUP_NAMESPACE_RAW); +const ROLLUP_NAMESPACE: Namespace = Namespace::const_v0(ROLLUP_NAMESPACE_RAW); #[macro_use] extern crate prettytable; @@ -141,7 +141,7 @@ async fn main() -> Result<(), anyhow::Error> { } } - let rollup_config_path = "benches/rollup_config.toml".to_string(); + let rollup_config_path = "benches/prover/rollup_config.toml".to_string(); let mut rollup_config: RollupConfig = from_toml_path(&rollup_config_path) .context("Failed to read rollup configuration") @@ -153,6 +153,7 @@ async fn main() -> Result<(), anyhow::Error> { let mut num_total_transactions = 0; let temp_dir = TempDir::new().expect("Unable to create temporary directory"); + rollup_config.storage.path = PathBuf::from(temp_dir.path()); let da_service = CelestiaService::new( @@ -163,12 +164,16 @@ async fn main() -> Result<(), anyhow::Error> { ) .await; - let mut app: App = App::new(rollup_config.storage.clone()); + let storage_config = sov_state::config::Config { + path: rollup_config.storage.path, + }; + let mut app: App = App::new(storage_config); let sequencer_da_address = CelestiaAddress::from_str(SEQUENCER_DA_ADDRESS).unwrap(); let genesis_config = get_genesis_config( sequencer_da_address, + &GenesisPaths::from_dir("../test-data/genesis/demo-tests"), #[cfg(feature = "experimental")] Default::default(), ); @@ -177,7 +182,7 @@ async fn main() -> Result<(), anyhow::Error> { let mut demo = app.stf; - let hex_data = read_to_string("benches/blocks.hex").expect("Failed to read data"); + let hex_data = read_to_string("benches/prover/blocks.hex").expect("Failed to read data"); let bincoded_blocks: Vec = hex_data .lines() .map(|line| { @@ -199,7 +204,7 @@ async fn main() -> Result<(), anyhow::Error> { let _header_hash = hex::encode(filtered_block.header.header.hash()); host.add_hint(&filtered_block.header); let (mut blob_txs, inclusion_proof, completeness_proof) = da_service - .extract_relevant_txs_with_proof(filtered_block) + .extract_relevant_blobs_with_proof(filtered_block) .await; host.add_hint(&inclusion_proof); diff --git a/examples/demo-prover/benches/rollup_config.toml b/examples/demo-rollup/benches/prover/rollup_config.toml similarity index 100% rename from examples/demo-prover/benches/rollup_config.toml rename to examples/demo-rollup/benches/prover/rollup_config.toml diff --git a/examples/demo-prover/build.rs b/examples/demo-rollup/build.rs similarity index 100% rename from examples/demo-prover/build.rs rename to examples/demo-rollup/build.rs diff --git a/examples/demo-rollup/provers/Cargo.toml b/examples/demo-rollup/provers/Cargo.toml new file mode 100644 index 000000000..48673f443 --- /dev/null +++ b/examples/demo-rollup/provers/Cargo.toml @@ -0,0 +1,49 @@ +[package] +name = "provers" +version = "0.2.0" +edition = "2021" +publish = false +license = "MIT OR Apache-2.0" +resolver = "2" + +[dependencies] +anyhow = { workspace = true } +borsh = { workspace = true } +bincode = { workspace = true } +hex = { workspace = true } +jsonrpsee = { workspace = true, features = ["http-client", "server"] } +risc0-zkvm = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +sha2 = { workspace = true } +tokio = { workspace = true } +tracing = "0.1.37" +tracing-subscriber = "0.3.16" + +sov-celestia-adapter = { path = "../../../adapters/celestia", features = ["native", "bench"] } +sov-demo-rollup = { path = "../../demo-rollup", features = ["native"] } +demo-stf = { path = "../../demo-stf" } +sov-rollup-interface = { path = "../../../rollup-interface" } +sov-risc0-adapter = { path = "../../../adapters/risc0", features = ["native"] } +const-rollup-config = { path = "../../const-rollup-config" } +sov-modules-api = { path = "../../../module-system/sov-modules-api", features = ["native"] } +sov-state = { path = "../../../module-system/sov-state", features = ["native"] } +sov-zk-cycle-macros = { path = "../../../utils/zk-cycle-macros", optional = true } +sov-stf-runner = { path = "../../../full-node/sov-stf-runner" } + +risc0 = { path = "./risc0" } + + +[dev-dependencies] +tempfile = { workspace = true } +once_cell = "1.7.2" +parking_lot = "0.12.1" +prettytable-rs = "^0.10" +env_logger = "0.10.0" +log = "0.4" +log4rs = "1.0" +regex = "1.5" + + +[features] +experimental = ["sov-demo-rollup/experimental", "demo-stf/experimental"] \ No newline at end of file diff --git a/examples/demo-prover/methods/.cargo/config.toml b/examples/demo-rollup/provers/risc0/.cargo/config.toml similarity index 100% rename from examples/demo-prover/methods/.cargo/config.toml rename to examples/demo-rollup/provers/risc0/.cargo/config.toml diff --git a/examples/demo-prover/methods/Cargo.toml b/examples/demo-rollup/provers/risc0/Cargo.toml similarity index 93% rename from examples/demo-prover/methods/Cargo.toml rename to examples/demo-rollup/provers/risc0/Cargo.toml index 06e539cb1..cd47f2449 100644 --- a/examples/demo-prover/methods/Cargo.toml +++ b/examples/demo-rollup/provers/risc0/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "methods" +name = "risc0" version = "0.2.0" edition = "2021" resolver = "2" diff --git a/examples/demo-prover/methods/build.rs b/examples/demo-rollup/provers/risc0/build.rs similarity index 100% rename from examples/demo-prover/methods/build.rs rename to examples/demo-rollup/provers/risc0/build.rs diff --git a/examples/demo-prover/methods/guest-celestia/Cargo.lock b/examples/demo-rollup/provers/risc0/guest-celestia/Cargo.lock similarity index 62% rename from examples/demo-prover/methods/guest-celestia/Cargo.lock rename to examples/demo-rollup/provers/risc0/guest-celestia/Cargo.lock index da5807d78..b43aa6f23 100644 --- a/examples/demo-prover/methods/guest-celestia/Cargo.lock +++ b/examples/demo-rollup/provers/risc0/guest-celestia/Cargo.lock @@ -15,19 +15,166 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2135563fb5c609d2b2b87c1e8ce7bc41b0b45430fa9661f457981503dd5bf0" +checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" dependencies = [ "memchr", ] +[[package]] +name = "alloy-rlp" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc0fac0fc16baf1f63f78b47c3d24718f3619b0714076f6a02957d808d52cbef" +dependencies = [ + "arrayvec", + "bytes", + "smol_str", +] + [[package]] name = "anyhow" version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +[[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", + "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", + "num-traits", + "paste", + "rustc_version 0.4.0", + "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-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "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", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[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 = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + [[package]] name = "async-trait" version = "0.1.73" @@ -36,7 +183,19 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", +] + +[[package]] +name = "auto_impl" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -45,6 +204,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + [[package]] name = "base64" version = "0.13.1" @@ -100,6 +265,18 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +[[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 = "blake2" version = "0.10.6" @@ -146,7 +323,7 @@ checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" dependencies = [ "borsh-derive-internal", "borsh-schema-derive-internal", - "proc-macro-crate", + "proc-macro-crate 0.1.5", "proc-macro2", "syn 1.0.109", ] @@ -173,6 +350,21 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bs58" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + [[package]] name = "bytemuck" version = "1.14.0" @@ -190,14 +382,14 @@ checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" @@ -210,11 +402,44 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +version = "1.0.79" +source = "git+https://github.com/rust-lang/cc-rs?rev=e5bbdfa#e5bbdfa1fa468c028cb38fee6c35a3cf2e5a2736" + +[[package]] +name = "celestia-proto" +version = "0.1.0" +source = "git+https://github.com/eigerco/celestia-node-rs.git?rev=dfe8f2f#dfe8f2f20737d9a6556e43e4dfefd63c4824f936" dependencies = [ - "libc", + "anyhow", + "prost 0.12.1", + "prost-build", + "prost-types", + "serde", + "tendermint-proto", +] + +[[package]] +name = "celestia-types" +version = "0.1.0" +source = "git+https://github.com/eigerco/celestia-node-rs.git?rev=dfe8f2f#dfe8f2f20737d9a6556e43e4dfefd63c4824f936" +dependencies = [ + "base64 0.21.4", + "bech32", + "bytes", + "celestia-proto", + "cid", + "const_format", + "enum_dispatch", + "libp2p-identity", + "multiaddr", + "nmt-rs", + "ruint", + "serde", + "serde_repr", + "sha2 0.10.8", + "tendermint", + "tendermint-proto", + "thiserror", ] [[package]] @@ -223,6 +448,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cid" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd94671561e36e4e7de75f753f577edafb0e7c05d6e4547229fdf7938fbcd2c3" +dependencies = [ + "core2", + "multibase", + "multihash 0.18.1", + "serde", + "unsigned-varint", +] + [[package]] name = "const-oid" version = "0.9.5" @@ -233,12 +471,41 @@ checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" name = "const-rollup-config" version = "0.2.0" +[[package]] +name = "const_format" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c990efc7a285731f9a4378d81aff2f0e85a2c8781a05ef0f8baa8dac54d0ff48" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e026b6ce194a874cb9cf32cd5772d1ef9767cc8fcb5765948d74f37a9d8b2bf6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "convert_case" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + [[package]] name = "cpufeatures" version = "0.2.9" @@ -248,6 +515,12 @@ dependencies = [ "libc", ] +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" @@ -260,9 +533,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.0" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622178105f911d937a42cdb140730ba4a3ed2becd8ae6ce39c7d28b5d75d4588" +checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" dependencies = [ "cfg-if", "cpufeatures", @@ -270,7 +543,7 @@ dependencies = [ "digest 0.10.7", "fiat-crypto", "platforms", - "rustc_version", + "rustc_version 0.4.0", "subtle", ] @@ -282,7 +555,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -298,6 +571,32 @@ dependencies = [ "zeroize", ] +[[package]] +name = "data-encoding" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" + +[[package]] +name = "data-encoding-macro" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c904b33cc60130e1aeea4956ab803d08a3f4a0ca82d64ed757afac3891f2bb99" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fdf3fce3ce863539ec1d7fd1b6dcc3c645663376b43ed376bbf887733e4f772" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] + [[package]] name = "demo-stf" version = "0.2.0" @@ -306,6 +605,7 @@ dependencies = [ "borsh", "hex", "serde", + "simple-nft-module", "sov-accounts", "sov-bank", "sov-blob-storage", @@ -337,6 +637,17 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +[[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_more" version = "0.99.17" @@ -346,7 +657,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version", + "rustc_version 0.4.0", "syn 1.0.109", ] @@ -373,9 +684,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfc4744c1b8f2a09adc0e55242f60b1af195d88596bd8700be74418c056c555" +checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" [[package]] name = "ed25519" @@ -410,7 +721,7 @@ dependencies = [ "curve25519-dalek", "ed25519", "serde", - "sha2 0.10.6", + "sha2 0.10.8", ] [[package]] @@ -425,6 +736,18 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2b183d6ce6ca4cf30e3db37abf5b52568b5f9015c97d9fbdd7026aa5dcdd758" +[[package]] +name = "enum_dispatch" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" +dependencies = [ + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -433,9 +756,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" +checksum = "add4f07d43996f76ef320709726a556a9d4f965d9410d8d0271132d2f8293480" dependencies = [ "errno-dragonfly", "libc", @@ -464,9 +787,20 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[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 = "fiat-crypto" @@ -474,6 +808,18 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0870c84016d4b481be5c9f323c24f65e31e901ae618f0e80f4308fb00de1d2d" +[[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 = "fixedbitset" version = "0.4.2" @@ -490,6 +836,21 @@ dependencies = [ "paste", ] +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +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.28" @@ -583,9 +944,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" [[package]] name = "heck" @@ -603,10 +964,22 @@ dependencies = [ ] [[package]] -name = "hex-literal" -version = "0.4.1" +name = "hkdf" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +dependencies = [ + "hmac", +] + +[[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 = "home" @@ -630,10 +1003,40 @@ dependencies = [ "prost 0.11.9", "ripemd", "serde", - "sha2 0.10.6", + "sha2 0.10.8", "sha3", ] +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "indenter" version = "0.3.3" @@ -642,12 +1045,12 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.1", ] [[package]] @@ -669,6 +1072,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.9" @@ -686,12 +1098,12 @@ dependencies = [ "hashbrown 0.13.2", "hex", "ics23", - "itertools", + "itertools 0.10.5", "mirai-annotations", "num-derive 0.3.3", "num-traits", "serde", - "sha2 0.10.6", + "sha2 0.10.8", "thiserror", "tracing", ] @@ -705,6 +1117,12 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.148" @@ -713,15 +1131,31 @@ checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" [[package]] name = "libm" -version = "0.2.7" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libp2p-identity" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" +checksum = "f37304f29c82ede408db06aaba60cd2f783a111f46414d3fc4beedac19e0c67b" +dependencies = [ + "bs58", + "hkdf", + "log", + "multihash 0.19.1", + "quick-protobuf", + "rand", + "sha2 0.10.8", + "thiserror", +] [[package]] name = "linux-raw-sys" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" +checksum = "3852614a3bd9ca9804678ba6be5e3b8ce76dfc902cae004e3e0c44051b6e88db" [[package]] name = "log" @@ -731,9 +1165,9 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "memchr" -version = "2.6.3" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "mirai-annotations" @@ -741,6 +1175,71 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" +[[package]] +name = "multiaddr" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92a651988b3ed3ad1bc8c87d016bb92f6f395b84ed1db9b926b32b1fc5a2c8b5" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "libp2p-identity", + "multibase", + "multihash 0.19.1", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd8a792c1694c6da4f68db0a9d707c72bd260994da179e6030a5dcee00bb815" +dependencies = [ + "core2", + "multihash-derive", + "unsigned-varint", +] + +[[package]] +name = "multihash" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" +dependencies = [ + "core2", + "unsigned-varint", +] + +[[package]] +name = "multihash-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" +dependencies = [ + "proc-macro-crate 1.1.3", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + [[package]] name = "multimap" version = "0.8.3" @@ -750,12 +1249,23 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "nmt-rs" version = "0.1.0" -source = "git+https://github.com/Sovereign-Labs/nmt-rs.git?rev=dd37588444fca72825d11fe4a46838f66525c49f#dd37588444fca72825d11fe4a46838f66525c49f" +source = "git+https://github.com/Sovereign-Labs/nmt-rs.git?rev=d821332#d821332baa03aea625d23060dc239af57b9121f5" dependencies = [ "borsh", "bytes", "serde", - "sha2 0.10.6", + "sha2 0.10.8", +] + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", ] [[package]] @@ -777,35 +1287,89 @@ checksum = "9e6a0fd4f737c707bd9086cc16c925f294943eb62eb71499e9fd4cf71f8b9f4e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", ] [[package]] name = "num-traits" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "parity-scale-codec" +version = "3.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" dependencies = [ - "autocfg", + "proc-macro-crate 1.1.3", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "once_cell" -version = "1.18.0" +name = "paste" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] -name = "opaque-debug" -version = "0.3.0" +name = "percent-encoding" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] -name = "paste" -version = "1.0.14" +name = "pest" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "c022f1e7b65d6a24c0dbbd5fb344c66881bc01f3e5ae74a1c8100f2f985d98a4" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] [[package]] name = "petgraph" @@ -845,6 +1409,12 @@ version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4503fa043bf02cee09a9582e9554b4c6403b2ef55e4612e96561d294419429f8" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "prettyplease" version = "0.2.15" @@ -852,7 +1422,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.37", + "syn 2.0.38", +] + +[[package]] +name = "primitive-types" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", ] [[package]] @@ -864,15 +1445,65 @@ dependencies = [ "toml", ] +[[package]] +name = "proc-macro-crate" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +dependencies = [ + "thiserror", + "toml", +] + +[[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.67" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "5b1106fec09662ec6dd98ccac0f81cef56984d0b49f75c92d8cbad76e20c005c" dependencies = [ "unicode-ident", ] +[[package]] +name = "proptest" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c003ac8c77cb07bb74f5f198bce836a689bcd5a42574612bf14d17bfd08c20e" +dependencies = [ + "bitflags 2.4.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "unarray", +] + [[package]] name = "prost" version = "0.11.9" @@ -901,16 +1532,16 @@ checksum = "8bdf592881d821b83d471f8af290226c8d51402259e9bb5be7f9f8bdebbb11ac" dependencies = [ "bytes", "heck", - "itertools", + "itertools 0.11.0", "log", "multimap", "once_cell", "petgraph", "prettyplease", "prost 0.12.1", - "prost-types 0.12.1", + "prost-types", "regex", - "syn 2.0.37", + "syn 2.0.38", "tempfile", "which", ] @@ -922,7 +1553,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.5", "proc-macro2", "quote", "syn 1.0.109", @@ -935,28 +1566,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" dependencies = [ "anyhow", - "itertools", + "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] name = "prost-types" -version = "0.11.9" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" dependencies = [ - "prost 0.11.9", + "prost 0.12.1", ] [[package]] -name = "prost-types" -version = "0.12.1" +name = "quick-protobuf" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" dependencies = [ - "prost 0.12.1", + "byteorder", ] [[package]] @@ -968,11 +1599,50 @@ 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", +] + +[[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 = "redox_syscall" @@ -985,9 +1655,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.5" +version = "1.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" +checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff" dependencies = [ "aho-corasick", "memchr", @@ -997,9 +1667,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" +checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" dependencies = [ "aho-corasick", "memchr", @@ -1076,7 +1746,7 @@ dependencies = [ "risc0-core", "risc0-zkvm-platform", "serde", - "sha2 0.10.6", + "sha2 0.10.8", "tracing", ] @@ -1111,20 +1781,74 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8524b46783b58b00e9b2a4712e837093c975b23cf25bfaf99e1cf69e9011bf6b" +[[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 = "ruint" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95294d6e3a6192f3aabf91c38f56505a625aa495533442744185a36d75a790c4" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e666a5496a0b2186dbcd0ff6106e29e093c15591bde62c20d3842007c6978a09" + +[[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.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver", + "semver 1.0.19", ] [[package]] name = "rustix" -version = "0.38.13" +version = "0.38.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662" +checksum = "f25469e9ae0f3d0047ca8b93fc56843f38e6774f0914a107ff8b41be8be8e0b7" dependencies = [ "bitflags 2.4.0", "errno", @@ -1165,9 +1889,27 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.18" +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.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] [[package]] name = "serde" @@ -1195,7 +1937,7 @@ checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -1228,7 +1970,7 @@ checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -1246,8 +1988,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" -source = "git+https://github.com/risc0/RustCrypto-hashes?tag=sha2/v0.10.6-risc0#e75cafd9f55da196061f6fadf8bc8a86778192b7" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -1270,6 +2013,26 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +[[package]] +name = "simple-nft-module" +version = "0.2.0" +dependencies = [ + "anyhow", + "borsh", + "serde", + "sov-modules-api", + "sov-state", +] + +[[package]] +name = "smol_str" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" +dependencies = [ + "serde", +] + [[package]] name = "sov-accounts" version = "0.2.0" @@ -1319,16 +2082,15 @@ dependencies = [ "base64 0.21.4", "bech32", "borsh", + "celestia-proto", + "celestia-types", "hex", - "hex-literal", "nmt-rs", - "prost 0.11.9", - "prost-build", - "prost-types 0.11.9", + "prost 0.12.1", "risc0-zkvm", "risc0-zkvm-platform", "serde", - "sha2 0.10.6", + "sha2 0.10.8", "sov-rollup-interface", "sov-zk-cycle-macros", "tendermint", @@ -1381,7 +2143,7 @@ dependencies = [ "hex", "jmt", "serde", - "sha2 0.10.6", + "sha2 0.10.8", "sov-first-read-last-write-cache", "sov-modules-macros", "sov-rollup-interface", @@ -1482,7 +2244,7 @@ dependencies = [ "jmt", "serde", "serde_json", - "sha2 0.10.6", + "sha2 0.10.8", "sov-first-read-last-write-cache", "sov-rollup-interface", "thiserror", @@ -1496,9 +2258,7 @@ dependencies = [ "borsh", "hex", "serde", - "sov-modules-api", "sov-rollup-interface", - "sov-state", ] [[package]] @@ -1542,6 +2302,12 @@ dependencies = [ "der", ] +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "subtle" version = "2.5.0" @@ -1576,15 +2342,33 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.37" +version = "2.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" version = "3.8.0" @@ -1600,9 +2384,8 @@ dependencies = [ [[package]] name = "tendermint" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f0a7d05cf78524782337f8edd55cbc578d159a16ad4affe2135c92f7dbac7f0" +version = "0.32.0" +source = "git+https://github.com/eigerco/celestia-tendermint-rs.git?rev=1f8b574#1f8b574809a43b892f4beb59b887919b484fe232" dependencies = [ "bytes", "digest 0.10.7", @@ -1612,13 +2395,13 @@ dependencies = [ "futures", "num-traits", "once_cell", - "prost 0.11.9", - "prost-types 0.11.9", + "prost 0.12.1", + "prost-types", "serde", "serde_bytes", "serde_json", "serde_repr", - "sha2 0.10.6", + "sha2 0.10.8", "signature", "subtle", "subtle-encoding", @@ -1629,16 +2412,15 @@ dependencies = [ [[package]] name = "tendermint-proto" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cec054567d16d85e8c3f6a3139963d1a66d9d3051ed545d31562550e9bcc3d" +version = "0.32.0" +source = "git+https://github.com/eigerco/celestia-tendermint-rs.git?rev=1f8b574#1f8b574809a43b892f4beb59b887919b484fe232" dependencies = [ "bytes", "flex-error", "num-derive 0.3.3", "num-traits", - "prost 0.11.9", - "prost-types 0.11.9", + "prost 0.12.1", + "prost-types", "serde", "serde_bytes", "subtle-encoding", @@ -1647,29 +2429,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.48" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" +checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.48" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" +checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] name = "time" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" +checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe" dependencies = [ "deranged", "serde", @@ -1679,19 +2461,34 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +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 = "toml" version = "0.5.11" @@ -1721,7 +2518,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -1739,12 +2536,80 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + +[[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-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "unsigned-varint" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" + +[[package]] +name = "url" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "version_check" version = "0.9.4" @@ -1835,6 +2700,15 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zeroize" version = "1.6.0" @@ -1852,10 +2726,10 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[patch.unused]] -name = "cc" -version = "1.0.79" -source = "git+https://github.com/rust-lang/cc-rs?rev=e5bbdfa#e5bbdfa1fa468c028cb38fee6c35a3cf2e5a2736" +name = "sha2" +version = "0.10.6" +source = "git+https://github.com/risc0/RustCrypto-hashes?tag=sha2/v0.10.6-risc0#e75cafd9f55da196061f6fadf8bc8a86778192b7" diff --git a/examples/demo-prover/methods/guest-celestia/Cargo.toml b/examples/demo-rollup/provers/risc0/guest-celestia/Cargo.toml similarity index 70% rename from examples/demo-prover/methods/guest-celestia/Cargo.toml rename to examples/demo-rollup/provers/risc0/guest-celestia/Cargo.toml index 3927761c6..9a9e2cd85 100644 --- a/examples/demo-prover/methods/guest-celestia/Cargo.toml +++ b/examples/demo-rollup/provers/risc0/guest-celestia/Cargo.toml @@ -10,10 +10,10 @@ resolver = "2" anyhow = "1.0.68" risc0-zkvm = { version = "0.18", default-features = false, features = ["std"] } risc0-zkvm-platform = "0.18" -demo-stf = { path = "../../../demo-stf" } -sov-risc0-adapter = { path = "../../../../adapters/risc0" } -const-rollup-config = { path = "../../../const-rollup-config" } -sov-celestia-adapter = { path = "../../../../adapters/celestia" } +demo-stf = { path = "../../../../demo-stf" } +sov-risc0-adapter = { path = "../../../../../adapters/risc0" } +const-rollup-config = { path = "../../../../const-rollup-config" } +sov-celestia-adapter = { path = "../../../../../adapters/celestia" } [patch.crates-io] diff --git a/examples/demo-prover/methods/guest-celestia/src/bin/rollup.rs b/examples/demo-rollup/provers/risc0/guest-celestia/src/bin/rollup.rs similarity index 77% rename from examples/demo-prover/methods/guest-celestia/src/bin/rollup.rs rename to examples/demo-rollup/provers/risc0/guest-celestia/src/bin/rollup.rs index 729d0d734..712f5a450 100644 --- a/examples/demo-prover/methods/guest-celestia/src/bin/rollup.rs +++ b/examples/demo-rollup/provers/risc0/guest-celestia/src/bin/rollup.rs @@ -3,14 +3,13 @@ #![no_main] use const_rollup_config::ROLLUP_NAMESPACE_RAW; -use demo_stf::app::create_zk_app_template; -use sov_celestia_adapter::types::NamespaceId; +use demo_stf::{create_zk_app_template, AppVerifier}; +use sov_celestia_adapter::types::Namespace; use sov_celestia_adapter::verifier::CelestiaVerifier; -use demo_stf::AppVerifier; use sov_risc0_adapter::guest::Risc0Guest; // The rollup stores its data in the namespace b"sov-test" on Celestia -const ROLLUP_NAMESPACE: NamespaceId = NamespaceId(ROLLUP_NAMESPACE_RAW); +const ROLLUP_NAMESPACE: Namespace = Namespace::const_v0(ROLLUP_NAMESPACE_RAW); risc0_zkvm::guest::entry!(main); diff --git a/examples/demo-prover/methods/guest-mock/Cargo.lock b/examples/demo-rollup/provers/risc0/guest-mock/Cargo.lock similarity index 99% rename from examples/demo-prover/methods/guest-mock/Cargo.lock rename to examples/demo-rollup/provers/risc0/guest-mock/Cargo.lock index db5de049c..9886b7850 100644 --- a/examples/demo-prover/methods/guest-mock/Cargo.lock +++ b/examples/demo-rollup/provers/risc0/guest-mock/Cargo.lock @@ -193,10 +193,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" -[[package]] -name = "const-rollup-config" -version = "0.2.0" - [[package]] name = "convert_case" version = "0.4.0" @@ -257,6 +253,7 @@ dependencies = [ "borsh", "hex", "serde", + "simple-nft-module", "sov-accounts", "sov-bank", "sov-blob-storage", @@ -856,6 +853,17 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +[[package]] +name = "simple-nft-module" +version = "0.2.0" +dependencies = [ + "anyhow", + "borsh", + "serde", + "sov-modules-api", + "sov-state", +] + [[package]] name = "sov-accounts" version = "0.2.0" @@ -913,7 +921,6 @@ name = "sov-demo-prover-guest-mock" version = "0.2.0" dependencies = [ "anyhow", - "const-rollup-config", "demo-stf", "risc0-zkvm", "risc0-zkvm-platform", @@ -1056,9 +1063,7 @@ dependencies = [ "borsh", "hex", "serde", - "sov-modules-api", "sov-rollup-interface", - "sov-state", ] [[package]] diff --git a/examples/demo-prover/methods/guest-mock/Cargo.toml b/examples/demo-rollup/provers/risc0/guest-mock/Cargo.toml similarity index 67% rename from examples/demo-prover/methods/guest-mock/Cargo.toml rename to examples/demo-rollup/provers/risc0/guest-mock/Cargo.toml index 3daff6a75..26b8c31f6 100644 --- a/examples/demo-prover/methods/guest-mock/Cargo.toml +++ b/examples/demo-rollup/provers/risc0/guest-mock/Cargo.toml @@ -10,10 +10,9 @@ resolver = "2" anyhow = "1.0.68" risc0-zkvm = { version = "0.18", default-features = false, features = ["std"] } risc0-zkvm-platform = "0.18" -sov-rollup-interface = { path = "../../../../rollup-interface", features = ["mocks"] } -demo-stf = { path = "../../../demo-stf" } -sov-risc0-adapter = { path = "../../../../adapters/risc0" } -const-rollup-config = { path = "../../../const-rollup-config" } +sov-rollup-interface = { path = "../../../../../rollup-interface", features = ["mocks"] } +demo-stf = { path = "../../../../demo-stf" } +sov-risc0-adapter = { path = "../../../../../adapters/risc0" } [patch.crates-io] sha2 = { git = "https://github.com/risc0/RustCrypto-hashes", tag = "sha2/v0.10.6-risc0" } diff --git a/examples/demo-prover/methods/guest-mock/src/bin/mock_da.rs b/examples/demo-rollup/provers/risc0/guest-mock/src/bin/mock_da.rs similarity index 84% rename from examples/demo-prover/methods/guest-mock/src/bin/mock_da.rs rename to examples/demo-rollup/provers/risc0/guest-mock/src/bin/mock_da.rs index dc24324a0..210977fdb 100644 --- a/examples/demo-prover/methods/guest-mock/src/bin/mock_da.rs +++ b/examples/demo-rollup/provers/risc0/guest-mock/src/bin/mock_da.rs @@ -1,7 +1,6 @@ #![no_main] -use demo_stf::app::create_zk_app_template; -use demo_stf::AppVerifier; +use demo_stf::{create_zk_app_template, AppVerifier}; use sov_risc0_adapter::guest::Risc0Guest; use sov_rollup_interface::mocks::MockDaVerifier; @@ -13,7 +12,7 @@ pub fn main() { let mut stf_verifier = AppVerifier::new(create_zk_app_template::(), MockDaVerifier {}); - + stf_verifier .run_block(guest) .expect("Prover must be honest"); diff --git a/examples/demo-prover/methods/src/lib.rs b/examples/demo-rollup/provers/risc0/src/lib.rs similarity index 100% rename from examples/demo-prover/methods/src/lib.rs rename to examples/demo-rollup/provers/risc0/src/lib.rs diff --git a/examples/demo-prover/src/main.rs b/examples/demo-rollup/provers/src/main.rs similarity index 84% rename from examples/demo-prover/src/main.rs rename to examples/demo-rollup/provers/src/main.rs index c37d91d1d..bf2a1a024 100644 --- a/examples/demo-prover/src/main.rs +++ b/examples/demo-rollup/provers/src/main.rs @@ -1,6 +1,7 @@ use std::env; -use methods::ROLLUP_ELF; +use demo_stf::genesis_config::GenesisPaths; +use risc0::ROLLUP_ELF; use sov_demo_rollup::{new_rollup_with_celestia_da, DemoProverConfig}; use sov_risc0_adapter::host::Risc0Host; use tracing::info; @@ -12,11 +13,7 @@ async fn main() -> Result<(), anyhow::Error> { // If SKIP_PROVER is set, We still compile and run the zkVM code inside of an emulator without generating // a proof. This dramatically reduces the runtime of the prover, while still ensuring that our rollup // code is valid and operates as expected. - let prover_config = if env::var("SKIP_PROVER").is_ok() { - DemoProverConfig::Execute - } else { - DemoProverConfig::Prove - }; + let prover_config = DemoProverConfig::Execute; // Initializing logging let subscriber = tracing_subscriber::fmt() @@ -39,8 +36,13 @@ async fn main() -> Result<(), anyhow::Error> { // Initialize the rollup. For this demo, we use Risc0 and Celestia. let prover = Risc0Host::new(ROLLUP_ELF); - let rollup = - new_rollup_with_celestia_da(&rollup_config_path, Some((prover, prover_config))).await?; + + let rollup = new_rollup_with_celestia_da( + &rollup_config_path, + Some((prover, prover_config)), + &GenesisPaths::from_dir("../test-data/genesis/demo-tests"), + ) + .await?; rollup.run().await?; Ok(()) diff --git a/examples/demo-rollup/rollup_config.toml b/examples/demo-rollup/rollup_config.toml index 1aaf8160f..23f9be3ff 100644 --- a/examples/demo-rollup/rollup_config.toml +++ b/examples/demo-rollup/rollup_config.toml @@ -15,7 +15,7 @@ path = "demo_data" # We define the rollup's genesis to occur at block number `start_height`. The rollup will ignore # any blocks before this height [runner] -start_height = 1 +start_height = 3 [runner.rpc_config] # the host and port to bind the rpc server for diff --git a/utils/nft-utils/src/main.rs b/examples/demo-rollup/src/bin/sov_nft_script.rs similarity index 52% rename from utils/nft-utils/src/main.rs rename to examples/demo-rollup/src/bin/sov_nft_script.rs index 15d01ae71..87037d22a 100644 --- a/utils/nft-utils/src/main.rs +++ b/examples/demo-rollup/src/bin/sov_nft_script.rs @@ -1,12 +1,18 @@ use std::thread; use std::time::Duration; -use nft_utils::{ - build_create_collection_transactions, build_mint_transactions, build_transfer_transactions, -}; +use borsh::ser::BorshSerialize; +use demo_stf::runtime::RuntimeCall; use sov_modules_api::default_context::DefaultContext; use sov_modules_api::default_signature::private_key::DefaultPrivateKey; -use sov_nft_module::utils::get_collection_address; +use sov_modules_api::transaction::Transaction; +use sov_modules_api::PrivateKey; +use sov_nft_module::utils::{ + get_collection_address, get_create_collection_message, get_mint_nft_message, + get_transfer_nft_message, +}; +use sov_nft_module::{CallMessage, CollectionAddress}; +use sov_rollup_interface::mocks::MockDaSpec; use sov_sequencer::utils::SimpleClient; const COLLECTION_1: &str = "Sovereign Squirrel Syndicate"; @@ -28,6 +34,94 @@ const PK3: [u8; 32] = [ 161, 208, 245, 116, 93, 84, 37, 87, 171, 44, 30, 239, ]; +pub fn build_transaction( + signer: &DefaultPrivateKey, + message: CallMessage, + nonce: u64, +) -> Transaction { + let runtime_encoded_message = RuntimeCall::::nft(message); + Transaction::::new_signed_tx( + signer, + runtime_encoded_message.try_to_vec().unwrap(), + nonce, + ) +} + +pub fn build_create_collection_transactions( + creator_pk: &DefaultPrivateKey, + start_nonce: &mut u64, + base_uri: &str, + collections: &[&str], +) -> Vec> { + collections + .iter() + .map(|&collection_name| { + let tx = build_transaction( + creator_pk, + get_create_collection_message( + &creator_pk.default_address(), + collection_name, + base_uri, + ), + *start_nonce, + ); + *start_nonce += 1; + tx + }) + .collect() +} + +/// Convenience and readability wrapper for build_mint_nft_transaction +pub fn build_mint_transactions( + creator_pk: &DefaultPrivateKey, + start_nonce: &mut u64, + collection: &str, + start_nft_id: &mut u64, + num: usize, + base_uri: &str, + owner_pk: &DefaultPrivateKey, +) -> Vec> { + (0..num) + .map(|_| { + let tx = build_transaction( + creator_pk, + get_mint_nft_message( + &creator_pk.default_address(), + collection, + *start_nft_id, + base_uri, + &owner_pk.default_address(), + ), + *start_nonce, + ); + *start_nft_id += 1; + *start_nonce += 1; + tx + }) + .collect() +} + +pub fn build_transfer_transactions( + signer: &DefaultPrivateKey, + start_nonce: &mut u64, + collection_address: &CollectionAddress, + nft_ids: Vec, +) -> Vec> { + nft_ids + .into_iter() + .map(|nft_id| { + let new_owner = DefaultPrivateKey::generate().default_address(); + let tx = build_transaction( + signer, + get_transfer_nft_message(collection_address, nft_id, &new_owner), + *start_nonce, + ); + *start_nonce += 1; + tx + }) + .collect() +} + #[tokio::main] async fn main() { let creator_pk = DefaultPrivateKey::try_from(&PK1[..]).unwrap(); diff --git a/examples/demo-rollup/src/lib.rs b/examples/demo-rollup/src/lib.rs index e25d878f5..48973dd44 100644 --- a/examples/demo-rollup/src/lib.rs +++ b/examples/demo-rollup/src/lib.rs @@ -12,13 +12,13 @@ pub use rollup::{ new_rollup_with_celestia_da, new_rollup_with_mock_da, new_rollup_with_mock_da_from_config, DemoProverConfig, Rollup, }; -use sov_celestia_adapter::types::NamespaceId; +use sov_celestia_adapter::types::Namespace; #[cfg(feature = "native")] use sov_db::ledger_db::LedgerDB; /// The rollup stores its data in the namespace b"sov-test" on Celestia /// You can change this constant to point your rollup at a different namespace -pub const ROLLUP_NAMESPACE: NamespaceId = NamespaceId(ROLLUP_NAMESPACE_RAW); +pub const ROLLUP_NAMESPACE: Namespace = Namespace::const_v0(ROLLUP_NAMESPACE_RAW); #[cfg(feature = "native")] /// Initializes a [`LedgerDB`] using the provided `path`. diff --git a/examples/demo-rollup/src/main.rs b/examples/demo-rollup/src/main.rs index cfccceff3..1726f21d0 100644 --- a/examples/demo-rollup/src/main.rs +++ b/examples/demo-rollup/src/main.rs @@ -1,7 +1,9 @@ use std::str::FromStr; use clap::Parser; -use sov_demo_rollup::{new_rollup_with_celestia_da, new_rollup_with_mock_da}; +use demo_stf::genesis_config::GenesisPaths; +use risc0::{MOCK_DA_ELF, ROLLUP_ELF}; +use sov_demo_rollup::{new_rollup_with_celestia_da, new_rollup_with_mock_da, DemoProverConfig}; use sov_risc0_adapter::host::Risc0Host; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; @@ -30,7 +32,7 @@ async fn main() -> Result<(), anyhow::Error> { // Initializing logging tracing_subscriber::registry() .with(fmt::layer()) - .with(EnvFilter::from_str("info,sov_sequencer=warn").unwrap()) + .with(EnvFilter::from_str("debug,hyper=info").unwrap()) .init(); let args = Args::parse(); @@ -38,12 +40,28 @@ async fn main() -> Result<(), anyhow::Error> { match args.da_layer.as_str() { "mock" => { - let rollup = new_rollup_with_mock_da::>(rollup_config_path, None)?; + let _prover = Risc0Host::new(MOCK_DA_ELF); + let _config = DemoProverConfig::Execute; + + let rollup = new_rollup_with_mock_da::, _>( + rollup_config_path, + //Some((prover, config)), + None, + &GenesisPaths::from_dir("../test-data/genesis/integration-tests"), + )?; rollup.run().await } "celestia" => { - let rollup = - new_rollup_with_celestia_da::>(rollup_config_path, None).await?; + let _prover = Risc0Host::new(ROLLUP_ELF); + let _config = DemoProverConfig::Execute; + + let rollup = new_rollup_with_celestia_da::, _>( + rollup_config_path, + //Some((prover, config)), + None, + &GenesisPaths::from_dir("../test-data/genesis/demo-tests"), + ) + .await?; rollup.run().await } da => panic!("DA Layer not supported: {}", da), diff --git a/examples/demo-rollup/src/register_rpc.rs b/examples/demo-rollup/src/register_rpc.rs index 57d1a340b..9f119dc69 100644 --- a/examples/demo-rollup/src/register_rpc.rs +++ b/examples/demo-rollup/src/register_rpc.rs @@ -1,7 +1,7 @@ //! Full-Node specific RPC methods. use anyhow::Context; -use demo_stf::app::App; +use demo_stf::App; use sov_celestia_adapter::verifier::address::CelestiaAddress; use sov_db::ledger_db::LedgerDB; #[cfg(feature = "experimental")] diff --git a/examples/demo-rollup/src/rollup.rs b/examples/demo-rollup/src/rollup.rs index bcad9f83b..038a24163 100644 --- a/examples/demo-rollup/src/rollup.rs +++ b/examples/demo-rollup/src/rollup.rs @@ -1,14 +1,12 @@ use std::net::SocketAddr; +use std::path::Path; use std::str::FromStr; use anyhow::Context; use const_rollup_config::SEQUENCER_DA_ADDRESS; -#[cfg(feature = "experimental")] -use demo_stf::app::DefaultPrivateKey; -use demo_stf::app::{create_zk_app_template, App, DefaultContext}; -use demo_stf::genesis_config::get_genesis_config; +use demo_stf::genesis_config::{get_genesis_config, GenesisPaths, StorageConfig}; use demo_stf::runtime::{get_rpc_methods, GenesisConfig, Runtime}; -use demo_stf::AppVerifier; +use demo_stf::{create_zk_app_template, App, AppVerifier}; #[cfg(feature = "experimental")] use secp256k1::SecretKey; use sov_celestia_adapter::verifier::address::CelestiaAddress; @@ -19,9 +17,13 @@ use sov_cli::wallet_state::PrivateKeyAndAddress; use sov_db::ledger_db::LedgerDB; #[cfg(feature = "experimental")] use sov_ethereum::experimental::EthRpcConfig; -use sov_modules_api::default_context::ZkDefaultContext; +use sov_modules_api::default_context::{DefaultContext, ZkDefaultContext}; +#[cfg(feature = "experimental")] +use sov_modules_api::default_signature::private_key::DefaultPrivateKey; use sov_modules_stf_template::AppTemplate; -use sov_rollup_interface::mocks::{MockAddress, MockDaConfig, MockDaService}; +use sov_rollup_interface::mocks::{ + MockAddress, MockDaConfig, MockDaService, MOCK_SEQUENCER_DA_ADDRESS, +}; use sov_rollup_interface::services::da::DaService; use sov_rollup_interface::zk::ZkvmHost; use sov_stf_runner::{ @@ -66,9 +68,10 @@ pub fn configure_prover( da_verifier: Da::Verifier, ) -> Prover, Da, Vm> { let config = match cfg { - DemoProverConfig::Simulate => { - ProofGenConfig::Simulate(AppVerifier::new(create_zk_app_template(), da_verifier)) - } + DemoProverConfig::Simulate => ProofGenConfig::Simulate(AppVerifier::new( + create_zk_app_template::(), + da_verifier, + )), DemoProverConfig::Execute => ProofGenConfig::Execute, DemoProverConfig::Prove => ProofGenConfig::Prover, }; @@ -86,14 +89,16 @@ pub enum DemoProverConfig { } /// Creates celestia based rollup. -pub async fn new_rollup_with_celestia_da( +pub async fn new_rollup_with_celestia_da>( rollup_config_path: &str, prover: Option<(Vm, DemoProverConfig)>, + genesis_paths: &GenesisPaths

, ) -> Result, anyhow::Error> { debug!( "Starting demo celestia rollup with config {}", rollup_config_path ); + let rollup_config: RollupConfig = from_toml_path(rollup_config_path).context("Failed to read rollup configuration")?; @@ -107,13 +112,17 @@ pub async fn new_rollup_with_celestia_da( ) .await; - let app = App::new(rollup_config.storage); + let storage_config = StorageConfig { + path: rollup_config.storage.path, + }; + let app = App::new(storage_config); let sequencer_da_address = CelestiaAddress::from_str(SEQUENCER_DA_ADDRESS)?; #[cfg(feature = "experimental")] let eth_signer = read_eth_tx_signers(); - let genesis_config = demo_stf::genesis_config::get_genesis_config( + let genesis_config = get_genesis_config( sequencer_da_address, + genesis_paths, #[cfg(feature = "experimental")] eth_signer.signers(), ); @@ -144,32 +153,38 @@ pub async fn new_rollup_with_celestia_da( } /// Creates MockDa based rollup. -pub fn new_rollup_with_mock_da( +pub fn new_rollup_with_mock_da>( rollup_config_path: &str, prover: Option<(Vm, DemoProverConfig)>, + genesis_paths: &GenesisPaths

, ) -> Result, anyhow::Error> { debug!("Starting mock rollup with config {}", rollup_config_path); let rollup_config: RollupConfig = from_toml_path(rollup_config_path).context("Failed to read rollup configuration")?; - new_rollup_with_mock_da_from_config(rollup_config, prover) + new_rollup_with_mock_da_from_config(rollup_config, prover, genesis_paths) } /// Creates MockDa based rollup. -pub fn new_rollup_with_mock_da_from_config( +pub fn new_rollup_with_mock_da_from_config>( rollup_config: RollupConfig, prover: Option<(Vm, DemoProverConfig)>, + genesis_paths: &GenesisPaths

, ) -> Result, anyhow::Error> { let ledger_db = initialize_ledger(&rollup_config.storage.path); - let sequencer_da_address = MockAddress::from([0u8; 32]); + let sequencer_da_address = MockAddress::from(MOCK_SEQUENCER_DA_ADDRESS); let da_service = MockDaService::new(sequencer_da_address); #[cfg(feature = "experimental")] let eth_signer = read_eth_tx_signers(); - let app = App::new(rollup_config.storage); + let storage_config = StorageConfig { + path: rollup_config.storage.path, + }; + let app = App::new(storage_config); let genesis_config = get_genesis_config( sequencer_da_address, + genesis_paths, #[cfg(feature = "experimental")] eth_signer.signers(), ); diff --git a/examples/demo-rollup/src/sov-cli/main.rs b/examples/demo-rollup/src/sov-cli/main.rs index 1447f19f3..685cadc7d 100644 --- a/examples/demo-rollup/src/sov-cli/main.rs +++ b/examples/demo-rollup/src/sov-cli/main.rs @@ -1,6 +1,6 @@ #[tokio::main] async fn main() -> Result<(), anyhow::Error> { - demo_stf::cli::run::< + demo_stf::cli::run_wallet::< ::Spec, >() .await diff --git a/examples/demo-rollup/src/test_rpc.rs b/examples/demo-rollup/src/test_rpc.rs index 3b5021b3b..cd3f093b9 100644 --- a/examples/demo-rollup/src/test_rpc.rs +++ b/examples/demo-rollup/src/test_rpc.rs @@ -80,7 +80,7 @@ fn test_helper(test_queries: Vec, slots: Vec Result<(), anyhow::Error> { let config = DemoProverConfig::Execute; let rollup_task = tokio::spawn(async { - start_rollup(port_tx, Some((prover, config))).await; + start_rollup( + port_tx, + Some((prover, config)), + &GenesisPaths::from_dir("../test-data/genesis/integration-tests"), + ) + .await; }); // Wait for rollup task to start: diff --git a/examples/demo-rollup/tests/evm/mod.rs b/examples/demo-rollup/tests/evm/mod.rs index b9942c14b..1facac6d4 100644 --- a/examples/demo-rollup/tests/evm/mod.rs +++ b/examples/demo-rollup/tests/evm/mod.rs @@ -1,489 +1,193 @@ +mod test_client; + use std::net::SocketAddr; use std::str::FromStr; -use ethereum_types::H160; +use demo_stf::genesis_config::GenesisPaths; use ethers_core::abi::Address; -use ethers_core::k256::ecdsa::SigningKey; -use ethers_core::types::transaction::eip2718::TypedTransaction; -use ethers_core::types::{ - Block, Eip1559TransactionRequest, Transaction, TransactionRequest, TxHash, -}; -use ethers_middleware::SignerMiddleware; -use ethers_providers::{Http, Middleware, PendingTransaction, Provider}; -use ethers_signers::{LocalWallet, Signer, Wallet}; -use jsonrpsee::core::client::ClientT; -use jsonrpsee::http_client::{HttpClient, HttpClientBuilder}; -use jsonrpsee::rpc_params; -use reth_primitives::Bytes; +use ethers_signers::{LocalWallet, Signer}; use sov_evm::SimpleStorageContract; use sov_risc0_adapter::host::Risc0Host; +use test_client::TestClient; use super::test_helpers::start_rollup; -const MAX_FEE_PER_GAS: u64 = 100000001; - -struct TestClient { - chain_id: u64, - from_addr: Address, - contract: SimpleStorageContract, - client: SignerMiddleware, Wallet>, - http_client: HttpClient, -} - -impl TestClient { - #[allow(dead_code)] - async fn new( - chain_id: u64, - key: Wallet, - from_addr: Address, - contract: SimpleStorageContract, - rpc_addr: std::net::SocketAddr, - ) -> Self { - let host = format!("http://localhost:{}", rpc_addr.port()); - - let provider = Provider::try_from(&host).unwrap(); - let client = SignerMiddleware::new_with_provider_chain(provider, key) - .await - .unwrap(); - - let http_client = HttpClientBuilder::default().build(host).unwrap(); - - Self { - chain_id, - from_addr, - contract, - client, - http_client, - } - } - - async fn send_publish_batch_request(&self) { - let _: String = self - .http_client - .request("eth_publishBatch", rpc_params![]) - .await - .unwrap(); - } +#[cfg(feature = "experimental")] +#[tokio::test] +async fn evm_tx_tests() -> Result<(), anyhow::Error> { + let (port_tx, port_rx) = tokio::sync::oneshot::channel(); - async fn deploy_contract( - &self, - ) -> Result, Box> { - let req = Eip1559TransactionRequest::new() - .from(self.from_addr) - .chain_id(self.chain_id) - .nonce(0u64) - .max_priority_fee_per_gas(10u64) - .max_fee_per_gas(MAX_FEE_PER_GAS) - .gas(900000u64) - .data(self.contract.byte_code()); - - let typed_transaction = TypedTransaction::Eip1559(req); - - let receipt_req = self - .client - .send_transaction(typed_transaction, None) - .await?; - - Ok(receipt_req) - } + let rollup_task = tokio::spawn(async { + // Don't provide a prover since the EVM is not currently provable + start_rollup::, _>( + port_tx, + None, + &GenesisPaths::from_dir("../test-data/genesis/integration-tests"), + ) + .await; + }); - async fn deploy_contract_call(&self) -> Result> { - let req = Eip1559TransactionRequest::new() - .from(self.from_addr) - .chain_id(self.chain_id) - .nonce(0u64) - .max_priority_fee_per_gas(10u64) - .max_fee_per_gas(MAX_FEE_PER_GAS) - .gas(900000u64) - .data(self.contract.byte_code()); + // Wait for rollup task to start: + let port = port_rx.await.unwrap(); + send_tx_test_to_eth(port).await.unwrap(); + rollup_task.abort(); + Ok(()) +} - let typed_transaction = TypedTransaction::Eip1559(req); +async fn send_tx_test_to_eth(rpc_address: SocketAddr) -> Result<(), Box> { + let chain_id: u64 = 1; + let key = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + .parse::() + .unwrap() + .with_chain_id(chain_id); - let receipt_req = self.eth_call(typed_transaction, None).await?; + let contract = SimpleStorageContract::default(); - Ok(receipt_req) - } + let from_addr = Address::from_str("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266").unwrap(); - async fn set_value_unsigned( - &self, - contract_address: H160, - set_arg: u32, - ) -> PendingTransaction<'_, Http> { - // Tx without gas_limit should estimate and include it in send_transaction endpoint - // Tx without nonce should fetch and include it in send_transaction endpoint - let req = Eip1559TransactionRequest::new() - .from(self.from_addr) - .to(contract_address) - .chain_id(self.chain_id) - .data(self.contract.set_call_data(set_arg)) - .max_priority_fee_per_gas(10u64) - .max_fee_per_gas(MAX_FEE_PER_GAS); - - let typed_transaction = TypedTransaction::Eip1559(req); - - self.eth_send_transaction(typed_transaction).await - } + let test_client = TestClient::new(chain_id, key, from_addr, contract, rpc_address).await; - async fn set_value( - &self, - contract_address: H160, - set_arg: u32, - ) -> PendingTransaction<'_, Http> { - let nonce = self.eth_get_transaction_count(self.from_addr).await; - - let req = Eip1559TransactionRequest::new() - .from(self.from_addr) - .to(contract_address) - .chain_id(self.chain_id) - .nonce(nonce) - .data(self.contract.set_call_data(set_arg)) - .max_priority_fee_per_gas(10u64) - .max_fee_per_gas(MAX_FEE_PER_GAS) - .gas(900000u64); - - let typed_transaction = TypedTransaction::Eip1559(req); - - self.client - .send_transaction(typed_transaction, None) - .await - .unwrap() - } + let etc_accounts = test_client.eth_accounts().await; + assert_eq!(vec![from_addr], etc_accounts); - async fn set_value_call( - &self, - contract_address: H160, - set_arg: u32, - ) -> Result> { - let nonce = self.eth_get_transaction_count(self.from_addr).await; - - // Any type of transaction can be used for eth_call - let req = TransactionRequest::new() - .from(self.from_addr) - .to(contract_address) - .chain_id(self.chain_id) - .nonce(nonce) - .data(self.contract.set_call_data(set_arg)) - .gas_price(10u64); - - let typed_transaction = TypedTransaction::Legacy(req.clone()); - - // Estimate gas on rpc - let gas = self - .eth_estimate_gas(typed_transaction, Some("latest".to_owned())) - .await; - - // Call with the estimated gas - let req = req.gas(gas); - let typed_transaction = TypedTransaction::Legacy(req); - - let response = self - .eth_call(typed_transaction, Some("latest".to_owned())) - .await?; - - Ok(response) - } + let eth_chain_id = test_client.eth_chain_id().await; + assert_eq!(chain_id, eth_chain_id); - async fn failing_call( - &self, - contract_address: H160, - ) -> Result> { - let nonce = self.eth_get_transaction_count(self.from_addr).await; - - // Any type of transaction can be used for eth_call - let req = Eip1559TransactionRequest::new() - .from(self.from_addr) - .to(contract_address) - .chain_id(self.chain_id) - .nonce(nonce) - .data(self.contract.failing_function_call_data()) - .max_priority_fee_per_gas(10u64) - .max_fee_per_gas(MAX_FEE_PER_GAS) - .gas(900000u64); - - let typed_transaction = TypedTransaction::Eip1559(req); - - self.eth_call(typed_transaction, Some("latest".to_owned())) - .await - } + // No block exists yet + let latest_block = test_client + .eth_get_block_by_number(Some("latest".to_owned())) + .await; + let earliest_block = test_client + .eth_get_block_by_number(Some("earliest".to_owned())) + .await; - async fn query_contract( - &self, - contract_address: H160, - ) -> Result> { - let nonce = self.eth_get_transaction_count(self.from_addr).await; + assert_eq!(latest_block, earliest_block); + assert_eq!(latest_block.number.unwrap().as_u64(), 0); - let req = Eip1559TransactionRequest::new() - .from(self.from_addr) - .to(contract_address) - .chain_id(self.chain_id) - .nonce(nonce) - .data(self.contract.get_call_data()) - .gas(900000u64); + execute(&test_client).await +} - let typed_transaction = TypedTransaction::Eip1559(req); +async fn execute(client: &TestClient) -> Result<(), Box> { + // Nonce should be 0 in genesis + let nonce = client.eth_get_transaction_count(client.from_addr).await; + assert_eq!(0, nonce); - let response = self.client.call(&typed_transaction, None).await?; + // Balance should be > 0 in genesis + let balance = client.eth_get_balance(client.from_addr).await; + assert!(balance > ethereum_types::U256::zero()); - let resp_array: [u8; 32] = response.to_vec().try_into().unwrap(); - Ok(ethereum_types::U256::from(resp_array)) - } + let (contract_address, runtime_code) = { + let runtime_code = client.deploy_contract_call().await?; - async fn eth_accounts(&self) -> Vec

{ - self.http_client - .request("eth_accounts", rpc_params![]) - .await - .unwrap() - } + let deploy_contract_req = client.deploy_contract().await?; + client.send_publish_batch_request().await; - async fn eth_send_transaction(&self, tx: TypedTransaction) -> PendingTransaction<'_, Http> { - self.client - .provider() - .send_transaction(tx, None) - .await + let contract_address = deploy_contract_req + .await? .unwrap() - } - - async fn eth_chain_id(&self) -> u64 { - let chain_id: ethereum_types::U64 = self - .http_client - .request("eth_chainId", rpc_params![]) - .await + .contract_address .unwrap(); - chain_id.as_u64() - } - - async fn eth_get_balance(&self, address: Address) -> ethereum_types::U256 { - self.http_client - .request("eth_getBalance", rpc_params![address, "latest"]) - .await - .unwrap() - } + (contract_address, runtime_code) + }; + + // Assert contract deployed correctly + let code = client.eth_get_code(contract_address).await; + // code has natural following 0x00 bytes, so we need to trim it + assert_eq!(code.to_vec()[..runtime_code.len()], runtime_code.to_vec()); + + // Nonce should be 1 after the deploy + let nonce = client.eth_get_transaction_count(client.from_addr).await; + assert_eq!(1, nonce); + + // Check that the first block has published + // It should have a single transaction, deploying the contract + let first_block = client.eth_get_block_by_number(Some("1".to_owned())).await; + assert_eq!(first_block.number.unwrap().as_u64(), 1); + assert_eq!(first_block.transactions.len(), 1); + + let set_arg = 923; + let tx_hash = { + let set_value_req = client.set_value(contract_address, set_arg).await; + client.send_publish_batch_request().await; + set_value_req.await.unwrap().unwrap().transaction_hash + }; + + let get_arg = client.query_contract(contract_address).await?; + assert_eq!(set_arg, get_arg.as_u32()); + + // Assert storage slot is set + let storage_slot = 0x0; + let storage_value = client + .eth_get_storage_at(contract_address, storage_slot.into()) + .await; + assert_eq!(storage_value, ethereum_types::U256::from(set_arg)); - async fn eth_get_storage_at( - &self, - address: Address, - index: ethereum_types::U256, - ) -> ethereum_types::U256 { - self.http_client - .request("eth_getStorageAt", rpc_params![address, index, "latest"]) - .await - .unwrap() - } + // Check that the second block has published + // None should return the latest block + // It should have a single transaction, setting the value + let latest_block = client.eth_get_block_by_number_with_detail(None).await; + assert_eq!(latest_block.number.unwrap().as_u64(), 2); + assert_eq!(latest_block.transactions.len(), 1); + assert_eq!(latest_block.transactions[0].hash, tx_hash); - async fn eth_get_code(&self, address: Address) -> Bytes { - self.http_client - .request("eth_getCode", rpc_params![address, "latest"]) - .await - .unwrap() - } + // This should just pass without error + client + .set_value_call(contract_address, set_arg) + .await + .unwrap(); - async fn eth_get_transaction_count(&self, address: Address) -> u64 { - let count: ethereum_types::U64 = self - .http_client - .request("eth_getTransactionCount", rpc_params![address, "latest"]) - .await - .unwrap(); + // This call should fail because function does not exist + let failing_call = client.failing_call(contract_address).await; + assert!(failing_call.is_err()); - count.as_u64() + // Create a blob with multiple transactions. + let mut requests = Vec::default(); + for value in 100..103 { + let set_value_req = client.set_value(contract_address, value).await; + requests.push(set_value_req); } - async fn eth_get_block_by_number(&self, block_number: Option) -> Block { - self.http_client - .request("eth_getBlockByNumber", rpc_params![block_number, false]) - .await - .unwrap() - } + client.send_publish_batch_request().await; - async fn eth_get_block_by_number_with_detail( - &self, - block_number: Option, - ) -> Block { - self.http_client - .request("eth_getBlockByNumber", rpc_params![block_number, true]) - .await - .unwrap() - } + // second block + client.send_publish_batch_request().await; - async fn eth_call( - &self, - tx: TypedTransaction, - block_number: Option, - ) -> Result> { - self.http_client - .request("eth_call", rpc_params![tx, block_number]) - .await - .map_err(|e| e.into()) - } + let first_block = client.eth_get_block_by_number(Some("0".to_owned())).await; + let second_block = client.eth_get_block_by_number(Some("1".to_owned())).await; - async fn eth_estimate_gas(&self, tx: TypedTransaction, block_number: Option) -> u64 { - let gas: ethereum_types::U64 = self - .http_client - .request("eth_estimateGas", rpc_params![tx, block_number]) - .await - .unwrap(); + // assert parent hash + assert_eq!( + first_block.hash.unwrap(), + second_block.parent_hash, + "Parent hash should be the hash of the previous block" + ); - gas.as_u64() + for req in requests { + req.await.unwrap(); } - async fn execute(self) -> Result<(), Box> { - // Nonce should be 0 in genesis - let nonce = self.eth_get_transaction_count(self.from_addr).await; - assert_eq!(0, nonce); - - // Balance should be > 0 in genesis - let balance = self.eth_get_balance(self.from_addr).await; - assert!(balance > ethereum_types::U256::zero()); - - let (contract_address, runtime_code) = { - let runtime_code = self.deploy_contract_call().await?; - - let deploy_contract_req = self.deploy_contract().await?; - self.send_publish_batch_request().await; - - let contract_address = deploy_contract_req - .await? - .unwrap() - .contract_address - .unwrap(); - - (contract_address, runtime_code) - }; - - // Assert contract deployed correctly - let code = self.eth_get_code(contract_address).await; - // code has natural following 0x00 bytes, so we need to trim it - assert_eq!(code.to_vec()[..runtime_code.len()], runtime_code.to_vec()); - - // Nonce should be 1 after the deploy - let nonce = self.eth_get_transaction_count(self.from_addr).await; - assert_eq!(1, nonce); + { + let get_arg = client.query_contract(contract_address).await?; + assert_eq!(102, get_arg.as_u32()); + } - // Check that the first block has published - // It should have a single transaction, deploying the contract - let first_block = self.eth_get_block_by_number(Some("1".to_owned())).await; - assert_eq!(first_block.number.unwrap().as_u64(), 1); - assert_eq!(first_block.transactions.len(), 1); + { + let value = 103; - let set_arg = 923; let tx_hash = { - let set_value_req = self.set_value(contract_address, set_arg).await; - self.send_publish_batch_request().await; + let set_value_req = client.set_value_unsigned(contract_address, value).await; + client.send_publish_batch_request().await; set_value_req.await.unwrap().unwrap().transaction_hash }; - let get_arg = self.query_contract(contract_address).await?; - assert_eq!(set_arg, get_arg.as_u32()); - - // Assert storage slot is set - let storage_slot = 0x0; - let storage_value = self - .eth_get_storage_at(contract_address, storage_slot.into()) - .await; - assert_eq!(storage_value, ethereum_types::U256::from(set_arg)); - - // Check that the second block has published - // None should return the latest block - // It should have a single transaction, setting the value - let latest_block = self.eth_get_block_by_number_with_detail(None).await; - assert_eq!(latest_block.number.unwrap().as_u64(), 2); + let latest_block = client.eth_get_block_by_number(None).await; assert_eq!(latest_block.transactions.len(), 1); - assert_eq!(latest_block.transactions[0].hash, tx_hash); - - // This should just pass without error - self.set_value_call(contract_address, set_arg) - .await - .unwrap(); - - // This call should fail because function does not exist - let failing_call = self.failing_call(contract_address).await; - assert!(failing_call.is_err()); - - // Create a blob with multiple transactions. - let mut requests = Vec::default(); - for value in 100..103 { - let set_value_req = self.set_value(contract_address, value).await; - requests.push(set_value_req); - } + assert_eq!(latest_block.transactions[0], tx_hash); - self.send_publish_batch_request().await; - - for req in requests { - req.await.unwrap(); - } - - { - let get_arg = self.query_contract(contract_address).await?; - assert_eq!(102, get_arg.as_u32()); - } - - { - let value = 103; - - let tx_hash = { - let set_value_req = self.set_value_unsigned(contract_address, value).await; - self.send_publish_batch_request().await; - set_value_req.await.unwrap().unwrap().transaction_hash - }; - - let latest_block = self.eth_get_block_by_number(None).await; - assert_eq!(latest_block.transactions.len(), 1); - assert_eq!(latest_block.transactions[0], tx_hash); - - let get_arg = self.query_contract(contract_address).await?; - assert_eq!(value, get_arg.as_u32()); - } - - Ok(()) + let get_arg = client.query_contract(contract_address).await?; + assert_eq!(value, get_arg.as_u32()); } -} - -async fn send_tx_test_to_eth(rpc_address: SocketAddr) -> Result<(), Box> { - let chain_id: u64 = 1; - let key = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" - .parse::() - .unwrap() - .with_chain_id(chain_id); - - let contract = SimpleStorageContract::default(); - let from_addr = Address::from_str("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266").unwrap(); - - let test_client = TestClient::new(chain_id, key, from_addr, contract, rpc_address).await; - - let etc_accounts = test_client.eth_accounts().await; - assert_eq!(vec![from_addr], etc_accounts); - - let eth_chain_id = test_client.eth_chain_id().await; - assert_eq!(chain_id, eth_chain_id); - - // No block exists yet - let latest_block = test_client - .eth_get_block_by_number(Some("latest".to_owned())) - .await; - let earliest_block = test_client - .eth_get_block_by_number(Some("earliest".to_owned())) - .await; - - assert_eq!(latest_block, earliest_block); - assert_eq!(latest_block.number.unwrap().as_u64(), 0); - - test_client.execute().await -} - -#[cfg(feature = "experimental")] -#[tokio::test] -async fn evm_tx_tests() -> Result<(), anyhow::Error> { - let (port_tx, port_rx) = tokio::sync::oneshot::channel(); - - let rollup_task = tokio::spawn(async { - // Don't provide a prover since the EVM is not currently provable - start_rollup::>(port_tx, None).await; - }); - - // Wait for rollup task to start: - let port = port_rx.await.unwrap(); - send_tx_test_to_eth(port).await.unwrap(); - rollup_task.abort(); Ok(()) } diff --git a/examples/demo-rollup/tests/evm/test_client.rs b/examples/demo-rollup/tests/evm/test_client.rs new file mode 100644 index 000000000..8a7154b49 --- /dev/null +++ b/examples/demo-rollup/tests/evm/test_client.rs @@ -0,0 +1,333 @@ +use ethereum_types::H160; +use ethers_core::abi::Address; +use ethers_core::k256::ecdsa::SigningKey; +use ethers_core::types::transaction::eip2718::TypedTransaction; +use ethers_core::types::{ + Block, Eip1559TransactionRequest, Transaction, TransactionRequest, TxHash, +}; +use ethers_middleware::SignerMiddleware; +use ethers_providers::{Http, Middleware, PendingTransaction, Provider}; +use ethers_signers::Wallet; +use jsonrpsee::core::client::ClientT; +use jsonrpsee::http_client::{HttpClient, HttpClientBuilder}; +use jsonrpsee::rpc_params; +use reth_primitives::Bytes; +use sov_evm::SimpleStorageContract; + +const MAX_FEE_PER_GAS: u64 = 100000001; +const GAS: u64 = 900000u64; + +pub(crate) struct TestClient { + chain_id: u64, + pub(crate) from_addr: Address, + contract: SimpleStorageContract, + client: SignerMiddleware, Wallet>, + http_client: HttpClient, +} + +impl TestClient { + #[allow(dead_code)] + pub(crate) async fn new( + chain_id: u64, + key: Wallet, + from_addr: Address, + contract: SimpleStorageContract, + rpc_addr: std::net::SocketAddr, + ) -> Self { + let host = format!("http://localhost:{}", rpc_addr.port()); + + let provider = Provider::try_from(&host).unwrap(); + let client = SignerMiddleware::new_with_provider_chain(provider, key) + .await + .unwrap(); + + let http_client = HttpClientBuilder::default().build(host).unwrap(); + + Self { + chain_id, + from_addr, + contract, + client, + http_client, + } + } + + pub(crate) async fn send_publish_batch_request(&self) { + let _: String = self + .http_client + .request("eth_publishBatch", rpc_params![]) + .await + .unwrap(); + } + + pub(crate) async fn deploy_contract( + &self, + ) -> Result, Box> { + let req = Eip1559TransactionRequest::new() + .from(self.from_addr) + .chain_id(self.chain_id) + .nonce(0u64) + .max_priority_fee_per_gas(10u64) + .max_fee_per_gas(MAX_FEE_PER_GAS) + .gas(GAS) + .data(self.contract.byte_code()); + + let typed_transaction = TypedTransaction::Eip1559(req); + + let receipt_req = self + .client + .send_transaction(typed_transaction, None) + .await?; + + Ok(receipt_req) + } + + pub(crate) async fn deploy_contract_call(&self) -> Result> { + let req = Eip1559TransactionRequest::new() + .from(self.from_addr) + .chain_id(self.chain_id) + .nonce(0u64) + .max_priority_fee_per_gas(10u64) + .max_fee_per_gas(MAX_FEE_PER_GAS) + .gas(GAS) + .data(self.contract.byte_code()); + + let typed_transaction = TypedTransaction::Eip1559(req); + + let receipt_req = self.eth_call(typed_transaction, None).await?; + + Ok(receipt_req) + } + + pub(crate) async fn set_value_unsigned( + &self, + contract_address: H160, + set_arg: u32, + ) -> PendingTransaction<'_, Http> { + // Tx without gas_limit should estimate and include it in send_transaction endpoint + // Tx without nonce should fetch and include it in send_transaction endpoint + let req = Eip1559TransactionRequest::new() + .from(self.from_addr) + .to(contract_address) + .chain_id(self.chain_id) + .data(self.contract.set_call_data(set_arg)) + .max_priority_fee_per_gas(10u64) + .max_fee_per_gas(MAX_FEE_PER_GAS); + + let typed_transaction = TypedTransaction::Eip1559(req); + + self.eth_send_transaction(typed_transaction).await + } + + pub(crate) async fn set_value( + &self, + contract_address: H160, + set_arg: u32, + ) -> PendingTransaction<'_, Http> { + let nonce = self.eth_get_transaction_count(self.from_addr).await; + + let req = Eip1559TransactionRequest::new() + .from(self.from_addr) + .to(contract_address) + .chain_id(self.chain_id) + .nonce(nonce) + .data(self.contract.set_call_data(set_arg)) + .max_priority_fee_per_gas(10u64) + .max_fee_per_gas(MAX_FEE_PER_GAS) + .gas(GAS); + + let typed_transaction = TypedTransaction::Eip1559(req); + + self.client + .send_transaction(typed_transaction, None) + .await + .unwrap() + } + + pub(crate) async fn set_value_call( + &self, + contract_address: H160, + set_arg: u32, + ) -> Result> { + let nonce = self.eth_get_transaction_count(self.from_addr).await; + + // Any type of transaction can be used for eth_call + let req = TransactionRequest::new() + .from(self.from_addr) + .to(contract_address) + .chain_id(self.chain_id) + .nonce(nonce) + .data(self.contract.set_call_data(set_arg)) + .gas_price(10u64); + + let typed_transaction = TypedTransaction::Legacy(req.clone()); + + // Estimate gas on rpc + let gas = self + .eth_estimate_gas(typed_transaction, Some("latest".to_owned())) + .await; + + // Call with the estimated gas + let req = req.gas(gas); + let typed_transaction = TypedTransaction::Legacy(req); + + let response = self + .eth_call(typed_transaction, Some("latest".to_owned())) + .await?; + + Ok(response) + } + + pub(crate) async fn failing_call( + &self, + contract_address: H160, + ) -> Result> { + let nonce = self.eth_get_transaction_count(self.from_addr).await; + + // Any type of transaction can be used for eth_call + let req = Eip1559TransactionRequest::new() + .from(self.from_addr) + .to(contract_address) + .chain_id(self.chain_id) + .nonce(nonce) + .data(self.contract.failing_function_call_data()) + .max_priority_fee_per_gas(10u64) + .max_fee_per_gas(MAX_FEE_PER_GAS) + .gas(GAS); + + let typed_transaction = TypedTransaction::Eip1559(req); + + self.eth_call(typed_transaction, Some("latest".to_owned())) + .await + } + + pub(crate) async fn query_contract( + &self, + contract_address: H160, + ) -> Result> { + let nonce = self.eth_get_transaction_count(self.from_addr).await; + + let req = Eip1559TransactionRequest::new() + .from(self.from_addr) + .to(contract_address) + .chain_id(self.chain_id) + .nonce(nonce) + .data(self.contract.get_call_data()) + .gas(GAS); + + let typed_transaction = TypedTransaction::Eip1559(req); + + let response = self.client.call(&typed_transaction, None).await?; + + let resp_array: [u8; 32] = response.to_vec().try_into().unwrap(); + Ok(ethereum_types::U256::from(resp_array)) + } + + pub(crate) async fn eth_accounts(&self) -> Vec
{ + self.http_client + .request("eth_accounts", rpc_params![]) + .await + .unwrap() + } + + pub(crate) async fn eth_send_transaction( + &self, + tx: TypedTransaction, + ) -> PendingTransaction<'_, Http> { + self.client + .provider() + .send_transaction(tx, None) + .await + .unwrap() + } + + pub(crate) async fn eth_chain_id(&self) -> u64 { + let chain_id: ethereum_types::U64 = self + .http_client + .request("eth_chainId", rpc_params![]) + .await + .unwrap(); + + chain_id.as_u64() + } + + pub(crate) async fn eth_get_balance(&self, address: Address) -> ethereum_types::U256 { + self.http_client + .request("eth_getBalance", rpc_params![address, "latest"]) + .await + .unwrap() + } + + pub(crate) async fn eth_get_storage_at( + &self, + address: Address, + index: ethereum_types::U256, + ) -> ethereum_types::U256 { + self.http_client + .request("eth_getStorageAt", rpc_params![address, index, "latest"]) + .await + .unwrap() + } + + pub(crate) async fn eth_get_code(&self, address: Address) -> Bytes { + self.http_client + .request("eth_getCode", rpc_params![address, "latest"]) + .await + .unwrap() + } + + pub(crate) async fn eth_get_transaction_count(&self, address: Address) -> u64 { + let count: ethereum_types::U64 = self + .http_client + .request("eth_getTransactionCount", rpc_params![address, "latest"]) + .await + .unwrap(); + + count.as_u64() + } + + pub(crate) async fn eth_get_block_by_number( + &self, + block_number: Option, + ) -> Block { + self.http_client + .request("eth_getBlockByNumber", rpc_params![block_number, false]) + .await + .unwrap() + } + + pub(crate) async fn eth_get_block_by_number_with_detail( + &self, + block_number: Option, + ) -> Block { + self.http_client + .request("eth_getBlockByNumber", rpc_params![block_number, true]) + .await + .unwrap() + } + + pub(crate) async fn eth_call( + &self, + tx: TypedTransaction, + block_number: Option, + ) -> Result> { + self.http_client + .request("eth_call", rpc_params![tx, block_number]) + .await + .map_err(|e| e.into()) + } + + pub(crate) async fn eth_estimate_gas( + &self, + tx: TypedTransaction, + block_number: Option, + ) -> u64 { + let gas: ethereum_types::U64 = self + .http_client + .request("eth_estimateGas", rpc_params![tx, block_number]) + .await + .unwrap(); + + gas.as_u64() + } +} diff --git a/examples/demo-rollup/tests/test_helpers.rs b/examples/demo-rollup/tests/test_helpers.rs index 531267a88..4b769fc01 100644 --- a/examples/demo-rollup/tests/test_helpers.rs +++ b/examples/demo-rollup/tests/test_helpers.rs @@ -1,14 +1,17 @@ use std::net::SocketAddr; +use std::path::Path; +use demo_stf::genesis_config::GenesisPaths; use sov_demo_rollup::{new_rollup_with_mock_da_from_config, DemoProverConfig}; use sov_rollup_interface::mocks::MockDaConfig; use sov_rollup_interface::zk::ZkvmHost; use sov_stf_runner::{RollupConfig, RpcConfig, RunnerConfig, StorageConfig}; use tokio::sync::oneshot; -pub async fn start_rollup( +pub async fn start_rollup>( rpc_reporting_channel: oneshot::Sender, prover: Option<(Vm, DemoProverConfig)>, + genesis_paths: &GenesisPaths

, ) { let temp_dir = tempfile::tempdir().unwrap(); let temp_path = temp_dir.path(); @@ -27,8 +30,8 @@ pub async fn start_rollup( da: MockDaConfig {}, }; - let rollup = - new_rollup_with_mock_da_from_config(rollup_config, prover).expect("Rollup config is valid"); + let rollup = new_rollup_with_mock_da_from_config(rollup_config, prover, genesis_paths) + .expect("Rollup config is valid"); rollup .run_and_report_rpc_port(Some(rpc_reporting_channel)) .await diff --git a/examples/demo-simple-stf/src/lib.rs b/examples/demo-simple-stf/src/lib.rs index 0f3ba691a..b87bfc9e8 100644 --- a/examples/demo-simple-stf/src/lib.rs +++ b/examples/demo-simple-stf/src/lib.rs @@ -7,8 +7,7 @@ use sov_rollup_interface::da::{BlobReaderTrait, DaSpec}; use sov_rollup_interface::stf::{BatchReceipt, SlotResult, StateTransitionFunction}; use sov_rollup_interface::zk::{ValidityCondition, Zkvm}; -/// An implementation of the -/// [`StateTransitionFunction`](sov_rollup_interface::stf::StateTransitionFunction) +/// An implementation of the [`StateTransitionFunction`] /// that is specifically designed to check if someone knows a preimage of a specific hash. #[derive(PartialEq, Debug, Clone, Eq, serde::Serialize, serde::Deserialize, Default)] pub struct CheckHashPreimageStf { diff --git a/examples/demo-stf/Cargo.toml b/examples/demo-stf/Cargo.toml index 28a93152e..bbaec1fe7 100644 --- a/examples/demo-stf/Cargo.toml +++ b/examples/demo-stf/Cargo.toml @@ -30,6 +30,7 @@ sov-sequencer-registry = { path = "../../module-system/module-implementations/so sov-blob-storage = { path = "../../module-system/module-implementations/sov-blob-storage" } sov-bank = { path = "../../module-system/module-implementations/sov-bank" } sov-nft-module = { path = "../../module-system/module-implementations/sov-nft-module" } +simple-nft-module = { path = "../simple-nft-module" } sov-chain-state = { path = "../../module-system/module-implementations/sov-chain-state" } sov-modules-stf-template = { path = "../../module-system/sov-modules-stf-template" } @@ -57,6 +58,7 @@ native = [ "sov-stf-runner/native", "sov-bank/native", "sov-nft-module/native", + "simple-nft-module/native", "sov-cli", "sov-accounts/native", "sov-sequencer-registry/native", diff --git a/examples/demo-stf/README.md b/examples/demo-stf/README.md index c0bbc94b7..59c3c7dcc 100644 --- a/examples/demo-stf/README.md +++ b/examples/demo-stf/README.md @@ -60,15 +60,27 @@ The final piece of the puzzle is your app's runtime. A runtime is just a list of module to your app, just add an additional field to the runtime. ```rust +use sov_modules_api::{Genesis, DispatchCall, MessageCodec, Context}; +use sov_modules_api::macros::expose_rpc; +use sov_sequencer::Sequencer; +use sov_rollup_interface::da::DaSpec; +#[cfg(feature = "native")] +use sov_accounts::{AccountsRpcImpl, AccountsRpcServer}; +#[cfg(feature = "native")] +use sov_bank::{BankRpcImpl, BankRpcServer}; +#[cfg(feature = "native")] +use sov_sequencer_registry::{SequencerRegistryRpcImpl, SequencerRegistryRpcServer}; + + #[cfg_attr( feature = "native", expose_rpc(DefaultContext) )] #[derive(Genesis, DispatchCall, MessageCodec)] #[serialization(borsh::BorshDeserialize, borsh::BorshSerialize)] -pub struct MyRuntime { +pub struct MyRuntime { #[allow(unused)] - sequencer: sov_sequencer_registry::Sequencer, + sequencer: sov_sequencer_registry::SequencerRegistry, #[allow(unused)] bank: sov_bank::Bank, diff --git a/examples/demo-stf/src/app.rs b/examples/demo-stf/src/app.rs deleted file mode 100644 index 27970c9ae..000000000 --- a/examples/demo-stf/src/app.rs +++ /dev/null @@ -1,56 +0,0 @@ -#[cfg(feature = "native")] -pub use sov_modules_api::default_context::DefaultContext; -pub use sov_modules_api::default_context::ZkDefaultContext; -#[cfg(feature = "native")] -pub use sov_modules_api::default_signature::private_key::DefaultPrivateKey; -#[cfg(feature = "native")] -use sov_modules_api::Spec; -use sov_modules_stf_template::AppTemplate; -pub use sov_modules_stf_template::Batch; -use sov_rollup_interface::da::DaSpec; -use sov_rollup_interface::zk::Zkvm; -use sov_state::ZkStorage; -#[cfg(feature = "native")] -use sov_state::{ProverStorage, Storage}; -#[cfg(feature = "native")] -use sov_stf_runner::FiFoStrictBatchBuilder; -#[cfg(feature = "native")] -use sov_stf_runner::StorageConfig; - -use crate::runtime::Runtime; - -#[cfg(feature = "native")] -pub struct App { - pub stf: AppTemplate>, - pub batch_builder: Option, DefaultContext>>, -} - -#[cfg(feature = "native")] -impl App { - pub fn new(storage_config: StorageConfig) -> Self { - let storage = - ProverStorage::with_config(storage_config).expect("Failed to open prover storage"); - let app = AppTemplate::new(storage.clone(), Runtime::default()); - let batch_size_bytes = 1024 * 100; // 100 KB - let batch_builder = FiFoStrictBatchBuilder::new( - batch_size_bytes, - u32::MAX as usize, - Runtime::default(), - storage, - ); - Self { - stf: app, - batch_builder: Some(batch_builder), - } - } - - pub fn get_storage(&self) -> ::Storage { - self.stf.current_storage.clone() - } -} - -pub fn create_zk_app_template( -) -> AppTemplate> { - let storage = ZkStorage::new(); - AppTemplate::new(storage, Runtime::default()) -} diff --git a/examples/demo-stf/src/cli.rs b/examples/demo-stf/src/cli.rs index 86523900f..2d003d8da 100644 --- a/examples/demo-stf/src/cli.rs +++ b/examples/demo-stf/src/cli.rs @@ -1,3 +1,4 @@ +//! Generates wallet cli for the runtime. use sov_cli::wallet_state::WalletState; use sov_cli::workflows::keys::KeyWorkflow; use sov_cli::workflows::rpc::RpcWorkflows; @@ -14,7 +15,7 @@ type Ctx = DefaultContext; #[derive(clap::Subcommand)] #[command(author, version, about, long_about = None)] -pub enum Workflows { +enum Workflows { #[clap(subcommand)] Transactions( TransactionWorkflow< @@ -30,12 +31,13 @@ pub enum Workflows { #[derive(clap::Parser)] #[command(author, version, about, long_about = None)] -pub struct App { +struct CliApp { #[clap(subcommand)] workflow: Workflows, } -pub async fn run( +/// Runs wallet cli. +pub async fn run_wallet( ) -> Result<(), anyhow::Error> { let app_dir = wallet_dir()?; std::fs::create_dir_all(app_dir.as_ref())?; @@ -44,7 +46,7 @@ pub async fn run( let mut wallet_state: WalletState, Ctx> = WalletState::load(&wallet_state_path)?; - let invocation = App::::parse(); + let invocation = CliApp::::parse(); match invocation.workflow { Workflows::Transactions(tx) => tx diff --git a/examples/demo-stf/src/genesis_config.rs b/examples/demo-stf/src/genesis_config.rs index 01551e9b6..8386ba469 100644 --- a/examples/demo-stf/src/genesis_config.rs +++ b/examples/demo-stf/src/genesis_config.rs @@ -1,26 +1,66 @@ +//! While the `GenesisConfig` type for `Rollup` is generated from the underlying runtime through a macro, +//! specific module configurations are obtained from files. This code is responsible for the logic +//! that transforms module genesis data into Rollup genesis data. + use std::convert::AsRef; -use std::path::Path; +use std::path::{Path, PathBuf}; -use anyhow::Context as AnyhowContext; +use anyhow::{bail, Context as AnyhowContext}; use serde::de::DeserializeOwned; use sov_accounts::AccountConfig; use sov_bank::BankConfig; use sov_chain_state::ChainStateConfig; -use sov_cli::wallet_state::PrivateKeyAndAddress; #[cfg(feature = "experimental")] use sov_evm::EvmConfig; pub use sov_modules_api::default_context::DefaultContext; use sov_modules_api::Context; use sov_nft_module::NonFungibleTokenConfig; use sov_rollup_interface::da::DaSpec; +use sov_sequencer_registry::SequencerConfig; pub use sov_state::config::Config as StorageConfig; use sov_value_setter::ValueSetterConfig; /// Creates config for a rollup with some default settings, the config is used in demos and tests. use crate::runtime::GenesisConfig; -pub const LOCKED_AMOUNT: u64 = 50; -pub const DEMO_TOKEN_NAME: &str = "sov-demo-token"; +/// Paths pointing to genesis files. +pub struct GenesisPaths> { + /// Bank genesis path. + pub bank_genesis_path: P, + /// Sequencer Registry genesis path. + pub sequencer_genesis_path: P, + /// Value Setter genesis path. + pub value_setter_genesis_path: P, + /// Accounts genesis path. + pub accounts_genesis_path: P, + /// Chain State genesis path. + pub chain_state_genesis_path: P, + /// NFT genesis path. + pub nft_path: P, + #[cfg(feature = "experimental")] + /// EVM genesis path. + pub evm_genesis_path: P, +} + +impl GenesisPaths { + /// Creates a new [`GenesisPaths`] from the files contained in the given + /// directory. + /// + /// Take a look at the contents of the `test_data` directory to see the + /// expected files. + pub fn from_dir(dir: impl AsRef) -> Self { + Self { + bank_genesis_path: dir.as_ref().join("bank.json"), + sequencer_genesis_path: dir.as_ref().join("sequencer_registry.json"), + value_setter_genesis_path: dir.as_ref().join("value_setter.json"), + accounts_genesis_path: dir.as_ref().join("accounts.json"), + chain_state_genesis_path: dir.as_ref().join("chain_state.json"), + nft_path: dir.as_ref().join("nft.json"), + #[cfg(feature = "experimental")] + evm_genesis_path: dir.as_ref().join("evm.json"), + } + } +} /// Configure our rollup with a centralized sequencer using the SEQUENCER_DA_ADDRESS /// address constant. Since the centralize sequencer's address is consensus critical, @@ -29,66 +69,64 @@ pub const DEMO_TOKEN_NAME: &str = "sov-demo-token"; /// If you want to customize the rollup to accept transactions from your own celestia /// address, simply change the value of the SEQUENCER_DA_ADDRESS to your own address. /// For example: -/// ```rust,no_run +/// ``` /// const SEQUENCER_DA_ADDRESS: &str = "celestia1qp09ysygcx6npted5yc0au6k9lner05yvs9208"; /// ``` -pub fn get_genesis_config( +pub fn get_genesis_config>( sequencer_da_address: Da::Address, + genesis_paths: &GenesisPaths

, #[cfg(feature = "experimental")] eth_signers: Vec, ) -> GenesisConfig { - let token_deployer: PrivateKeyAndAddress = read_private_key(); - create_genesis_config( - token_deployer.address.clone(), sequencer_da_address, + genesis_paths, #[cfg(feature = "experimental")] eth_signers, ) .expect("Unable to read genesis configuration") } -fn create_genesis_config( - sequencer_address: C::Address, - sequencer_da_address: Da::Address, +fn create_genesis_config>( + seq_da_address: Da::Address, + genesis_paths: &GenesisPaths

, #[cfg(feature = "experimental")] eth_signers: Vec, ) -> anyhow::Result> { - // This path will be injected as a parameter: #872 - let bank_genesis_path = "../test-data/genesis/bank.json"; - let bank_config: BankConfig = read_json_file(bank_genesis_path)?; - // This will be read from a file: #872 - let token_address = sov_bank::get_genesis_token_address::( - &bank_config.tokens[0].token_name, - bank_config.tokens[0].salt, - ); - - // This will be read from a file: #872 - let sequencer_registry_config = sov_sequencer_registry::SequencerConfig { - seq_rollup_address: sequencer_address, - seq_da_address: sequencer_da_address, - coins_to_lock: sov_bank::Coins { - amount: LOCKED_AMOUNT, - token_address, - }, - is_preferred_sequencer: true, - }; - - // This path will be injected as a parameter: #872 - let value_setter_genesis_path = "../test-data/genesis/value_setter.json"; - let value_setter_config: ValueSetterConfig = read_json_file(value_setter_genesis_path)?; - - let accounts_genesis_path = "../test-data/genesis/accounts.json"; - let accounts_config: AccountConfig = read_json_file(accounts_genesis_path)?; - - let nft_config: NonFungibleTokenConfig = NonFungibleTokenConfig {}; - - let chain_state_path = "../test-data/genesis/chain_state.json"; - let chain_state_config: ChainStateConfig = read_json_file(chain_state_path)?; + let bank_config: BankConfig = read_json_file(&genesis_paths.bank_genesis_path)?; + + let mut sequencer_registry_config: SequencerConfig = + read_json_file(&genesis_paths.sequencer_genesis_path)?; + + // The `seq_da_address` is overridden with the value from rollup binary. + sequencer_registry_config.seq_da_address = seq_da_address; + + // Sanity check: `token_address` in `sequencer_registry_config` match `token_address` from the bank module. + { + let token_address = &sov_bank::get_genesis_token_address::( + &bank_config.tokens[0].token_name, + bank_config.tokens[0].salt, + ); + + let coins_token_addr = &sequencer_registry_config.coins_to_lock.token_address; + if coins_token_addr != token_address { + bail!( + "Wrong token address in `sequencer_registry_config` expected {} but found {}", + token_address, + coins_token_addr + ) + } + } - #[cfg(feature = "experimental")] - let evm_path = "../test-data/genesis/evm.json"; + let value_setter_config: ValueSetterConfig = + read_json_file(&genesis_paths.value_setter_genesis_path)?; + + let accounts_config: AccountConfig = read_json_file(&genesis_paths.accounts_genesis_path)?; + let nft_config: NonFungibleTokenConfig = read_json_file(&genesis_paths.nft_path)?; + + let chain_state_config: ChainStateConfig = + read_json_file(&genesis_paths.chain_state_genesis_path)?; #[cfg(feature = "experimental")] - let evm_config = get_evm_config(evm_path, eth_signers)?; + let evm_config = get_evm_config(&genesis_paths.evm_genesis_path, eth_signers)?; Ok(GenesisConfig::new( bank_config, @@ -97,9 +135,9 @@ fn create_genesis_config( chain_state_config, value_setter_config, accounts_config, + nft_config, #[cfg(feature = "experimental")] evm_config, - nft_config, )) } @@ -130,25 +168,3 @@ fn get_evm_config>( Ok(config) } - -pub fn read_private_key() -> PrivateKeyAndAddress { - // TODO fix the hardcoded path: #872 - let token_deployer_data = - std::fs::read_to_string("../test-data/keys/token_deployer_private_key.json") - .expect("Unable to read file to string"); - - let token_deployer: PrivateKeyAndAddress = serde_json::from_str(&token_deployer_data) - .unwrap_or_else(|_| { - panic!( - "Unable to convert data {} to PrivateKeyAndAddress", - &token_deployer_data - ) - }); - - assert!( - token_deployer.is_matching_to_default(), - "Inconsistent key data" - ); - - token_deployer -} diff --git a/examples/demo-stf/src/hooks_impl.rs b/examples/demo-stf/src/hooks_impl.rs index 38e786a69..e41290789 100644 --- a/examples/demo-stf/src/hooks_impl.rs +++ b/examples/demo-stf/src/hooks_impl.rs @@ -89,7 +89,7 @@ impl SlotHooks for Runtime { ) { #[cfg(feature = "experimental")] self.evm - .begin_slot_hook(slot_header.hash().into(), working_set); + .begin_slot_hook(slot_header.hash().into(), pre_state_root, working_set); self.chain_state.begin_slot_hook( slot_header, diff --git a/examples/demo-stf/src/lib.rs b/examples/demo-stf/src/lib.rs index c5a640213..bf30e33ed 100644 --- a/examples/demo-stf/src/lib.rs +++ b/examples/demo-stf/src/lib.rs @@ -1,20 +1,30 @@ -pub mod app; +#![deny(missing_docs)] +#![doc = include_str!("../README.md")] +#[cfg(feature = "native")] +pub mod cli; #[cfg(feature = "native")] pub mod genesis_config; -pub mod hooks_impl; +mod hooks_impl; pub mod runtime; #[cfg(test)] -pub mod tests; - -#[cfg(feature = "native")] -pub mod cli; - +mod tests; use runtime::Runtime; +#[cfg(feature = "native")] +use sov_modules_api::default_context::DefaultContext; use sov_modules_api::default_context::ZkDefaultContext; +#[cfg(feature = "native")] +use sov_modules_api::Spec; use sov_modules_stf_template::AppTemplate; -use sov_rollup_interface::da::DaVerifier; -pub use sov_state::ArrayWitness; +use sov_rollup_interface::da::{DaSpec, DaVerifier}; +use sov_rollup_interface::zk::Zkvm; +#[cfg(feature = "native")] +use sov_sequencer::batch_builder::FiFoStrictBatchBuilder; +#[cfg(feature = "native")] +use sov_state::config::Config as StorageConfig; +use sov_state::ZkStorage; +#[cfg(feature = "native")] +use sov_state::{ProverStorage, Storage}; use sov_stf_runner::verifier::StateTransitionVerifier; /// A verifier for the demo rollup @@ -28,3 +38,45 @@ pub type AppVerifier = StateTransitionVerifier< DA, Zk, >; + +/// Contains StateTransitionFunction and other necessary dependencies needed for implementing a full node. +#[cfg(feature = "native")] +pub struct App { + /// Concrete state transition function. + pub stf: AppTemplate>, + /// Batch builder. + pub batch_builder: Option, DefaultContext>>, +} + +#[cfg(feature = "native")] +impl App { + /// Creates a new `App`. + pub fn new(storage_config: StorageConfig) -> Self { + let storage = + ProverStorage::with_config(storage_config).expect("Failed to open prover storage"); + let app = AppTemplate::new(storage.clone(), Runtime::default()); + let batch_size_bytes = 1024 * 100; // 100 KB + let batch_builder = FiFoStrictBatchBuilder::new( + batch_size_bytes, + u32::MAX as usize, + Runtime::default(), + storage, + ); + Self { + stf: app, + batch_builder: Some(batch_builder), + } + } + + /// Gets underlying storage. + pub fn get_storage(&self) -> ::Storage { + self.stf.current_storage.clone() + } +} + +/// Create `StateTransitionFunction` for Zk context. +pub fn create_zk_app_template( +) -> AppTemplate> { + let storage = ZkStorage::new(); + AppTemplate::new(storage, Runtime::default()) +} diff --git a/examples/demo-stf/src/runtime.rs b/examples/demo-stf/src/runtime.rs index 4c293a9cc..1d9c42a0d 100644 --- a/examples/demo-stf/src/runtime.rs +++ b/examples/demo-stf/src/runtime.rs @@ -1,3 +1,36 @@ +//! The Rollup entrypoint. +//! +//! On a high level, the rollup node receives serialized call messages from the DA layer and executes them as atomic transactions. +//! Upon reception, the message has to be deserialized and forwarded to an appropriate module. +//! +//! The module-specific logic is implemented by module creators, but all the glue code responsible for message +//! deserialization/forwarding is handled by a rollup `runtime`. +//! +//! In order to define the runtime we need to specify all the modules supported by our rollup (see the `Runtime` struct bellow) +//! +//! The `Runtime` together with associated interfaces (`Genesis`, `DispatchCall`, `MessageCodec`) +//! and derive macros defines: +//! - how the rollup modules are wired up together. +//! - how the state of the rollup is initialized. +//! - how messages are dispatched to appropriate modules. +//! +//! Runtime lifecycle: +//! +//! 1. Initialization: +//! When a rollup is deployed for the first time, it needs to set its genesis state. +//! The `#[derive(Genesis)` macro will generate `Runtime::genesis(config)` method which returns +//! `Storage` with the initialized state. +//! +//! 2. Calls: +//! The `Module` interface defines a `call` method which accepts a module-defined type and triggers the specific `module logic.` +//! In general, the point of a call is to change the module state, but if the call throws an error, +//! no module specific state is updated (the transaction is reverted). +//! +//! `#[derive(MessageCodec)` adds deserialization capabilities to the `Runtime` (implements `decode_call` method). +//! `Runtime::decode_call` accepts serialized call message and returns a type that implements the `DispatchCall` trait. +//! The `DispatchCall` implementation (derived by a macro) forwards the message to the appropriate module and executes its `call` method. + +#![allow(unused_doc_comments)] #[cfg(feature = "native")] use sov_accounts::{AccountsRpcImpl, AccountsRpcServer}; #[cfg(feature = "native")] @@ -24,42 +57,7 @@ use sov_sequencer_registry::{SequencerRegistryRpcImpl, SequencerRegistryRpcServe #[cfg(feature = "native")] use sov_value_setter::{ValueSetterRpcImpl, ValueSetterRpcServer}; -/// The Rollup entrypoint. -/// -/// On a high level, the rollup node receives serialized call messages from the DA layer and executes them as atomic transactions. -/// Upon reception, the message has to be deserialized and forwarded to an appropriate module. -/// -/// The module-specific logic is implemented by module creators, but all the glue code responsible for message -/// deserialization/forwarding is handled by a rollup `runtime`. -/// -/// In order to define the runtime we need to specify all the modules supported by our rollup (see the `Runtime` struct bellow) -/// -/// The `Runtime` together with associated interfaces (`Genesis`, `DispatchCall`, `MessageCodec`) -/// and derive macros defines: -/// - how the rollup modules are wired up together. -/// - how the state of the rollup is initialized. -/// - how messages are dispatched to appropriate modules. -/// -/// Runtime lifecycle: -/// -/// 1. Initialization: -/// When a rollup is deployed for the first time, it needs to set its genesis state. -/// The `#[derive(Genesis)` macro will generate `Runtime::genesis(config)` method which returns -/// `Storage` with the initialized state. -/// -/// 2. Calls: -/// The `Module` interface defines a `call` method which accepts a module-defined type and triggers the specific `module logic.` -/// In general, the point of a call is to change the module state, but if the call throws an error, -/// no state is updated (the transaction is reverted). -/// -/// `#[derive(MessageCodec)` adds deserialization capabilities to the `Runtime` (implements `decode_call` method). -/// `Runtime::decode_call` accepts serialized call message and returns a type that implements the `DispatchCall` trait. -/// The `DispatchCall` implementation (derived by a macro) forwards the message to the appropriate module and executes its `call` method. -/// -/// Similar mechanism works for queries with the difference that queries are submitted by users directly to the rollup node -/// instead of going through the DA layer. - -#[cfg(not(feature = "experimental"))] +/// The `demo-stf runtime`. #[cfg_attr(feature = "native", derive(CliWallet), expose_rpc)] #[derive(Genesis, DispatchCall, MessageCodec, DefaultRuntime)] #[serialization(borsh::BorshDeserialize, borsh::BorshSerialize)] @@ -68,37 +66,26 @@ use sov_value_setter::{ValueSetterRpcImpl, ValueSetterRpcServer}; serialization(serde::Serialize, serde::Deserialize) )] pub struct Runtime { + /// The Bank module. pub bank: sov_bank::Bank, + /// The Sequencer Registry module. pub sequencer_registry: sov_sequencer_registry::SequencerRegistry, #[cfg_attr(feature = "native", cli_skip)] + /// The Blob Storage module. pub blob_storage: sov_blob_storage::BlobStorage, #[cfg_attr(feature = "native", cli_skip)] + /// The Chain State module. pub chain_state: sov_chain_state::ChainState, + /// The Value Setter module. pub value_setter: sov_value_setter::ValueSetter, + /// The Accounts module. pub accounts: sov_accounts::Accounts, + /// The NFT module. pub nft: sov_nft_module::NonFungibleToken, -} - -#[cfg(feature = "experimental")] -#[cfg_attr(feature = "native", derive(CliWallet), expose_rpc)] -#[derive(Genesis, DispatchCall, MessageCodec, DefaultRuntime)] -#[serialization(borsh::BorshDeserialize, borsh::BorshSerialize)] -#[cfg_attr( - feature = "native", - serialization(serde::Serialize, serde::Deserialize) -)] -pub struct Runtime { - pub bank: sov_bank::Bank, - pub sequencer_registry: sov_sequencer_registry::SequencerRegistry, - #[cfg_attr(feature = "native", cli_skip)] - pub blob_storage: sov_blob_storage::BlobStorage, - #[cfg_attr(feature = "native", cli_skip)] - pub chain_state: sov_chain_state::ChainState, - pub value_setter: sov_value_setter::ValueSetter, - pub accounts: sov_accounts::Accounts, + #[cfg(feature = "experimental")] #[cfg_attr(feature = "native", cli_skip)] + /// The EVM module. pub evm: sov_evm::Evm, - pub nft: sov_nft_module::NonFungibleToken, } impl sov_modules_stf_template::Runtime for Runtime diff --git a/examples/demo-stf/src/tests/mod.rs b/examples/demo-stf/src/tests/mod.rs index cb4180984..1394cf86a 100644 --- a/examples/demo-stf/src/tests/mod.rs +++ b/examples/demo-stf/src/tests/mod.rs @@ -3,10 +3,10 @@ use std::path::Path; use sov_modules_api::default_context::DefaultContext; use sov_modules_api::DaSpec; use sov_modules_stf_template::AppTemplate; -use sov_rollup_interface::mocks::MockDaSpec; +use sov_rollup_interface::mocks::{MockDaSpec, MOCK_SEQUENCER_DA_ADDRESS}; use sov_state::ProverStorage; -use crate::genesis_config::get_genesis_config; +use crate::genesis_config::{get_genesis_config, GenesisPaths}; use crate::runtime::{GenesisConfig, Runtime}; mod da_simulation; @@ -15,8 +15,6 @@ mod tx_revert_tests; pub(crate) type C = DefaultContext; pub(crate) type Da = MockDaSpec; -pub(crate) const TEST_SEQUENCER_DA_ADDRESS: [u8; 32] = [1; 32]; - pub(crate) fn create_new_app_template_for_tests( path: impl AsRef, ) -> AppTemplate< @@ -31,8 +29,9 @@ pub(crate) fn create_new_app_template_for_tests( } pub(crate) fn get_genesis_config_for_tests() -> GenesisConfig { - get_genesis_config::( - Da::Address::try_from(&TEST_SEQUENCER_DA_ADDRESS).unwrap(), + get_genesis_config::( + Da::Address::try_from(&MOCK_SEQUENCER_DA_ADDRESS).unwrap(), + &GenesisPaths::from_dir("../test-data/genesis/integration-tests"), #[cfg(feature = "experimental")] Vec::default(), ) diff --git a/examples/demo-stf/src/tests/stf_tests.rs b/examples/demo-stf/src/tests/stf_tests.rs index 0cead9ef4..17dc7d210 100644 --- a/examples/demo-stf/src/tests/stf_tests.rs +++ b/examples/demo-stf/src/tests/stf_tests.rs @@ -1,23 +1,20 @@ #[cfg(test)] pub mod test { + use sov_cli::wallet_state::PrivateKeyAndAddress; use sov_data_generators::bank_data::get_default_token_address; use sov_data_generators::{has_tx_events, new_test_blob_from_batch}; use sov_modules_api::default_context::DefaultContext; use sov_modules_api::default_signature::private_key::DefaultPrivateKey; - use sov_modules_api::{PrivateKey, WorkingSet}; + use sov_modules_api::{Context, PrivateKey, WorkingSet}; use sov_modules_stf_template::{Batch, SequencerOutcome}; - use sov_rollup_interface::mocks::{MockBlock, MockDaSpec}; + use sov_rollup_interface::mocks::{MockBlock, MockDaSpec, MOCK_SEQUENCER_DA_ADDRESS}; use sov_rollup_interface::stf::StateTransitionFunction; use sov_state::ProverStorage; - use crate::genesis_config::read_private_key; use crate::runtime::Runtime; use crate::tests::da_simulation::simulate_da; - use crate::tests::{ - create_new_app_template_for_tests, get_genesis_config_for_tests, C, - TEST_SEQUENCER_DA_ADDRESS, - }; + use crate::tests::{create_new_app_template_for_tests, get_genesis_config_for_tests, C}; #[test] fn test_demo_values_in_db() { @@ -32,7 +29,7 @@ pub mod test { let priv_key = read_private_key::().private_key; let txs = simulate_da(priv_key); - let blob = new_test_blob_from_batch(Batch { txs }, &TEST_SEQUENCER_DA_ADDRESS, [0; 32]); + let blob = new_test_blob_from_batch(Batch { txs }, &MOCK_SEQUENCER_DA_ADDRESS, [0; 32]); let mut blobs = [blob]; @@ -90,7 +87,7 @@ pub mod test { let private_key = read_private_key::().private_key; let txs = simulate_da(private_key); - let blob = new_test_blob_from_batch(Batch { txs }, &TEST_SEQUENCER_DA_ADDRESS, [0; 32]); + let blob = new_test_blob_from_batch(Batch { txs }, &MOCK_SEQUENCER_DA_ADDRESS, [0; 32]); let mut blobs = [blob]; let data = MockBlock::default(); @@ -141,7 +138,7 @@ pub mod test { let genesis_root = demo.init_chain(config); let txs = simulate_da(value_setter_admin_private_key); - let blob = new_test_blob_from_batch(Batch { txs }, &TEST_SEQUENCER_DA_ADDRESS, [0; 32]); + let blob = new_test_blob_from_batch(Batch { txs }, &MOCK_SEQUENCER_DA_ADDRESS, [0; 32]); let mut blobs = [blob]; let data = MockBlock::default(); @@ -220,4 +217,25 @@ pub mod test { // Assert that there are no events assert!(!has_tx_events(&apply_blob_outcome)); } + + fn read_private_key() -> PrivateKeyAndAddress { + let token_deployer_data = + std::fs::read_to_string("../test-data/keys/token_deployer_private_key.json") + .expect("Unable to read file to string"); + + let token_deployer: PrivateKeyAndAddress = serde_json::from_str(&token_deployer_data) + .unwrap_or_else(|_| { + panic!( + "Unable to convert data {} to PrivateKeyAndAddress", + &token_deployer_data + ) + }); + + assert!( + token_deployer.is_matching_to_default(), + "Inconsistent key data" + ); + + token_deployer + } } diff --git a/examples/demo-stf/src/tests/tx_revert_tests.rs b/examples/demo-stf/src/tests/tx_revert_tests.rs index d0934abe1..119116015 100644 --- a/examples/demo-stf/src/tests/tx_revert_tests.rs +++ b/examples/demo-stf/src/tests/tx_revert_tests.rs @@ -5,7 +5,7 @@ use sov_modules_api::default_context::DefaultContext; use sov_modules_api::{PrivateKey, WorkingSet}; use sov_modules_stf_template::{Batch, SequencerOutcome, SlashingReason, TxEffect}; use sov_rollup_interface::da::BlobReaderTrait; -use sov_rollup_interface::mocks::{MockAddress, MockBlock, MockDaSpec}; +use sov_rollup_interface::mocks::{MockAddress, MockBlock, MockDaSpec, MOCK_SEQUENCER_DA_ADDRESS}; use sov_rollup_interface::stf::StateTransitionFunction; use sov_state::ProverStorage; @@ -15,7 +15,6 @@ use crate::tests::da_simulation::{ simulate_da_with_bad_nonce, simulate_da_with_bad_serialization, simulate_da_with_bad_sig, simulate_da_with_revert_msg, }; -use crate::tests::TEST_SEQUENCER_DA_ADDRESS; // Assume there was proper address and we converted it to bytes already. const SEQUENCER_DA_ADDRESS: [u8; 32] = [1; 32]; @@ -35,7 +34,7 @@ fn test_tx_revert() { let genesis_root = demo.init_chain(config); let txs = simulate_da_with_revert_msg(); - let blob = new_test_blob_from_batch(Batch { txs }, &TEST_SEQUENCER_DA_ADDRESS, [0; 32]); + let blob = new_test_blob_from_batch(Batch { txs }, &MOCK_SEQUENCER_DA_ADDRESS, [0; 32]); let mut blobs = [blob]; let data = MockBlock::default(); @@ -85,7 +84,7 @@ fn test_tx_revert() { let resp = runtime .sequencer_registry .sequencer_address( - MockAddress::from(TEST_SEQUENCER_DA_ADDRESS), + MockAddress::from(MOCK_SEQUENCER_DA_ADDRESS), &mut working_set, ) .unwrap(); @@ -107,7 +106,7 @@ fn test_nonce_incremented_on_revert() { let genesis_root = demo.init_chain(config); let txs = simulate_da_with_revert_msg(); - let blob = new_test_blob_from_batch(Batch { txs }, &TEST_SEQUENCER_DA_ADDRESS, [0; 32]); + let blob = new_test_blob_from_batch(Batch { txs }, &MOCK_SEQUENCER_DA_ADDRESS, [0; 32]); let mut blobs = [blob]; let data = MockBlock::default(); @@ -175,7 +174,7 @@ fn test_tx_bad_sig() { let txs = simulate_da_with_bad_sig(); - let blob = new_test_blob_from_batch(Batch { txs }, &TEST_SEQUENCER_DA_ADDRESS, [0; 32]); + let blob = new_test_blob_from_batch(Batch { txs }, &MOCK_SEQUENCER_DA_ADDRESS, [0; 32]); let blob_sender = blob.sender(); let mut blobs = [blob]; @@ -220,7 +219,7 @@ fn test_tx_bad_nonce() { let txs = simulate_da_with_bad_nonce(); - let blob = new_test_blob_from_batch(Batch { txs }, &TEST_SEQUENCER_DA_ADDRESS, [0; 32]); + let blob = new_test_blob_from_batch(Batch { txs }, &MOCK_SEQUENCER_DA_ADDRESS, [0; 32]); let mut blobs = [blob]; let data = MockBlock::default(); @@ -286,7 +285,7 @@ fn test_tx_bad_serialization() { let mut demo = create_new_app_template_for_tests(path); let txs = simulate_da_with_bad_serialization(); - let blob = new_test_blob_from_batch(Batch { txs }, &TEST_SEQUENCER_DA_ADDRESS, [0; 32]); + let blob = new_test_blob_from_batch(Batch { txs }, &MOCK_SEQUENCER_DA_ADDRESS, [0; 32]); let blob_sender = blob.sender(); let mut blobs = [blob]; diff --git a/examples/simple-nft-module/Cargo.toml b/examples/simple-nft-module/Cargo.toml index 651b9b034..4d15d87d1 100644 --- a/examples/simple-nft-module/Cargo.toml +++ b/examples/simple-nft-module/Cargo.toml @@ -17,6 +17,9 @@ serde = { workspace = true } sov-modules-api = { path = "../../module-system/sov-modules-api" } sov-state = { path = "../../module-system/sov-state" } +clap = { workspace = true, optional = true, features = ["derive"] } +schemars = { workspace = true, optional = true } +serde_json = { workspace = true, optional = true } jsonrpsee = { workspace = true, features = ["macros", "client-core", "server"], optional = true } [dev-dependencies] @@ -27,5 +30,5 @@ simple-nft-module = { version = "*", features = ["native"], path = "." } [features] default = [] -native = ["sov-state/native", "sov-modules-api/native", "jsonrpsee"] +native = ["sov-state/native", "sov-modules-api/native", "jsonrpsee", "schemars", "serde_json", "clap"] test = ["native"] diff --git a/examples/simple-nft-module/src/call.rs b/examples/simple-nft-module/src/call.rs index 59133c268..09cd5d9b3 100644 --- a/examples/simple-nft-module/src/call.rs +++ b/examples/simple-nft-module/src/call.rs @@ -1,4 +1,6 @@ use anyhow::{bail, Result}; +#[cfg(feature = "native")] +use sov_modules_api::macros::CliWalletArg; use sov_modules_api::{CallResponse, Context, WorkingSet}; use crate::NonFungibleToken; @@ -6,7 +8,10 @@ use crate::NonFungibleToken; #[cfg_attr( feature = "native", derive(serde::Serialize), - derive(serde::Deserialize) + derive(serde::Deserialize), + derive(CliWalletArg), + derive(schemars::JsonSchema), + schemars(bound = "C::Address: ::schemars::JsonSchema", rename = "CallMessage") )] #[derive(borsh::BorshDeserialize, borsh::BorshSerialize, Debug, PartialEq, Clone)] /// A transaction handled by the NFT module. Mints, Transfers, or Burns an NFT by id diff --git a/examples/simple-nft-module/src/genesis.rs b/examples/simple-nft-module/src/genesis.rs index d4343b9a5..ef5c915c9 100644 --- a/examples/simple-nft-module/src/genesis.rs +++ b/examples/simple-nft-module/src/genesis.rs @@ -1,8 +1,19 @@ use anyhow::{bail, Result}; +use serde::{Deserialize, Serialize}; use sov_modules_api::{Context, WorkingSet}; use crate::NonFungibleToken; +/// Config for the NonFungibleToken module. +/// Sets admin and existing owners. +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] +pub struct NonFungibleTokenConfig { + /// Admin of the NonFungibleToken module. + pub admin: C::Address, + /// Existing owners of the NonFungibleToken module. + pub owners: Vec<(u64, C::Address)>, +} + impl NonFungibleToken { pub(crate) fn init_module( &self, @@ -19,3 +30,36 @@ impl NonFungibleToken { Ok(()) } } + +#[cfg(test)] +mod test { + use sov_modules_api::default_context::DefaultContext; + use sov_modules_api::utils::generate_address; + use sov_modules_api::Spec; + + use super::NonFungibleTokenConfig; + + #[test] + fn test_config_serialization() { + let address: ::Address = + generate_address::("admin"); + let owner: ::Address = generate_address::("owner"); + + let config = NonFungibleTokenConfig:: { + admin: address, + owners: vec![(0, owner)], + }; + + let data = r#" + { + "admin":"sov1335hded4gyzpt00fpz75mms4m7ck02wgw07yhw9grahj4dzg4yvqk63pml", + "owners":[ + [0,"sov1fsgzj6t7udv8zhf6zj32mkqhcjcpv52yph5qsdcl0qt94jgdckqsczjm2y"] + ] + }"#; + + let parsed_config: NonFungibleTokenConfig = + serde_json::from_str(data).unwrap(); + assert_eq!(config, parsed_config) + } +} diff --git a/examples/simple-nft-module/src/lib.rs b/examples/simple-nft-module/src/lib.rs index 16bce9c15..49f7ecff8 100644 --- a/examples/simple-nft-module/src/lib.rs +++ b/examples/simple-nft-module/src/lib.rs @@ -4,13 +4,14 @@ mod call; pub use call::CallMessage; mod genesis; +pub use genesis::*; #[cfg(feature = "native")] mod query; #[cfg(feature = "native")] pub use query::*; -use serde::{Deserialize, Serialize}; use sov_modules_api::{CallResponse, Context, Error, Module, ModuleInfo, WorkingSet}; +#[cfg_attr(feature = "native", derive(sov_modules_api::ModuleCallJsonSchema))] #[derive(ModuleInfo, Clone)] /// Module for non-fungible tokens (NFT). /// Each token is represented by a unique ID. @@ -28,16 +29,6 @@ pub struct NonFungibleToken { owners: sov_modules_api::StateMap, } -/// Config for the NonFungibleToken module. -/// Sets admin and existing owners. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct NonFungibleTokenConfig { - /// Admin of the NonFungibleToken module. - pub admin: C::Address, - /// Existing owners of the NonFungibleToken module. - pub owners: Vec<(u64, C::Address)>, -} - impl Module for NonFungibleToken { type Context = C; diff --git a/examples/simple-nft-module/src/tests.rs b/examples/simple-nft-module/src/tests.rs new file mode 100644 index 000000000..f7349ea4a --- /dev/null +++ b/examples/simple-nft-module/src/tests.rs @@ -0,0 +1,27 @@ +use sov_modules_api::default_context::DefaultContext; +use sov_modules_api::utils::generate_address as gen_addr_generic; +use sov_modules_api::Spec; + +use crate::NonFungibleTokenConfig; + +#[test] +fn test_config_serialization() { + let address: ::Address = gen_addr_generic::("admin"); + let owner: ::Address = gen_addr_generic::("owner"); + + let config = NonFungibleTokenConfig:: { + admin: address, + owners: vec![(0, owner)], + }; + + let data = r#" + { + "admin":"sov1335hded4gyzpt00fpz75mms4m7ck02wgw07yhw9grahj4dzg4yvqk63pml", + "owners":[ + [0,"sov1fsgzj6t7udv8zhf6zj32mkqhcjcpv52yph5qsdcl0qt94jgdckqsczjm2y"] + ] + }"#; + + let parsed_config: NonFungibleTokenConfig = serde_json::from_str(data).unwrap(); + assert_eq!(config, parsed_config) +} diff --git a/examples/test-data/genesis/accounts.json b/examples/test-data/genesis/demo-tests/accounts.json similarity index 100% rename from examples/test-data/genesis/accounts.json rename to examples/test-data/genesis/demo-tests/accounts.json diff --git a/examples/test-data/genesis/bank.json b/examples/test-data/genesis/demo-tests/bank.json similarity index 100% rename from examples/test-data/genesis/bank.json rename to examples/test-data/genesis/demo-tests/bank.json diff --git a/examples/test-data/genesis/chain_state.json b/examples/test-data/genesis/demo-tests/chain_state.json similarity index 100% rename from examples/test-data/genesis/chain_state.json rename to examples/test-data/genesis/demo-tests/chain_state.json diff --git a/examples/test-data/genesis/evm.json b/examples/test-data/genesis/demo-tests/evm.json similarity index 100% rename from examples/test-data/genesis/evm.json rename to examples/test-data/genesis/demo-tests/evm.json diff --git a/examples/test-data/genesis/demo-tests/nft.json b/examples/test-data/genesis/demo-tests/nft.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/examples/test-data/genesis/demo-tests/nft.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/examples/test-data/genesis/demo-tests/sequencer_registry.json b/examples/test-data/genesis/demo-tests/sequencer_registry.json new file mode 100644 index 000000000..690301648 --- /dev/null +++ b/examples/test-data/genesis/demo-tests/sequencer_registry.json @@ -0,0 +1,9 @@ +{ + "seq_rollup_address":"sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94", + "seq_da_address":"celestia1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzf30as", + "coins_to_lock":{ + "amount":50, + "token_address":"sov1zsnx7n2wjvtkr0ttscfgt06pjca3v2e6stxeu49qwynavmk7a8xqlxkkjp" + }, + "is_preferred_sequencer":true +} \ No newline at end of file diff --git a/examples/test-data/genesis/value_setter.json b/examples/test-data/genesis/demo-tests/value_setter.json similarity index 100% rename from examples/test-data/genesis/value_setter.json rename to examples/test-data/genesis/demo-tests/value_setter.json diff --git a/examples/test-data/genesis/integration-tests/accounts.json b/examples/test-data/genesis/integration-tests/accounts.json new file mode 100644 index 000000000..3a134d04d --- /dev/null +++ b/examples/test-data/genesis/integration-tests/accounts.json @@ -0,0 +1,3 @@ +{ + "pub_keys":[] +} \ No newline at end of file diff --git a/examples/test-data/genesis/integration-tests/bank.json b/examples/test-data/genesis/integration-tests/bank.json new file mode 100644 index 000000000..35b065659 --- /dev/null +++ b/examples/test-data/genesis/integration-tests/bank.json @@ -0,0 +1,10 @@ +{ + "tokens":[ + { + "token_name":"sov-demo-token", + "address_and_balances":[["sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94",100000000]], + "authorized_minters":["sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94"] + ,"salt":0 + } + ] +} \ No newline at end of file diff --git a/examples/test-data/genesis/integration-tests/chain_state.json b/examples/test-data/genesis/integration-tests/chain_state.json new file mode 100644 index 000000000..2e7f97e93 --- /dev/null +++ b/examples/test-data/genesis/integration-tests/chain_state.json @@ -0,0 +1,7 @@ +{ + "initial_slot_height":0, + "current_time":{ + "secs":0, + "nanos":0 + } +} \ No newline at end of file diff --git a/examples/test-data/genesis/integration-tests/evm.json b/examples/test-data/genesis/integration-tests/evm.json new file mode 100644 index 000000000..2f8db7a64 --- /dev/null +++ b/examples/test-data/genesis/integration-tests/evm.json @@ -0,0 +1,24 @@ +{ + "data":[ + { + "address":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "balance":"0xffffffffffffffff", + "code_hash":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "code":"0x", + "nonce":0 + }], + "chain_id":1, + "limit_contract_code_size":null, + "spec":{ + "0":"SHANGHAI" + }, + "coinbase":"0x0000000000000000000000000000000000000000", + "starting_base_fee":7, + "block_gas_limit":30000000, + "genesis_timestamp":0, + "block_timestamp_delta":1, + "base_fee_params":{ + "max_change_denominator":8, + "elasticity_multiplier":2 + } +} \ No newline at end of file diff --git a/examples/test-data/genesis/integration-tests/nft.json b/examples/test-data/genesis/integration-tests/nft.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/examples/test-data/genesis/integration-tests/nft.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/examples/test-data/genesis/integration-tests/sequencer_registry.json b/examples/test-data/genesis/integration-tests/sequencer_registry.json new file mode 100644 index 000000000..fdee012ec --- /dev/null +++ b/examples/test-data/genesis/integration-tests/sequencer_registry.json @@ -0,0 +1,9 @@ +{ + "seq_rollup_address":"sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94", + "seq_da_address":"0000000000000000000000000000000000000000000000000000000000000000", + "coins_to_lock":{ + "amount":50, + "token_address":"sov1zsnx7n2wjvtkr0ttscfgt06pjca3v2e6stxeu49qwynavmk7a8xqlxkkjp" + }, + "is_preferred_sequencer":true +} \ No newline at end of file diff --git a/examples/test-data/genesis/integration-tests/value_setter.json b/examples/test-data/genesis/integration-tests/value_setter.json new file mode 100644 index 000000000..35c01dd23 --- /dev/null +++ b/examples/test-data/genesis/integration-tests/value_setter.json @@ -0,0 +1,3 @@ +{ + "admin":"sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94" +} \ No newline at end of file diff --git a/full-node/db/sov-schema-db/src/lib.rs b/full-node/db/sov-schema-db/src/lib.rs index d7e5452c6..9837ff2df 100644 --- a/full-node/db/sov-schema-db/src/lib.rs +++ b/full-node/db/sov-schema-db/src/lib.rs @@ -283,7 +283,7 @@ impl SchemaBatch { .lock() .expect("Lock must not be poisoned") .entry(S::COLUMN_FAMILY_NAME) - .or_insert_with(Vec::new) + .or_default() .push(WriteOp::Value { key, value }); Ok(()) @@ -296,7 +296,7 @@ impl SchemaBatch { .lock() .expect("Lock must not be poisoned") .entry(S::COLUMN_FAMILY_NAME) - .or_insert_with(Vec::new) + .or_default() .push(WriteOp::Deletion { key }); Ok(()) diff --git a/full-node/sov-ethereum/src/lib.rs b/full-node/sov-ethereum/src/lib.rs index 264e5420a..0a9e4bbe0 100644 --- a/full-node/sov-ethereum/src/lib.rs +++ b/full-node/sov-ethereum/src/lib.rs @@ -12,7 +12,6 @@ pub mod experimental { use std::sync::{Arc, Mutex}; use borsh::ser::BorshSerialize; - use demo_stf::app::DefaultPrivateKey; use demo_stf::runtime::{DefaultContext, Runtime}; use ethers::types::{Bytes, H256}; use jsonrpsee::types::ErrorObjectOwned; @@ -22,6 +21,7 @@ pub mod experimental { }; use reth_rpc_types::{CallRequest, TransactionRequest, TypedTransactionRequest}; use sov_evm::{CallMessage, Evm, RlpEvmTransaction}; + use sov_modules_api::default_signature::private_key::DefaultPrivateKey; use sov_modules_api::transaction::Transaction; use sov_modules_api::utils::to_jsonrpsee_error_object; use sov_modules_api::{EncodeCall, WorkingSet}; diff --git a/full-node/sov-sequencer/Cargo.toml b/full-node/sov-sequencer/Cargo.toml index 30ac53a30..42c611b07 100644 --- a/full-node/sov-sequencer/Cargo.toml +++ b/full-node/sov-sequencer/Cargo.toml @@ -13,7 +13,6 @@ resolver = "2" [dependencies] - anyhow = { workspace = true } borsh = { workspace = true } hex = { workspace = true } @@ -21,8 +20,14 @@ jsonrpsee = { workspace = true, features = ["client", "server"] } serde = { workspace = true, features = ["derive"] } tracing = { workspace = true } sov-rollup-interface = { path = "../../rollup-interface", version = "0.2" } +sov-modules-api = { path = "../../module-system/sov-modules-api", version = "0.2", features = ["native"] } +sov-state = { path = "../../module-system/sov-state", version = "0.2" } [dev-dependencies] +tempfile = { workspace = true } +rand = { workspace = true } +tokio = { workspace = true } async-trait = { workspace = true } + sov-rollup-interface = { path = "../../rollup-interface", features = ["mocks", "native"] } -tokio = { workspace = true } +sov-value-setter = { path = "../../module-system/module-implementations/examples/sov-value-setter", features = ["native"] } diff --git a/full-node/sov-stf-runner/src/batch_builder.rs b/full-node/sov-sequencer/src/batch_builder.rs similarity index 100% rename from full-node/sov-stf-runner/src/batch_builder.rs rename to full-node/sov-sequencer/src/batch_builder.rs diff --git a/full-node/sov-sequencer/src/lib.rs b/full-node/sov-sequencer/src/lib.rs index dfce62671..04bbd5a0b 100644 --- a/full-node/sov-sequencer/src/lib.rs +++ b/full-node/sov-sequencer/src/lib.rs @@ -2,14 +2,17 @@ #![doc = include_str!("../README.md")] use std::sync::Mutex; +/// Concrete implementations of `[BatchBuilder]` +pub mod batch_builder; /// Utilities for the sequencer rpc pub mod utils; + use anyhow::anyhow; use jsonrpsee::types::ErrorObjectOwned; use jsonrpsee::RpcModule; +use sov_modules_api::utils::to_jsonrpsee_error_object; use sov_rollup_interface::services::batch_builder::BatchBuilder; use sov_rollup_interface::services::da::DaService; -use utils::to_jsonrpsee_error_object; const SEQUENCER_RPC_ERROR: &str = "SEQUENCER_RPC_ERROR"; diff --git a/full-node/sov-sequencer/src/utils.rs b/full-node/sov-sequencer/src/utils.rs index 56a42311e..befa37859 100644 --- a/full-node/sov-sequencer/src/utils.rs +++ b/full-node/sov-sequencer/src/utils.rs @@ -1,7 +1,6 @@ use borsh::BorshSerialize; use jsonrpsee::core::client::ClientT; use jsonrpsee::http_client::{HttpClient, HttpClientBuilder}; -use jsonrpsee::types::ErrorObjectOwned; use jsonrpsee::ws_client::{WsClient, WsClientBuilder}; use tracing::info; @@ -81,12 +80,3 @@ impl SimpleClient { &self.ws_client } } - -/// Creates an jsonrpsee ErrorObject -pub fn to_jsonrpsee_error_object(err: impl ToString, message: &str) -> ErrorObjectOwned { - ErrorObjectOwned::owned( - jsonrpsee::types::error::UNKNOWN_ERROR_CODE, - message, - Some(err.to_string()), - ) -} diff --git a/full-node/sov-stf-runner/Cargo.toml b/full-node/sov-stf-runner/Cargo.toml index 375d52cd1..4eb66df57 100644 --- a/full-node/sov-stf-runner/Cargo.toml +++ b/full-node/sov-stf-runner/Cargo.toml @@ -21,22 +21,23 @@ tokio = { workspace = true, optional = true } hex = { workspace = true } tracing = { workspace = true, optional = true } futures = { workspace = true, optional = true } - sov-db = { path = "../db/sov-db", version = "0.2", optional = true } sov-rollup-interface = { path = "../../rollup-interface", version = "0.2" } -sov-state = { path = "../../module-system/sov-state", version = "0.2" } -sov-modules-api = { path = "../../module-system/sov-modules-api", version = "0.2" } + [dev-dependencies] tempfile = { workspace = true } -rand = { workspace = true } sov-sequencer-registry = { path = "../../module-system/module-implementations/sov-sequencer-registry", features = ["native"] } sov-bank = { path = "../../module-system/module-implementations/sov-bank", features = ["native"] } sov-modules-stf-template = { path = "../../module-system/sov-modules-stf-template", features = ["native"] } -sov-value-setter = { path = "../../module-system/module-implementations/examples/sov-value-setter", features = ["native"] } + sov-accounts = { path = "../../module-system/module-implementations/sov-accounts", features = ["native"] } sov-celestia-adapter = { path = "../../adapters/celestia", features = ["native"] } +sov-sequencer = { path = "../sov-sequencer" } + +sov-state = { path = "../../module-system/sov-state" } +sov-modules-api = { path = "../../module-system/sov-modules-api" } [features] default = [] diff --git a/full-node/sov-stf-runner/src/config.rs b/full-node/sov-stf-runner/src/config.rs index c4a4a42d8..44e4a63b1 100644 --- a/full-node/sov-stf-runner/src/config.rs +++ b/full-node/sov-stf-runner/src/config.rs @@ -1,10 +1,9 @@ use std::fs::File; use std::io::Read; -use std::path::Path; +use std::path::{Path, PathBuf}; use serde::de::DeserializeOwned; use serde::Deserialize; -pub use sov_state::config::Config as StorageConfig; /// Configuration for StateTransitionRunner. #[derive(Debug, Clone, PartialEq, Deserialize)] @@ -24,14 +23,21 @@ pub struct RpcConfig { pub bind_port: u16, } +/// Simple storage configuration +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub struct StorageConfig { + /// Path that can be utilized by concrete implementation + pub path: PathBuf, +} + /// Rollup Configuration #[derive(Debug, Clone, PartialEq, Deserialize)] pub struct RollupConfig { - /// Runner configuration. + /// Currently rollup config runner only supports storage path parameter pub storage: StorageConfig, - /// TODO + /// Runner own configuration. pub runner: RunnerConfig, - /// DA configuration. + /// Data Availability service configuration. pub da: DaServiceConfig, } diff --git a/full-node/sov-stf-runner/src/ledger_rpc.rs b/full-node/sov-stf-runner/src/ledger_rpc.rs index 062858ad1..8c135b651 100644 --- a/full-node/sov-stf-runner/src/ledger_rpc.rs +++ b/full-node/sov-stf-runner/src/ledger_rpc.rs @@ -1,9 +1,9 @@ use futures::future::{select, Either}; +use jsonrpsee::types::ErrorObjectOwned; use jsonrpsee::{RpcModule, SubscriptionMessage}; use serde::de::DeserializeOwned; use serde::Serialize; use sov_db::ledger_db::LedgerDB; -use sov_modules_api::utils::to_jsonrpsee_error_object; use sov_rollup_interface::rpc::{ BatchIdentifier, EventIdentifier, LedgerRpcProvider, SlotIdentifier, TxIdentifier, }; @@ -128,3 +128,11 @@ mod query_args { Ok(QueryArgs(ids, Default::default())) } } + +pub fn to_jsonrpsee_error_object(err: impl ToString, message: &str) -> ErrorObjectOwned { + ErrorObjectOwned::owned( + jsonrpsee::types::error::UNKNOWN_ERROR_CODE, + message, + Some(err.to_string()), + ) +} diff --git a/full-node/sov-stf-runner/src/lib.rs b/full-node/sov-stf-runner/src/lib.rs index defc63c28..40543c7e3 100644 --- a/full-node/sov-stf-runner/src/lib.rs +++ b/full-node/sov-stf-runner/src/lib.rs @@ -1,8 +1,6 @@ #![deny(missing_docs)] #![doc = include_str!("../README.md")] -#[cfg(feature = "native")] -mod batch_builder; #[cfg(feature = "native")] mod config; @@ -14,16 +12,15 @@ mod ledger_rpc; #[cfg(feature = "native")] mod runner; #[cfg(feature = "native")] -pub use batch_builder::FiFoStrictBatchBuilder; -#[cfg(feature = "native")] pub use config::{from_toml_path, RollupConfig, RunnerConfig, StorageConfig}; #[cfg(feature = "native")] pub use ledger_rpc::get_ledger_rpc; #[cfg(feature = "native")] pub use runner::*; use serde::{Deserialize, Serialize}; -use sov_modules_api::{DaSpec, Zkvm}; +use sov_rollup_interface::da::DaSpec; use sov_rollup_interface::stf::StateTransitionFunction; +use sov_rollup_interface::zk::Zkvm; /// Implements the `StateTransitionVerifier` type for checking the validity of a state transition pub mod verifier; diff --git a/full-node/sov-stf-runner/src/runner.rs b/full-node/sov-stf-runner/src/runner.rs index 0e6fcc613..97d4e7b44 100644 --- a/full-node/sov-stf-runner/src/runner.rs +++ b/full-node/sov-stf-runner/src/runner.rs @@ -2,9 +2,8 @@ use std::net::SocketAddr; use jsonrpsee::RpcModule; use sov_db::ledger_db::{LedgerDB, SlotCommit}; -use sov_modules_api::SlotData; use sov_rollup_interface::da::{BlobReaderTrait, DaSpec}; -use sov_rollup_interface::services::da::DaService; +use sov_rollup_interface::services::da::{DaService, SlotData}; use sov_rollup_interface::stf::StateTransitionFunction; use sov_rollup_interface::zk::ZkvmHost; use tokio::sync::oneshot; @@ -141,7 +140,7 @@ where } info!("Starting RPC server at {} ", &bound_address); - let _server_handle = server.start(methods).unwrap(); + let _server_handle = server.start(methods); futures::future::pending::<()>().await; }); } @@ -152,7 +151,7 @@ where debug!("Requesting data for height {}", height,); let filtered_block = self.da_service.get_finalized_at(height).await?; - let mut blobs = self.da_service.extract_relevant_txs(&filtered_block); + let mut blobs = self.da_service.extract_relevant_blobs(&filtered_block); info!( "Extracted {} relevant blobs at height {}: {:?}", @@ -180,6 +179,7 @@ where for receipt in slot_result.batch_receipts { data_to_commit.add_batch(receipt); } + if let Some(Prover { vm, config }) = self.prover.as_mut() { let (inclusion_proof, completeness_proof) = self .da_service diff --git a/full-node/sov-stf-runner/src/verifier.rs b/full-node/sov-stf-runner/src/verifier.rs index 6143be438..8b3007ffb 100644 --- a/full-node/sov-stf-runner/src/verifier.rs +++ b/full-node/sov-stf-runner/src/verifier.rs @@ -1,9 +1,8 @@ use std::marker::PhantomData; -use sov_modules_api::Zkvm; use sov_rollup_interface::da::DaVerifier; use sov_rollup_interface::stf::StateTransitionFunction; -use sov_rollup_interface::zk::ZkvmGuest; +use sov_rollup_interface::zk::{Zkvm, ZkvmGuest}; use crate::StateTransitionData; diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 2f4e494e6..82ae4375d 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -24,12 +24,6 @@ sov-state = { path = "../module-system/sov-state" } [workspace] members = ["."] -[[bin]] -name = "namespace_group_from_b64" -path = "fuzz_targets/namespace_group_from_b64.rs" -test = false -doc = false - [[bin]] name = "parse_address" path = "fuzz_targets/parse_address.rs" diff --git a/fuzz/fuzz_targets/accounts_call.rs b/fuzz/fuzz_targets/accounts_call.rs index ceec6c61e..df64afe76 100644 --- a/fuzz/fuzz_targets/accounts_call.rs +++ b/fuzz/fuzz_targets/accounts_call.rs @@ -42,7 +42,7 @@ fuzz_target!(|input: (u16, [u8; 32], Vec)| -> Corpus { let storage = ::Storage::with_path(tmpdir.path()).unwrap(); let working_set = &mut WorkingSet::new(storage); - let config: AccountConfig = keys.iter().map(|k| k.pub_key()).collect(); + let config: AccountConfig = keys.iter().map(|k| k.pub_key()).collect(); let accounts: Accounts = Accounts::default(); accounts.genesis(&config, working_set).unwrap(); diff --git a/fuzz/fuzz_targets/namespace_group_from_b64.rs b/fuzz/fuzz_targets/namespace_group_from_b64.rs deleted file mode 100644 index 1ce6b9f65..000000000 --- a/fuzz/fuzz_targets/namespace_group_from_b64.rs +++ /dev/null @@ -1,11 +0,0 @@ -#![no_main] -#[macro_use] -extern crate libfuzzer_sys; - -use sov_celestia_adapter::shares::NamespaceGroup; - -fuzz_target!(|data: &[u8]| { - if let Ok(s) = std::str::from_utf8(data) { - let _ = NamespaceGroup::from_b64(s).ok(); - } -}); diff --git a/module-system/README.md b/module-system/README.md index 61afa1a2a..541bfd030 100644 --- a/module-system/README.md +++ b/module-system/README.md @@ -328,3 +328,22 @@ its data from a set of "hints" provided by the prover. Because all the rollups m about this distinction. For more information on `Context` and `Spec`, and to see some example implementations, check out the [`sov_modules_api`](./sov-modules-api/) docs. + + +### Module CallMessage and `schemars::JsonSchema`. +Like in the `bank` module the `CallMessage` can be parameterized by `C::Context`. To ensure a smooth wallet experience, we need the `CallMessage` to implement `schemars::JsonSchema` trait. However, simply adding `derive(schemars::JsonSchema)` to the `CallMessage` definition results in the following error: + +``` +the trait JsonSchema is not implemented for C +``` + + +The reason for this issue is that the standard derive mechanism for `JsonSchema` cannot determine the correct trait bounds for the `Context`. To resolve this, we need to provide the following hint: + +```rust +schemars(bound = "C::Address: ::schemars::JsonSchema", rename = "CallMessage") +``` + +Now, the `schemars::derive` understands that it is sufficient for only `C::Address` to implement `schemars::JsonSchema` + +If `CallMessage` in your module uses an associated type from `Context` you might need to provide a similar hint. diff --git a/module-system/module-implementations/examples/sov-value-setter/src/call.rs b/module-system/module-implementations/examples/sov-value-setter/src/call.rs index 98ae9f4da..fb9040f68 100644 --- a/module-system/module-implementations/examples/sov-value-setter/src/call.rs +++ b/module-system/module-implementations/examples/sov-value-setter/src/call.rs @@ -19,7 +19,10 @@ use super::ValueSetter; #[derive(borsh::BorshDeserialize, borsh::BorshSerialize, Debug, PartialEq, Clone)] pub enum CallMessage { /// value to set - SetValue(u32), + SetValue( + /// new value + u32, + ), } /// Example of a custom error. diff --git a/module-system/module-implementations/examples/sov-value-setter/src/genesis.rs b/module-system/module-implementations/examples/sov-value-setter/src/genesis.rs index 99e2b43d5..8913dbb29 100644 --- a/module-system/module-implementations/examples/sov-value-setter/src/genesis.rs +++ b/module-system/module-implementations/examples/sov-value-setter/src/genesis.rs @@ -3,6 +3,13 @@ use sov_modules_api::WorkingSet; use super::ValueSetter; +/// Initial configuration for sov-value-setter module. +#[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq)] +pub struct ValueSetterConfig { + /// Admin of the module. + pub admin: C::Address, +} + impl ValueSetter { /// Initializes module with the `admin` role. pub(crate) fn init_module( @@ -14,3 +21,25 @@ impl ValueSetter { Ok(()) } } + +#[cfg(test)] +mod tests { + use sov_modules_api::default_context::DefaultContext; + use sov_modules_api::Address; + + use crate::ValueSetterConfig; + + #[test] + fn test_config_serialization() { + let admin = Address::from([1; 32]); + let config = ValueSetterConfig:: { admin }; + + let data = r#" + { + "admin":"sov1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs259tk3" + }"#; + + let parsed_config: ValueSetterConfig = serde_json::from_str(data).unwrap(); + assert_eq!(parsed_config, config); + } +} diff --git a/module-system/module-implementations/examples/sov-value-setter/src/lib.rs b/module-system/module-implementations/examples/sov-value-setter/src/lib.rs index a66addb13..d1b649fcc 100644 --- a/module-system/module-implementations/examples/sov-value-setter/src/lib.rs +++ b/module-system/module-implementations/examples/sov-value-setter/src/lib.rs @@ -9,18 +9,12 @@ mod tests; #[cfg(feature = "native")] mod query; -pub use call::CallMessage; +pub use call::*; +pub use genesis::*; #[cfg(feature = "native")] pub use query::*; use sov_modules_api::{Error, ModuleInfo, WorkingSet}; -/// Initial configuration for sov-value-setter module. -#[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq)] -pub struct ValueSetterConfig { - /// Admin of the module. - pub admin: C::Address, -} - /// A new module: /// - Must derive `ModuleInfo` /// - Must contain `[address]` field diff --git a/module-system/module-implementations/examples/sov-value-setter/src/tests.rs b/module-system/module-implementations/examples/sov-value-setter/src/tests.rs index 01e107f40..4981f8369 100644 --- a/module-system/module-implementations/examples/sov-value-setter/src/tests.rs +++ b/module-system/module-implementations/examples/sov-value-setter/src/tests.rs @@ -5,20 +5,6 @@ use sov_state::{ProverStorage, ZkStorage}; use super::ValueSetter; use crate::{call, query, ValueSetterConfig}; -#[test] -fn test_config_serialization() { - let admin = Address::from([1; 32]); - let config = ValueSetterConfig:: { admin }; - - let data = r#" - { - "admin":"sov1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs259tk3" - }"#; - - let parsed_config: ValueSetterConfig = serde_json::from_str(data).unwrap(); - assert_eq!(parsed_config, config); -} - #[test] fn test_value_setter() { let tmpdir = tempfile::tempdir().unwrap(); diff --git a/module-system/module-implementations/sov-accounts/src/genesis.rs b/module-system/module-implementations/sov-accounts/src/genesis.rs index ffee617ea..ad0ac21ce 100644 --- a/module-system/module-implementations/sov-accounts/src/genesis.rs +++ b/module-system/module-implementations/sov-accounts/src/genesis.rs @@ -1,8 +1,16 @@ use anyhow::{bail, Result}; -use sov_modules_api::{PublicKey, WorkingSet}; +use sov_modules_api::{Context, PublicKey, WorkingSet}; use crate::{Account, Accounts}; +/// Initial configuration for sov-accounts module. +#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +#[serde(bound = "C::PublicKey: serde::Serialize + serde::de::DeserializeOwned")] +pub struct AccountConfig { + /// Public keys to initialize the rollup. + pub pub_keys: Vec, +} + impl Accounts { pub(crate) fn init_module( &self, @@ -51,3 +59,33 @@ impl Accounts { Ok(()) } } + +#[cfg(test)] +mod tests { + use std::str::FromStr; + + use sov_modules_api::default_context::DefaultContext; + use sov_modules_api::default_signature::DefaultPublicKey; + + use super::*; + + #[test] + fn test_config_serialization() { + let pub_key = &DefaultPublicKey::from_str( + "1cd4e2d9d5943e6f3d12589d31feee6bb6c11e7b8cd996a393623e207da72cbf", + ) + .unwrap(); + + let config = AccountConfig:: { + pub_keys: vec![pub_key.clone()], + }; + + let data = r#" + { + "pub_keys":["1cd4e2d9d5943e6f3d12589d31feee6bb6c11e7b8cd996a393623e207da72cbf"] + }"#; + + let parsed_config: AccountConfig = serde_json::from_str(data).unwrap(); + assert_eq!(parsed_config, config); + } +} diff --git a/module-system/module-implementations/sov-accounts/src/lib.rs b/module-system/module-implementations/sov-accounts/src/lib.rs index 922fce9f4..6616e889e 100644 --- a/module-system/module-implementations/sov-accounts/src/lib.rs +++ b/module-system/module-implementations/sov-accounts/src/lib.rs @@ -1,9 +1,9 @@ #![deny(missing_docs)] #![doc = include_str!("../README.md")] -mod hooks; - mod call; mod genesis; +mod hooks; +pub use genesis::*; #[cfg(feature = "native")] mod query; #[cfg(feature = "native")] @@ -14,14 +14,6 @@ mod tests; pub use call::{CallMessage, UPDATE_ACCOUNT_MSG}; use sov_modules_api::{Context, Error, ModuleInfo, WorkingSet}; -/// Initial configuration for sov-accounts module. -#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] -#[serde(bound = "C::PublicKey: serde::Serialize + serde::de::DeserializeOwned")] -pub struct AccountConfig { - /// Public keys to initialize the rollup. - pub pub_keys: Vec, -} - impl FromIterator for AccountConfig { fn from_iter>(iter: T) -> Self { Self { diff --git a/module-system/module-implementations/sov-accounts/src/tests.rs b/module-system/module-implementations/sov-accounts/src/tests.rs index 573168530..a1821894c 100644 --- a/module-system/module-implementations/sov-accounts/src/tests.rs +++ b/module-system/module-implementations/sov-accounts/src/tests.rs @@ -1,8 +1,5 @@ -use std::str::FromStr; - use sov_modules_api::default_context::DefaultContext; use sov_modules_api::default_signature::private_key::DefaultPrivateKey; -use sov_modules_api::default_signature::DefaultPublicKey; use sov_modules_api::{AddressBech32, Context, Module, PrivateKey, PublicKey, Spec, WorkingSet}; use sov_state::ProverStorage; @@ -10,26 +7,6 @@ use crate::query::{self, Response}; use crate::{call, AccountConfig, Accounts}; type C = DefaultContext; -#[test] -fn test_config_serialization() { - let pub_key = &DefaultPublicKey::from_str( - "1cd4e2d9d5943e6f3d12589d31feee6bb6c11e7b8cd996a393623e207da72cbf", - ) - .unwrap(); - - let config = AccountConfig:: { - pub_keys: vec![pub_key.clone()], - }; - - let data = r#" - { - "pub_keys":["1cd4e2d9d5943e6f3d12589d31feee6bb6c11e7b8cd996a393623e207da72cbf"] - }"#; - - let parsed_config: AccountConfig = serde_json::from_str(data).unwrap(); - assert_eq!(parsed_config, config); -} - #[test] fn test_config_account() { let priv_key = DefaultPrivateKey::generate(); diff --git a/module-system/module-implementations/sov-attester-incentives/src/genesis.rs b/module-system/module-implementations/sov-attester-incentives/src/genesis.rs index e981814d6..0ebcc2beb 100644 --- a/module-system/module-implementations/sov-attester-incentives/src/genesis.rs +++ b/module-system/module-implementations/sov-attester-incentives/src/genesis.rs @@ -1,10 +1,45 @@ +use core::marker::PhantomData; + use anyhow::Result; use borsh::{BorshDeserialize, BorshSerialize}; -use sov_modules_api::{ValidityConditionChecker, WorkingSet}; +use sov_bank::Amount; +use sov_chain_state::TransitionHeight; +use sov_modules_api::{Context, DaSpec, ValidityConditionChecker, WorkingSet, Zkvm}; use sov_state::Storage; -use crate::call::Role; -use crate::AttesterIncentives; +use crate::{AttesterIncentives, Role}; + +/// Configuration of the attester incentives module +pub struct AttesterIncentivesConfig +where + C: Context, + Vm: Zkvm, + Da: DaSpec, + Checker: ValidityConditionChecker, +{ + /// The address of the token to be used for bonding. + pub bonding_token_address: C::Address, + /// The address of the account holding the reward token supply + pub reward_token_supply_address: C::Address, + /// The minimum bond for an attester. + pub minimum_attester_bond: Amount, + /// The minimum bond for a challenger. + pub minimum_challenger_bond: Amount, + /// A code commitment to be used for verifying proofs + pub commitment_to_allowed_challenge_method: Vm::CodeCommitment, + /// A list of initial provers and their bonded amount. + pub initial_attesters: Vec<(C::Address, Amount)>, + /// The finality period of the rollup (constant) in the number of DA layer slots processed. + pub rollup_finality_period: TransitionHeight, + /// The current maximum attested height + pub maximum_attested_height: TransitionHeight, + /// The light client finalized height + pub light_client_finalized_height: TransitionHeight, + /// The validity condition checker used to check validity conditions + pub validity_condition_checker: Checker, + /// Phantom data that contains the validity condition + pub(crate) phantom_data: PhantomData, +} impl AttesterIncentives where diff --git a/module-system/module-implementations/sov-attester-incentives/src/lib.rs b/module-system/module-implementations/sov-attester-incentives/src/lib.rs index 504f5c88b..46bba2b75 100644 --- a/module-system/module-implementations/sov-attester-incentives/src/lib.rs +++ b/module-system/module-implementations/sov-attester-incentives/src/lib.rs @@ -2,10 +2,12 @@ #![doc = include_str!("../README.md")] /// Call methods for the module -pub mod call; - +mod call; /// Methods used to instantiate the module -pub mod genesis; +mod genesis; + +pub use call::*; +pub use genesis::*; #[cfg(test)] mod tests; @@ -13,10 +15,7 @@ mod tests; #[cfg(feature = "native")] mod query; -use std::marker::PhantomData; - use borsh::{BorshDeserialize, BorshSerialize}; -use call::Role; #[cfg(feature = "native")] pub use query::*; use sov_bank::Amount; @@ -26,38 +25,6 @@ use sov_modules_api::{ }; use sov_state::codec::BcsCodec; -/// Configuration of the attester incentives module -pub struct AttesterIncentivesConfig -where - C: Context, - Vm: Zkvm, - Da: DaSpec, - Checker: ValidityConditionChecker, -{ - /// The address of the token to be used for bonding. - pub bonding_token_address: C::Address, - /// The address of the account holding the reward token supply - pub reward_token_supply_address: C::Address, - /// The minimum bond for an attester. - pub minimum_attester_bond: Amount, - /// The minimum bond for a challenger. - pub minimum_challenger_bond: Amount, - /// A code commitment to be used for verifying proofs - pub commitment_to_allowed_challenge_method: Vm::CodeCommitment, - /// A list of initial provers and their bonded amount. - pub initial_attesters: Vec<(C::Address, Amount)>, - /// The finality period of the rollup (constant) in the number of DA layer slots processed. - pub rollup_finality_period: TransitionHeight, - /// The current maximum attested height - pub maximum_attested_height: TransitionHeight, - /// The light client finalized height - pub light_client_finalized_height: TransitionHeight, - /// The validity condition checker used to check validity conditions - pub validity_condition_checker: Checker, - /// Phantom data that contains the validity condition - phantom_data: PhantomData, -} - /// The information about an attender's unbonding #[derive(BorshDeserialize, BorshSerialize, Clone, Debug)] pub struct UnbondingInfo { diff --git a/module-system/module-implementations/sov-bank/src/genesis.rs b/module-system/module-implementations/sov-bank/src/genesis.rs index 53960b0b4..3648a4b33 100644 --- a/module-system/module-implementations/sov-bank/src/genesis.rs +++ b/module-system/module-implementations/sov-bank/src/genesis.rs @@ -1,9 +1,34 @@ use anyhow::{bail, Result}; +use serde::de::DeserializeOwned; +use serde::{Deserialize, Serialize}; use sov_modules_api::WorkingSet; use crate::token::Token; use crate::Bank; +/// Initial configuration for sov-bank module. +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] +#[serde(bound = "C::Address: Serialize + DeserializeOwned")] +pub struct BankConfig { + /// A list of configurations for the initial tokens. + pub tokens: Vec>, +} + +/// [`TokenConfig`] specifies a configuration used when generating a token for the bank +/// module. +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] +#[serde(bound = "C::Address: Serialize + DeserializeOwned")] +pub struct TokenConfig { + /// The name of the token. + pub token_name: String, + /// A vector of tuples containing the initial addresses and balances (as u64) + pub address_and_balances: Vec<(C::Address, u64)>, + /// The addresses that are authorized to mint the token. + pub authorized_minters: Vec, + /// A salt used to encrypt the token address. + pub salt: u64, +} + /// The address of the deployment node. For now, set to [0; 32] pub(crate) const DEPLOYER: [u8; 32] = [0; 32]; @@ -37,3 +62,47 @@ impl Bank { Ok(()) } } + +#[cfg(test)] +mod tests { + use std::str::FromStr; + + use sov_modules_api::default_context::DefaultContext; + use sov_modules_api::{AddressBech32, Spec}; + + use super::*; + + #[test] + fn test_config_serialization() { + let address: ::Address = AddressBech32::from_str( + "sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94", + ) + .unwrap() + .into(); + + let config = BankConfig:: { + tokens: vec![TokenConfig { + token_name: "sov-demo-token".to_owned(), + address_and_balances: vec![(address, 100000000)], + authorized_minters: vec![address], + salt: 0, + }], + }; + + let data = r#" + { + "tokens":[ + { + "token_name":"sov-demo-token", + "address_and_balances":[["sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94",100000000]], + "authorized_minters":["sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94"] + ,"salt":0 + } + ] + }"#; + + let parsed_config: BankConfig = serde_json::from_str(data).unwrap(); + + assert_eq!(config, parsed_config) + } +} diff --git a/module-system/module-implementations/sov-bank/src/lib.rs b/module-system/module-implementations/sov-bank/src/lib.rs index 99d194bd8..8884ac2e5 100644 --- a/module-system/module-implementations/sov-bank/src/lib.rs +++ b/module-system/module-implementations/sov-bank/src/lib.rs @@ -6,15 +6,11 @@ mod genesis; mod query; #[cfg(feature = "native")] pub use query::*; -#[cfg(test)] -mod tests; mod token; /// Util functions for bank pub mod utils; -/// Specifies the call methods using in that module. -pub use call::CallMessage; -use serde::de::DeserializeOwned; -use serde::{Deserialize, Serialize}; +pub use call::*; +pub use genesis::*; use sov_modules_api::{CallResponse, Error, GasUnit, ModuleInfo, WorkingSet}; use token::Token; /// Specifies an interface to interact with tokens. @@ -22,29 +18,6 @@ pub use token::{Amount, Coins}; /// Methods to get a token address. pub use utils::{get_genesis_token_address, get_token_address}; -/// [`TokenConfig`] specifies a configuration used when generating a token for the bank -/// module. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] -#[serde(bound = "C::Address: Serialize + DeserializeOwned")] -pub struct TokenConfig { - /// The name of the token. - pub token_name: String, - /// A vector of tuples containing the initial addresses and balances (as u64) - pub address_and_balances: Vec<(C::Address, u64)>, - /// The addresses that are authorized to mint the token. - pub authorized_minters: Vec, - /// A salt used to encrypt the token address. - pub salt: u64, -} - -/// Initial configuration for sov-bank module. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] -#[serde(bound = "C::Address: Serialize + DeserializeOwned")] -pub struct BankConfig { - /// A list of configurations for the initial tokens. - pub tokens: Vec>, -} - /// Gas configuration for the bank module #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct BankGasConfig { diff --git a/module-system/module-implementations/sov-bank/src/tests.rs b/module-system/module-implementations/sov-bank/src/tests.rs deleted file mode 100644 index 0e5661a10..000000000 --- a/module-system/module-implementations/sov-bank/src/tests.rs +++ /dev/null @@ -1,39 +0,0 @@ -use std::str::FromStr; - -use sov_modules_api::default_context::DefaultContext; -use sov_modules_api::{AddressBech32, Spec}; - -use crate::{BankConfig, TokenConfig}; - -#[test] -fn test_config_serialization() { - let address: ::Address = - AddressBech32::from_str("sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94") - .unwrap() - .into(); - - let config = BankConfig:: { - tokens: vec![TokenConfig { - token_name: "sov-demo-token".to_owned(), - address_and_balances: vec![(address, 100000000)], - authorized_minters: vec![address], - salt: 0, - }], - }; - - let data = r#" - { - "tokens":[ - { - "token_name":"sov-demo-token", - "address_and_balances":[["sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94",100000000]], - "authorized_minters":["sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94"] - ,"salt":0 - } - ] - }"#; - - let parsed_config: BankConfig = serde_json::from_str(data).unwrap(); - - assert_eq!(config, parsed_config) -} diff --git a/module-system/module-implementations/sov-bank/src/token.rs b/module-system/module-implementations/sov-bank/src/token.rs index 8ad62943a..ea17c6c84 100644 --- a/module-system/module-implementations/sov-bank/src/token.rs +++ b/module-system/module-implementations/sov-bank/src/token.rs @@ -27,7 +27,14 @@ pub type Amount = u64; schemars(bound = "C::Address: ::schemars::JsonSchema", rename = "Coins") )] #[derive( - borsh::BorshDeserialize, borsh::BorshSerialize, Debug, PartialEq, Clone, Serialize, Deserialize, + borsh::BorshDeserialize, + borsh::BorshSerialize, + Debug, + Clone, + Serialize, + Deserialize, + PartialEq, + Eq, )] pub struct Coins { /// An `amount` of coins stored. diff --git a/module-system/module-implementations/sov-chain-state/src/genesis.rs b/module-system/module-implementations/sov-chain-state/src/genesis.rs index 248c39e43..3f0e0b804 100644 --- a/module-system/module-implementations/sov-chain-state/src/genesis.rs +++ b/module-system/module-implementations/sov-chain-state/src/genesis.rs @@ -1,7 +1,18 @@ use anyhow::Result; +use serde::{Deserialize, Serialize}; use sov_modules_api::WorkingSet; +use sov_rollup_interface::da::Time; -use crate::ChainState; +use crate::{ChainState, TransitionHeight}; + +/// Initial configuration of the chain state +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] +pub struct ChainStateConfig { + /// Initial slot height + pub initial_slot_height: TransitionHeight, + /// The time at genesis + pub current_time: Time, +} impl ChainState { pub(crate) fn init_module( diff --git a/module-system/module-implementations/sov-chain-state/src/lib.rs b/module-system/module-implementations/sov-chain-state/src/lib.rs index ea8647628..7136cfdc6 100644 --- a/module-system/module-implementations/sov-chain-state/src/lib.rs +++ b/module-system/module-implementations/sov-chain-state/src/lib.rs @@ -2,12 +2,13 @@ #![doc = include_str!("../README.md")] /// Contains the call methods used by the module -pub mod call; +mod call; +pub use call::*; #[cfg(test)] mod tests; -/// Genesis state configuration -pub mod genesis; +mod genesis; +pub use genesis::*; /// Hook implementation for the module pub mod hooks; @@ -148,15 +149,6 @@ pub struct ChainState genesis_height: sov_modules_api::StateValue, } -/// Initial configuration of the chain state -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] -pub struct ChainStateConfig { - /// Initial slot height - pub initial_slot_height: TransitionHeight, - /// The time at genesis - pub current_time: Time, -} - impl ChainState { /// Returns transition height in the current slot pub fn get_slot_height(&self, working_set: &mut WorkingSet) -> TransitionHeight { diff --git a/module-system/module-implementations/sov-evm/src/call.rs b/module-system/module-implementations/sov-evm/src/call.rs index 09bbf879b..b2ab7a87d 100644 --- a/module-system/module-implementations/sov-evm/src/call.rs +++ b/module-system/module-implementations/sov-evm/src/call.rs @@ -110,7 +110,7 @@ pub(crate) fn get_cfg_env( cfg: EvmChainConfig, template_cfg: Option, ) -> CfgEnv { - let mut cfg_env = template_cfg.unwrap_or(CfgEnv::default()); + let mut cfg_env = template_cfg.unwrap_or_default(); cfg_env.chain_id = cfg.chain_id; cfg_env.spec_id = get_spec_id(cfg.spec, block_env.number); cfg_env.limit_contract_code_size = cfg.limit_contract_code_size; diff --git a/module-system/module-implementations/sov-evm/src/evm/db.rs b/module-system/module-implementations/sov-evm/src/evm/db.rs index 5f7705d27..b9706eecb 100644 --- a/module-system/module-implementations/sov-evm/src/evm/db.rs +++ b/module-system/module-implementations/sov-evm/src/evm/db.rs @@ -41,7 +41,7 @@ impl<'a, C: sov_modules_api::Context> Database for EvmDb<'a, C> { let bytecode = Bytecode::new_raw( self.code .get(&code_hash, self.working_set) - .unwrap_or(Bytes::default()) + .unwrap_or_default() .into(), ); diff --git a/module-system/module-implementations/sov-evm/src/evm/db_commit.rs b/module-system/module-implementations/sov-evm/src/evm/db_commit.rs index 7d5219d6a..bc8e92c54 100644 --- a/module-system/module-implementations/sov-evm/src/evm/db_commit.rs +++ b/module-system/module-implementations/sov-evm/src/evm/db_commit.rs @@ -7,8 +7,6 @@ use super::DbAccount; impl<'a, C: sov_modules_api::Context> DatabaseCommit for EvmDb<'a, C> { fn commit(&mut self, changes: HashMap) { for (address, account) in changes { - let address = address; - // TODO figure out what to do when account is destroyed. // https://github.com/Sovereign-Labs/sovereign-sdk/issues/425 if account.is_selfdestructed() { diff --git a/module-system/module-implementations/sov-evm/src/evm/tests.rs b/module-system/module-implementations/sov-evm/src/evm/tests.rs index a5778ec3f..b66a26644 100644 --- a/module-system/module-implementations/sov-evm/src/evm/tests.rs +++ b/module-system/module-implementations/sov-evm/src/evm/tests.rs @@ -1,7 +1,6 @@ use std::convert::Infallible; use reth_primitives::TransactionKind; -use revm::db::CacheDB; use revm::precompile::B160; use revm::primitives::{CfgEnv, ExecutionResult, Output, SpecId, KECCAK_EMPTY, U256}; use revm::{Database, DatabaseCommit}; @@ -14,20 +13,10 @@ use super::executor; use crate::evm::primitive_types::BlockEnv; use crate::evm::AccountInfo; use crate::smart_contracts::SimpleStorageContract; -use crate::tests::dev_signer::TestSigner; +use crate::tests::test_signer::TestSigner; use crate::Evm; type C = sov_modules_api::default_context::DefaultContext; -pub(crate) fn output(result: ExecutionResult) -> bytes::Bytes { - match result { - ExecutionResult::Success { output, .. } => match output { - Output::Call(out) => out, - Output::Create(out, _) => out, - }, - _ => panic!("Expected successful ExecutionResult"), - } -} - #[test] fn simple_contract_execution_sov_state() { let tmpdir = tempfile::tempdir().unwrap(); @@ -40,12 +29,6 @@ fn simple_contract_execution_sov_state() { simple_contract_execution(evm_db); } -#[test] -fn simple_contract_execution_in_memory_state() { - let db = CacheDB::default(); - simple_contract_execution(db); -} - fn simple_contract_execution + DatabaseCommit + InitEvmDb>( mut evm_db: DB, ) { @@ -148,3 +131,13 @@ fn contract_address(result: &ExecutionResult) -> Option { _ => None, } } + +fn output(result: ExecutionResult) -> bytes::Bytes { + match result { + ExecutionResult::Success { output, .. } => match output { + Output::Call(out) => out, + Output::Create(out, _) => out, + }, + _ => panic!("Expected successful ExecutionResult"), + } +} diff --git a/module-system/module-implementations/sov-evm/src/genesis.rs b/module-system/module-implementations/sov-evm/src/genesis.rs index bebd4c6ae..b61269302 100644 --- a/module-system/module-implementations/sov-evm/src/genesis.rs +++ b/module-system/module-implementations/sov-evm/src/genesis.rs @@ -1,6 +1,8 @@ +use std::collections::HashMap; + use anyhow::Result; use reth_primitives::constants::{EMPTY_RECEIPTS, EMPTY_TRANSACTIONS}; -use reth_primitives::{Bloom, Bytes, EMPTY_OMMER_ROOT, H256, KECCAK_EMPTY, U256}; +use reth_primitives::{Address, Bloom, Bytes, EMPTY_OMMER_ROOT, H256, KECCAK_EMPTY, U256}; use revm::primitives::SpecId; use sov_modules_api::WorkingSet; @@ -9,6 +11,75 @@ use crate::evm::primitive_types::Block; use crate::evm::{AccountInfo, EvmChainConfig}; use crate::Evm; +/// Evm account. +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, Eq, PartialEq)] +pub struct AccountData { + /// Account address. + pub address: Address, + /// Account balance. + pub balance: U256, + /// Code hash. + pub code_hash: H256, + /// Smart contract code. + pub code: Bytes, + /// Account nonce. + pub nonce: u64, +} + +impl AccountData { + /// Empty code hash. + pub fn empty_code() -> H256 { + KECCAK_EMPTY + } + + /// Account balance. + pub fn balance(balance: u64) -> U256 { + U256::from(balance) + } +} + +/// Genesis configuration. +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, Eq, PartialEq)] +pub struct EvmConfig { + /// Genesis accounts. + pub data: Vec, + /// Chain id. + pub chain_id: u64, + /// Limits size of contract code size. + pub limit_contract_code_size: Option, + /// List of EVM hardforks by block number + pub spec: HashMap, + /// Coinbase where all the fees go + pub coinbase: Address, + /// Starting base fee. + pub starting_base_fee: u64, + /// Gas limit for single block + pub block_gas_limit: u64, + /// Genesis timestamp. + pub genesis_timestamp: u64, + /// Delta to add to parent block timestamp, + pub block_timestamp_delta: u64, + /// Base fee params. + pub base_fee_params: reth_primitives::BaseFeeParams, +} + +impl Default for EvmConfig { + fn default() -> Self { + Self { + data: vec![], + chain_id: 1, + limit_contract_code_size: None, + spec: vec![(0, SpecId::SHANGHAI)].into_iter().collect(), + coinbase: Address::zero(), + starting_base_fee: reth_primitives::constants::MIN_PROTOCOL_BASE_FEE, + block_gas_limit: reth_primitives::constants::ETHEREUM_BLOCK_GAS_LIMIT, + block_timestamp_delta: reth_primitives::constants::SLOT_DURATION.as_secs(), + genesis_timestamp: 0, + base_fee_params: reth_primitives::BaseFeeParams::ethereum(), + } + } +} + impl Evm { pub(crate) fn init_module( &self, @@ -105,3 +176,61 @@ impl Evm { Ok(()) } } + +#[cfg(test)] +mod tests { + use std::str::FromStr; + + use reth_primitives::Bytes; + use revm::primitives::{Address, SpecId}; + + use crate::{AccountData, EvmConfig}; + + #[test] + fn test_config_serialization() { + let address = Address::from_str("0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266").unwrap(); + let config = EvmConfig { + data: vec![AccountData { + address, + balance: AccountData::balance(u64::MAX), + code_hash: AccountData::empty_code(), + code: Bytes::default(), + nonce: 0, + }], + chain_id: 1, + limit_contract_code_size: None, + spec: vec![(0, SpecId::SHANGHAI)].into_iter().collect(), + block_timestamp_delta: 1u64, + ..Default::default() + }; + + let data = r#" + { + "data":[ + { + "address":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "balance":"0xffffffffffffffff", + "code_hash":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "code":"0x", + "nonce":0 + }], + "chain_id":1, + "limit_contract_code_size":null, + "spec":{ + "0":"SHANGHAI" + }, + "coinbase":"0x0000000000000000000000000000000000000000", + "starting_base_fee":7, + "block_gas_limit":30000000, + "genesis_timestamp":0, + "block_timestamp_delta":1, + "base_fee_params":{ + "max_change_denominator":8, + "elasticity_multiplier":2 + } + }"#; + + let parsed_config: EvmConfig = serde_json::from_str(data).unwrap(); + assert_eq!(config, parsed_config) + } +} diff --git a/module-system/module-implementations/sov-evm/src/hooks.rs b/module-system/module-implementations/sov-evm/src/hooks.rs index ad0c28427..8beeb5f50 100644 --- a/module-system/module-implementations/sov-evm/src/hooks.rs +++ b/module-system/module-implementations/sov-evm/src/hooks.rs @@ -1,4 +1,4 @@ -use reth_primitives::{Bloom, Bytes, U256}; +use reth_primitives::{Bloom, Bytes, H256, U256}; use sov_modules_api::{AccessoryWorkingSet, Spec, WorkingSet}; use sov_state::Storage; @@ -11,15 +11,19 @@ where ::Root: Into<[u8; 32]>, { /// Logic executed at the beginning of the slot. Here we set the root hash of the previous head. - pub fn begin_slot_hook(&self, da_root_hash: [u8; 32], working_set: &mut WorkingSet) { - let parent_block = self + pub fn begin_slot_hook( + &self, + da_root_hash: [u8; 32], + pre_state_root: &<::Storage as Storage>::Root, + working_set: &mut WorkingSet, + ) { + let mut parent_block = self .head .get(working_set) .expect("Head block should always be set"); - // TODO - // parent_block.header.state_root = root_hash.into(); - // self.head.set(&parent_block, working_set); + parent_block.header.state_root = H256(pre_state_root.clone().into()); + self.head.set(&parent_block, working_set); let cfg = self.cfg.get(working_set).unwrap_or_default(); let new_pending_env = BlockEnv { diff --git a/module-system/module-implementations/sov-evm/src/lib.rs b/module-system/module-implementations/sov-evm/src/lib.rs index a503d7fed..1d989456a 100644 --- a/module-system/module-implementations/sov-evm/src/lib.rs +++ b/module-system/module-implementations/sov-evm/src/lib.rs @@ -28,16 +28,14 @@ pub use smart_contracts::SimpleStorageContract; #[cfg(test)] mod tests; #[cfg(feature = "experimental")] -pub use experimental::{AccountData, Evm, EvmConfig}; +pub use experimental::Evm; #[cfg(feature = "experimental")] pub use revm::primitives::SpecId; #[cfg(feature = "experimental")] mod experimental { - use std::collections::HashMap; - use reth_primitives::{Address, Bytes, H256}; - use revm::primitives::{SpecId, KECCAK_EMPTY, U256}; + use reth_primitives::Address; use sov_modules_api::{Error, ModuleInfo, WorkingSet}; use sov_state::codec::BcsCodec; @@ -46,86 +44,18 @@ mod experimental { use crate::evm::primitive_types::{ Block, BlockEnv, Receipt, SealedBlock, TransactionSignedAndRecovered, }; + use crate::EvmConfig; // Gas per transaction not creating a contract. pub(crate) const MIN_TRANSACTION_GAS: u64 = 21_000u64; pub(crate) const MIN_CREATE_GAS: u64 = 53_000u64; - /// Evm account. - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize, Eq, PartialEq)] - pub struct AccountData { - /// Account address. - pub address: Address, - /// Account balance. - pub balance: U256, - /// Code hash. - pub code_hash: H256, - /// Smart contract code. - pub code: Bytes, - /// Account nonce. - pub nonce: u64, - } - - impl AccountData { - /// Empty code hash. - pub fn empty_code() -> H256 { - KECCAK_EMPTY - } - - /// Account balance. - pub fn balance(balance: u64) -> U256 { - U256::from(balance) - } - } - - /// Genesis configuration. - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize, Eq, PartialEq)] - pub struct EvmConfig { - /// Genesis accounts. - pub data: Vec, - /// Chain id. - pub chain_id: u64, - /// Limits size of contract code size. - pub limit_contract_code_size: Option, - /// List of EVM hardforks by block number - pub spec: HashMap, - /// Coinbase where all the fees go - pub coinbase: Address, - /// Starting base fee. - pub starting_base_fee: u64, - /// Gas limit for single block - pub block_gas_limit: u64, - /// Genesis timestamp. - pub genesis_timestamp: u64, - /// Delta to add to parent block timestamp, - pub block_timestamp_delta: u64, - /// Base fee params. - pub base_fee_params: reth_primitives::BaseFeeParams, - } - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] pub(crate) struct PendingTransaction { pub(crate) transaction: TransactionSignedAndRecovered, pub(crate) receipt: Receipt, } - impl Default for EvmConfig { - fn default() -> Self { - Self { - data: vec![], - chain_id: 1, - limit_contract_code_size: None, - spec: vec![(0, SpecId::SHANGHAI)].into_iter().collect(), - coinbase: Address::zero(), - starting_base_fee: reth_primitives::constants::MIN_PROTOCOL_BASE_FEE, - block_gas_limit: reth_primitives::constants::ETHEREUM_BLOCK_GAS_LIMIT, - block_timestamp_delta: reth_primitives::constants::SLOT_DURATION.as_secs(), - genesis_timestamp: 0, - base_fee_params: reth_primitives::BaseFeeParams::ethereum(), - } - } - } - /// The sov-evm module provides compatibility with the EVM. #[allow(dead_code)] // #[cfg_attr(feature = "native", derive(sov_modules_api::ModuleCallJsonSchema))] diff --git a/module-system/module-implementations/sov-evm/src/tests/call_tests.rs b/module-system/module-implementations/sov-evm/src/tests/call_tests.rs index 17a8c78a4..0dc6cb766 100644 --- a/module-system/module-implementations/sov-evm/src/tests/call_tests.rs +++ b/module-system/module-implementations/sov-evm/src/tests/call_tests.rs @@ -1,59 +1,20 @@ use reth_primitives::{Address, Bytes, TransactionKind}; use revm::primitives::{SpecId, KECCAK_EMPTY, U256}; use sov_modules_api::default_context::DefaultContext; -use sov_modules_api::default_signature::private_key::DefaultPrivateKey; -use sov_modules_api::{Context, Module, Spec}; -#[cfg(test)] -use sov_modules_api::{PrivateKey, PublicKey}; +use sov_modules_api::utils::generate_address; +use sov_modules_api::{Context, Module}; use crate::call::CallMessage; use crate::evm::primitive_types::Receipt; use crate::smart_contracts::SimpleStorageContract; -use crate::tests::dev_signer::TestSigner; use crate::tests::genesis_tests::get_evm; +use crate::tests::test_signer::TestSigner; use crate::{AccountData, EvmConfig}; type C = DefaultContext; -fn create_messages( - contract_addr: Address, - set_arg: u32, - dev_signer: TestSigner, - create_contract: bool, -) -> Vec { - let mut transactions = Vec::default(); - let contract = SimpleStorageContract::default(); - let mut nonce = 0; - - // Contract creation. - if create_contract { - let signed_tx = dev_signer - .sign_default_transaction(TransactionKind::Create, contract.byte_code().to_vec(), 0) - .unwrap(); - - transactions.push(CallMessage { tx: signed_tx }); - nonce += 1; - } - - // Update contract state. - { - let signed_tx = dev_signer - .sign_default_transaction( - TransactionKind::Call(contract_addr), - hex::decode(hex::encode(&contract.set_call_data(set_arg))).unwrap(), - nonce, - ) - .unwrap(); - - transactions.push(CallMessage { tx: signed_tx }); - } - - transactions -} - #[test] -fn evm_test() { +fn call_test() { let dev_signer: TestSigner = TestSigner::new_random(); - let config = EvmConfig { data: vec![AccountData { address: dev_signer.address(), @@ -69,7 +30,6 @@ fn evm_test() { }; let (evm, mut working_set) = get_evm(&config); - let working_set = &mut working_set; let contract_addr: Address = Address::from_slice( hex::decode("819c5497b157177315e1204f52e588b393771719") @@ -77,23 +37,28 @@ fn evm_test() { .as_slice(), ); - evm.begin_slot_hook([5u8; 32], working_set); + evm.begin_slot_hook([5u8; 32], &[10u8; 32].into(), &mut working_set); let set_arg = 999; - let sender_context = C::new( - DefaultPrivateKey::generate() - .pub_key() - .to_address::<::Address>(), - ); - - for tx in create_messages(contract_addr, set_arg, dev_signer, true) { - evm.call(tx, &sender_context, working_set).unwrap(); + { + let sender_address = generate_address::("sender"); + let context = C::new(sender_address); + + let messages = vec![ + create_contract_message(&dev_signer, 0), + set_arg_message(contract_addr, &dev_signer, 1, set_arg), + ]; + for tx in messages { + evm.call(tx, &context, &mut working_set).unwrap(); + } } + evm.end_slot_hook(&mut working_set); - evm.end_slot_hook(working_set); - - let db_account = evm.accounts.get(&contract_addr, working_set).unwrap(); - let storage_value = db_account.storage.get(&U256::ZERO, working_set).unwrap(); + let db_account = evm.accounts.get(&contract_addr, &mut working_set).unwrap(); + let storage_value = db_account + .storage + .get(&U256::ZERO, &mut working_set) + .unwrap(); assert_eq!(U256::from(set_arg), storage_value); assert_eq!( @@ -130,29 +95,19 @@ fn evm_test() { #[test] fn failed_transaction_test() { let dev_signer: TestSigner = TestSigner::new_random(); - let (evm, mut working_set) = get_evm(&EvmConfig::default()); let working_set = &mut working_set; - let contract_addr: Address = Address::from_slice( - hex::decode("819c5497b157177315e1204f52e588b393771719") - .unwrap() - .as_slice(), - ); - - evm.begin_slot_hook([5u8; 32], working_set); - - let set_arg = 999; - let sender_context = C::new( - DefaultPrivateKey::generate() - .pub_key() - .to_address::<::Address>(), - ); + evm.begin_slot_hook([5u8; 32], &[10u8; 32].into(), working_set); + { + let sender_address = generate_address::("sender"); + let context = C::new(sender_address); + let messages = vec![create_contract_message(&dev_signer, 0)]; - for tx in create_messages(contract_addr, set_arg, dev_signer, false) { - evm.call(tx, &sender_context, working_set).unwrap(); + for tx in messages { + evm.call(tx, &context, working_set).unwrap(); + } } - evm.end_slot_hook(working_set); assert_eq!( @@ -177,3 +132,33 @@ fn failed_transaction_test() { }] ) } + +fn create_contract_message(dev_signer: &TestSigner, nonce: u64) -> CallMessage { + let contract = SimpleStorageContract::default(); + let signed_tx = dev_signer + .sign_default_transaction( + TransactionKind::Create, + contract.byte_code().to_vec(), + nonce, + ) + .unwrap(); + CallMessage { tx: signed_tx } +} + +fn set_arg_message( + contract_addr: Address, + dev_signer: &TestSigner, + nonce: u64, + set_arg: u32, +) -> CallMessage { + let contract = SimpleStorageContract::default(); + let signed_tx = dev_signer + .sign_default_transaction( + TransactionKind::Call(contract_addr), + hex::decode(hex::encode(&contract.set_call_data(set_arg))).unwrap(), + nonce, + ) + .unwrap(); + + CallMessage { tx: signed_tx } +} diff --git a/module-system/module-implementations/sov-evm/src/tests/config_tests.rs b/module-system/module-implementations/sov-evm/src/tests/config_tests.rs deleted file mode 100644 index 1d6fd9629..000000000 --- a/module-system/module-implementations/sov-evm/src/tests/config_tests.rs +++ /dev/null @@ -1,54 +0,0 @@ -use std::str::FromStr; - -use reth_primitives::{Address, Bytes}; -use revm::primitives::SpecId; - -use crate::{AccountData, EvmConfig}; - -#[test] -fn test_config_serialization() { - let address = Address::from_str("0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266").unwrap(); - let config = EvmConfig { - data: vec![AccountData { - address, - balance: AccountData::balance(u64::MAX), - code_hash: AccountData::empty_code(), - code: Bytes::default(), - nonce: 0, - }], - chain_id: 1, - limit_contract_code_size: None, - spec: vec![(0, SpecId::SHANGHAI)].into_iter().collect(), - block_timestamp_delta: 1u64, - ..Default::default() - }; - - let data = r#" - { - "data":[ - { - "address":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "balance":"0xffffffffffffffff", - "code_hash":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "code":"0x", - "nonce":0 - }], - "chain_id":1, - "limit_contract_code_size":null, - "spec":{ - "0":"SHANGHAI" - }, - "coinbase":"0x0000000000000000000000000000000000000000", - "starting_base_fee":7, - "block_gas_limit":30000000, - "genesis_timestamp":0, - "block_timestamp_delta":1, - "base_fee_params":{ - "max_change_denominator":8, - "elasticity_multiplier":2 - } - }"#; - - let parsed_config: EvmConfig = serde_json::from_str(data).unwrap(); - assert_eq!(config, parsed_config) -} diff --git a/module-system/module-implementations/sov-evm/src/tests/genesis_tests.rs b/module-system/module-implementations/sov-evm/src/tests/genesis_tests.rs index 669c5e86f..275ff2f83 100644 --- a/module-system/module-implementations/sov-evm/src/tests/genesis_tests.rs +++ b/module-system/module-implementations/sov-evm/src/tests/genesis_tests.rs @@ -41,10 +41,6 @@ pub(crate) const GENESIS_HASH: H256 = H256(hex!( "3441c3084e43183a53aabbbe3e94512bb3db4aca826af8f23b38f0613811571d" )); -pub(crate) const SEALED_GENESIS_HASH: H256 = H256(hex!( - "d57423e4375c45bc114cd137146aab671dbd3f6304f05b31bdd416301b4a99f0" -)); - pub(crate) const GENESIS_STATE_ROOT: H256 = H256(hex!( "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" )); @@ -136,6 +132,7 @@ fn genesis_block() { .block_hashes .get(&GENESIS_HASH, &mut accessory_state) .unwrap(); + let block = evm .blocks .get(block_number as usize, &mut accessory_state) @@ -181,7 +178,6 @@ fn genesis_block() { #[test] fn genesis_head() { let (evm, mut working_set) = get_evm(&TEST_CONFIG); - let head = evm.head.get(&mut working_set).unwrap(); assert_eq!( @@ -220,6 +216,5 @@ pub(crate) fn get_evm(config: &EvmConfig) -> (Evm, WorkingSet let evm = Evm::::default(); evm.genesis(config, &mut working_set).unwrap(); evm.finalize_hook(&[10u8; 32].into(), &mut working_set.accessory_state()); - (evm, working_set) } diff --git a/module-system/module-implementations/sov-evm/src/tests/hooks_tests.rs b/module-system/module-implementations/sov-evm/src/tests/hooks_tests.rs index 35174c414..d6b3e2388 100644 --- a/module-system/module-implementations/sov-evm/src/tests/hooks_tests.rs +++ b/module-system/module-implementations/sov-evm/src/tests/hooks_tests.rs @@ -10,7 +10,7 @@ use crate::evm::primitive_types::{ Block, BlockEnv, Receipt, SealedBlock, TransactionSignedAndRecovered, }; use crate::experimental::PendingTransaction; -use crate::tests::genesis_tests::{BENEFICIARY, SEALED_GENESIS_HASH}; +use crate::tests::genesis_tests::{BENEFICIARY, GENESIS_HASH}; lazy_static! { pub(crate) static ref DA_ROOT_HASH: H256 = H256::from([5u8; 32]); @@ -19,7 +19,7 @@ lazy_static! { #[test] fn begin_slot_hook_creates_pending_block() { let (evm, mut working_set) = get_evm(&TEST_CONFIG); - evm.begin_slot_hook(DA_ROOT_HASH.0, &mut working_set); + evm.begin_slot_hook(DA_ROOT_HASH.0, &[10u8; 32].into(), &mut working_set); let pending_block = evm.block_env.get(&mut working_set).unwrap(); assert_eq!( pending_block, @@ -37,7 +37,7 @@ fn begin_slot_hook_creates_pending_block() { #[test] fn end_slot_hook_sets_head() { let (evm, mut working_set) = get_evm(&TEST_CONFIG); - evm.begin_slot_hook(DA_ROOT_HASH.0, &mut working_set); + evm.begin_slot_hook(DA_ROOT_HASH.0, &[10u8; 32].into(), &mut working_set); evm.pending_transactions.push( &create_pending_transaction(H256::from([1u8; 32]), 1), @@ -62,10 +62,8 @@ fn end_slot_hook_sets_head() { Block { header: Header { // TODO: temp parent hash until: https://github.com/Sovereign-Labs/sovereign-sdk/issues/876 - // parent_hash: GENESIS_HASH, - parent_hash: H256(hex!( - "d57423e4375c45bc114cd137146aab671dbd3f6304f05b31bdd416301b4a99f0" - )), + parent_hash: GENESIS_HASH, + ommers_hash: EMPTY_OMMER_ROOT, beneficiary: TEST_CONFIG.coinbase, state_root: KECCAK_EMPTY, @@ -98,7 +96,7 @@ fn end_slot_hook_sets_head() { #[test] fn end_slot_hook_moves_transactions_and_receipts() { let (evm, mut working_set) = get_evm(&TEST_CONFIG); - evm.begin_slot_hook(DA_ROOT_HASH.0, &mut working_set); + evm.begin_slot_hook(DA_ROOT_HASH.0, &[10u8; 32].into(), &mut working_set); let tx1 = create_pending_transaction(H256::from([1u8; 32]), 1); evm.pending_transactions.push(&tx1, &mut working_set); @@ -180,7 +178,8 @@ fn create_pending_transaction(hash: H256, index: u64) -> PendingTransaction { #[test] fn finalize_hook_creates_final_block() { let (evm, mut working_set) = get_evm(&TEST_CONFIG); - evm.begin_slot_hook(DA_ROOT_HASH.0, &mut working_set); + let p = [10u8; 32].into(); + evm.begin_slot_hook(DA_ROOT_HASH.0, &p, &mut working_set); evm.pending_transactions.push( &create_pending_transaction(H256::from([1u8; 32]), 1), &mut working_set, @@ -191,12 +190,18 @@ fn finalize_hook_creates_final_block() { ); evm.end_slot_hook(&mut working_set); - let mut accessory_state = working_set.accessory_state(); let root_hash = [99u8; 32].into(); - evm.finalize_hook(&root_hash, &mut accessory_state); + let mut accessory_state = working_set.accessory_state(); + evm.finalize_hook(&root_hash, &mut accessory_state); assert_eq!(evm.blocks.len(&mut accessory_state), 2); + evm.begin_slot_hook(DA_ROOT_HASH.0, &root_hash, &mut working_set); + + let mut accessory_state = working_set.accessory_state(); + + let parent_block = evm.blocks.get(0usize, &mut accessory_state).unwrap(); + let parent_hash = parent_block.header.hash; let block = evm.blocks.get(1usize, &mut accessory_state).unwrap(); assert_eq!( @@ -204,7 +209,7 @@ fn finalize_hook_creates_final_block() { SealedBlock { header: SealedHeader { header: Header { - parent_hash: SEALED_GENESIS_HASH, + parent_hash, ommers_hash: EMPTY_OMMER_ROOT, beneficiary: TEST_CONFIG.coinbase, state_root: H256::from(root_hash.0), @@ -232,7 +237,7 @@ fn finalize_hook_creates_final_block() { parent_beacon_block_root: None, }, hash: H256(hex!( - "0da4e80c5cbd00d9538cb0215d069bfee5be5b59ae4da00244f9b8db429e6889" + "38cd68642013a65c7fdeea92f9f0e1b5709156ac9140f00ffb182c7a605337b0" )), }, transactions: 0..2 diff --git a/module-system/module-implementations/sov-evm/src/tests/mod.rs b/module-system/module-implementations/sov-evm/src/tests/mod.rs index da5a19d50..4b4ef156d 100644 --- a/module-system/module-implementations/sov-evm/src/tests/mod.rs +++ b/module-system/module-implementations/sov-evm/src/tests/mod.rs @@ -1,7 +1,6 @@ mod call_tests; mod cfg_tests; -mod config_tests; -pub(crate) mod dev_signer; mod genesis_tests; mod hooks_tests; +pub(crate) mod test_signer; mod tx_tests; diff --git a/module-system/module-implementations/sov-evm/src/tests/dev_signer.rs b/module-system/module-implementations/sov-evm/src/tests/test_signer.rs similarity index 100% rename from module-system/module-implementations/sov-evm/src/tests/dev_signer.rs rename to module-system/module-implementations/sov-evm/src/tests/test_signer.rs diff --git a/module-system/module-implementations/sov-nft-module/Cargo.toml b/module-system/module-implementations/sov-nft-module/Cargo.toml index d1f4e0d9f..52580646d 100644 --- a/module-system/module-implementations/sov-nft-module/Cargo.toml +++ b/module-system/module-implementations/sov-nft-module/Cargo.toml @@ -23,7 +23,7 @@ sov-modules-macros = {path = "../../sov-modules-macros"} sov-state = { path = "../../sov-state" } postgres = { version = "0.19.7", optional = true } -tokio = { version = "1.32.0", features=["full"], optional = true } +tokio = { version = "1.33.0", features=["full"], optional = true } tracing = { workspace = true, optional = true } [dev-dependencies] diff --git a/module-system/module-implementations/sov-nft-module/offchain_readme.md b/module-system/module-implementations/sov-nft-module/offchain_readme.md index 3a4345ddf..63e091ef6 100644 --- a/module-system/module-implementations/sov-nft-module/offchain_readme.md +++ b/module-system/module-implementations/sov-nft-module/offchain_readme.md @@ -53,8 +53,8 @@ rm -rf demo_data; POSTGRES_CONNECTION_STRING="postgresql://username:password@loc * `--da-layer mock` is used to run an in-memory local DA layer * Run the NFT minting script ```bash -$ cd sovereign/utils/nft-utils -$ cargo run +$ cd sovereign/examples/demo-rollup +$ cargo run --bin sov-nft-script ``` * The above script creates 3 NFT collections, mints some NFTs to each collection * The tables can be explored by connecting to postgres and running sample queries from above \ No newline at end of file diff --git a/module-system/module-implementations/sov-nft-module/src/genesis.rs b/module-system/module-implementations/sov-nft-module/src/genesis.rs index d02ce6320..17efc5324 100644 --- a/module-system/module-implementations/sov-nft-module/src/genesis.rs +++ b/module-system/module-implementations/sov-nft-module/src/genesis.rs @@ -1 +1,24 @@ +use serde::{Deserialize, Serialize}; // no genesis for this module + +/// Config for the NonFungibleToken module. +/// Sets admin and existing owners. +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] +pub struct NonFungibleTokenConfig {} + +#[cfg(test)] +mod tests { + use crate::NonFungibleTokenConfig; + #[test] + fn test_config_serialization() { + let config = NonFungibleTokenConfig {}; + + let data = r#" + { + + }"#; + + let parsed_config: NonFungibleTokenConfig = serde_json::from_str(data).unwrap(); + assert_eq!(config, parsed_config) + } +} diff --git a/module-system/module-implementations/sov-nft-module/src/lib.rs b/module-system/module-implementations/sov-nft-module/src/lib.rs index b1d26129b..793e9e3e8 100644 --- a/module-system/module-implementations/sov-nft-module/src/lib.rs +++ b/module-system/module-implementations/sov-nft-module/src/lib.rs @@ -2,10 +2,11 @@ #![doc = include_str!("../README.md")] mod call; -pub use call::CallMessage; +pub use call::*; mod address; mod genesis; pub use address::*; +pub use genesis::*; mod collection; use collection::*; mod nft; @@ -14,7 +15,6 @@ use nft::*; mod query; #[cfg(feature = "native")] pub use query::*; -use serde::{Deserialize, Serialize}; use sov_modules_api::{CallResponse, Context, Error, Module, ModuleInfo, StateMap, WorkingSet}; mod offchain; #[cfg(feature = "offchain")] @@ -40,11 +40,6 @@ pub struct NonFungibleToken { nfts: StateMap, Nft>, } -/// Config for the NonFungibleToken module. -/// Sets admin and existing owners. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct NonFungibleTokenConfig {} - impl Module for NonFungibleToken { type Context = C; diff --git a/module-system/module-implementations/sov-nft-module/src/utils.rs b/module-system/module-implementations/sov-nft-module/src/utils.rs index 584772fab..bf174ee69 100644 --- a/module-system/module-implementations/sov-nft-module/src/utils.rs +++ b/module-system/module-implementations/sov-nft-module/src/utils.rs @@ -1,6 +1,6 @@ use sov_modules_api::digest::Digest; -use crate::CollectionAddress; +use crate::{CallMessage, CollectionAddress, UserAddress}; /// Derives token address from `collection_name`, `sender` pub fn get_collection_address( @@ -14,3 +14,92 @@ pub fn get_collection_address( let hash: [u8; 32] = hasher.finalize().into(); CollectionAddress::new(&C::Address::from(hash)) } + +fn get_collection_metadata_url(base_url: &str, collection_address: &str) -> String { + format!("{}/collection/{}", base_url, collection_address) +} + +fn get_nft_metadata_url(base_url: &str, collection_address: &str, nft_id: u64) -> String { + format!("{}/nft/{}/{}", base_url, collection_address, nft_id) +} + +/// Constructs a CallMessage to create a new NFT collection. +/// +/// # Arguments +/// +/// * `sender_address`: The address of the sender who will sign the transaction. +/// * `collection_name`: Name of the collection to be created. +/// * `base_uri`: Base URI to be used with the collection name +/// +/// # Returns +/// +/// Returns a CallMessage Variant which can then be serialized into a transaction +pub fn get_create_collection_message( + sender_address: &C::Address, + collection_name: &str, + base_uri: &str, +) -> CallMessage { + let collection_address = get_collection_address::(collection_name, sender_address.as_ref()); + + let collection_uri = get_collection_metadata_url(base_uri, &collection_address.to_string()); + CallMessage::::CreateCollection { + name: collection_name.to_string(), + collection_uri, + } +} + +/// Constructs a CallMessage to mint a new NFT. +/// +/// # Arguments +/// +/// * `signer`: The private key used for signing the transaction. +/// * `nonce`: The nonce to be used for the transaction. +/// * `collection_name`: The name of the collection to which the NFT belongs. +/// * `token_id`: The unique identifier for the new NFT. +/// * `owner`: The address of the user to whom the NFT will be minted. +/// +/// # Returns +/// +/// Returns a signed transaction for minting a new NFT to a specified user. +pub fn get_mint_nft_message( + sender_address: &C::Address, + collection_name: &str, + token_id: u64, + base_uri: &str, + owner: &C::Address, +) -> CallMessage { + let collection_address = get_collection_address::(collection_name, sender_address.as_ref()); + let token_uri = get_nft_metadata_url(base_uri, &collection_address.to_string(), token_id); + CallMessage::::MintNft { + collection_name: collection_name.to_string(), + token_uri, + token_id, + owner: UserAddress::new(owner), + frozen: false, + } +} + +/// Constructs a CallMessage to transfer an NFT to another user. +/// +/// # Arguments +/// +/// * `signer`: The private key used for signing the transaction. +/// * `nonce`: The nonce to be used for the transaction. +/// * `collection_address`: The address of the collection to which the NFT belongs. +/// * `token_id`: The unique identifier for the NFT being transferred. +/// * `to`: The address of the user to whom the NFT will be transferred. +/// +/// # Returns +/// +/// Returns a signed transaction for transferring an NFT to a specified user. +pub fn get_transfer_nft_message( + collection_address: &CollectionAddress, + token_id: u64, + to: &C::Address, +) -> CallMessage { + CallMessage::::TransferNft { + collection_address: collection_address.clone(), + token_id, + to: UserAddress::new(to), + } +} diff --git a/module-system/module-implementations/sov-prover-incentives/src/genesis.rs b/module-system/module-implementations/sov-prover-incentives/src/genesis.rs index 732a5d378..cc394a938 100644 --- a/module-system/module-implementations/sov-prover-incentives/src/genesis.rs +++ b/module-system/module-implementations/sov-prover-incentives/src/genesis.rs @@ -1,8 +1,25 @@ use anyhow::Result; -use sov_modules_api::WorkingSet; +use serde::{Deserialize, Serialize}; +use sov_modules_api::{WorkingSet, Zkvm}; use crate::ProverIncentives; +/// Configuration of the prover incentives module. Specifies the +/// address of the bonding token, the minimum bond, the commitment to +/// the allowed verifier method and a set of initial provers with their +/// bonding amount. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProverIncentivesConfig { + /// The address of the token to be used for bonding. + pub bonding_token_address: C::Address, + /// The minimum bond for a prover. + pub minimum_bond: u64, + /// A code commitment to be used for verifying proofs + pub commitment_of_allowed_verifier_method: Vm::CodeCommitment, + /// A list of initial provers and their bonded amount. + pub initial_provers: Vec<(C::Address, u64)>, +} + impl ProverIncentives { /// Init the [`ProverIncentives`] module using the provided `config`. /// Sets the minimum amount necessary to bond, the commitment to the verifier circuit diff --git a/module-system/module-implementations/sov-prover-incentives/src/lib.rs b/module-system/module-implementations/sov-prover-incentives/src/lib.rs index 44cd7414b..c7ae54e20 100644 --- a/module-system/module-implementations/sov-prover-incentives/src/lib.rs +++ b/module-system/module-implementations/sov-prover-incentives/src/lib.rs @@ -9,31 +9,14 @@ mod tests; #[cfg(feature = "native")] mod query; -/// The call methods specified in this module -pub use call::CallMessage; +pub use call::*; +pub use genesis::*; /// The response type used by RPC queries. #[cfg(feature = "native")] pub use query::*; -use serde::{Deserialize, Serialize}; use sov_modules_api::{Context, Error, ModuleInfo, WorkingSet, Zkvm}; use sov_state::codec::BcsCodec; -/// Configuration of the prover incentives module. Specifies the -/// address of the bonding token, the minimum bond, the commitment to -/// the allowed verifier method and a set of initial provers with their -/// bonding amount. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ProverIncentivesConfig { - /// The address of the token to be used for bonding. - bonding_token_address: C::Address, - /// The minimum bond for a prover. - minimum_bond: u64, - /// A code commitment to be used for verifying proofs - commitment_of_allowed_verifier_method: Vm::CodeCommitment, - /// A list of initial provers and their bonded amount. - initial_provers: Vec<(C::Address, u64)>, -} - /// A new module: /// - Must derive `ModuleInfo` /// - Must contain `[address]` field diff --git a/module-system/module-implementations/sov-sequencer-registry/src/genesis.rs b/module-system/module-implementations/sov-sequencer-registry/src/genesis.rs index 4842f7dc7..e8638407a 100644 --- a/module-system/module-implementations/sov-sequencer-registry/src/genesis.rs +++ b/module-system/module-implementations/sov-sequencer-registry/src/genesis.rs @@ -1,8 +1,40 @@ use anyhow::Result; +use serde::{Deserialize, Serialize}; use sov_modules_api::WorkingSet; use crate::SequencerRegistry; +/// Genesis configuration for the [`SequencerRegistry`] module. +/// +/// This `struct` must be passed as an argument to +/// [`Module::genesis`](sov_modules_api::Module::genesis). +/// +// TODO: Should we allow multiple sequencers in genesis? +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] +#[serde(bound = "C::Address: serde::Serialize + serde::de::DeserializeOwned")] +pub struct SequencerConfig { + /// The rollup address of the sequencer. + pub seq_rollup_address: C::Address, + /// The Data Availability (DA) address of the sequencer. + pub seq_da_address: Da::Address, + /// Coins that will be slashed if the sequencer is malicious. + /// + /// The coins will be transferred from + /// [`SequencerConfig::seq_rollup_address`] to this module's address + /// ([`sov_modules_api::ModuleInfo::address`]) and locked away until the sequencer + /// decides to exit (unregister). + /// + /// Only sequencers that are [`SequencerRegistry::is_sender_allowed`] list are + /// allowed to exit. + pub coins_to_lock: sov_bank::Coins, + /// Determines whether this sequencer is *regular* or *preferred*. + /// + /// Batches from the preferred sequencer are always processed first in + /// block, which means the preferred sequencer can guarantee soft + /// confirmation time for transactions. + pub is_preferred_sequencer: bool, +} + impl SequencerRegistry { pub(crate) fn init_module( &self, @@ -23,3 +55,62 @@ impl SequencerRegistry Ok(()) } } + +#[cfg(test)] +mod tests { + use std::str::FromStr; + + use sov_bank::Coins; + use sov_modules_api::default_context::DefaultContext; + use sov_modules_api::{AddressBech32, Spec}; + use sov_rollup_interface::mocks::{MockAddress, MockDaSpec}; + + use crate::SequencerConfig; + + #[test] + fn test_config_serialization() { + let seq_rollup_address: ::Address = AddressBech32::from_str( + "sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94", + ) + .unwrap() + .into(); + + let token_address: ::Address = AddressBech32::from_str( + "sov1zsnx7n2wjvtkr0ttscfgt06pjca3v2e6stxeu49qwynavmk7a8xqlxkkjp", + ) + .unwrap() + .into(); + + let coins = Coins:: { + amount: 50, + token_address, + }; + + let seq_da_addreess = MockAddress::from_str( + "0000000000000000000000000000000000000000000000000000000000000000", + ) + .unwrap(); + + let config = SequencerConfig:: { + seq_rollup_address, + seq_da_address: seq_da_addreess, + coins_to_lock: coins, + is_preferred_sequencer: true, + }; + + let data = r#" + { + "seq_rollup_address":"sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94", + "seq_da_address":"0000000000000000000000000000000000000000000000000000000000000000", + "coins_to_lock":{ + "amount":50, + "token_address":"sov1zsnx7n2wjvtkr0ttscfgt06pjca3v2e6stxeu49qwynavmk7a8xqlxkkjp" + }, + "is_preferred_sequencer":true + }"#; + + let parsed_config: SequencerConfig = + serde_json::from_str(data).unwrap(); + assert_eq!(config, parsed_config) + } +} diff --git a/module-system/module-implementations/sov-sequencer-registry/src/lib.rs b/module-system/module-implementations/sov-sequencer-registry/src/lib.rs index a74447e31..4ca6c8f1b 100644 --- a/module-system/module-implementations/sov-sequencer-registry/src/lib.rs +++ b/module-system/module-implementations/sov-sequencer-registry/src/lib.rs @@ -6,50 +6,18 @@ //! The module implements the [`sov_modules_api::hooks::ApplyBlobHooks`] trait. #![deny(missing_docs)] - mod call; mod genesis; mod hooks; #[cfg(feature = "native")] mod query; - -pub use call::CallMessage; +pub use call::*; +pub use genesis::*; #[cfg(feature = "native")] pub use query::*; -use serde::{Deserialize, Serialize}; use sov_modules_api::{CallResponse, Error, ModuleInfo, StateMap, StateValue, WorkingSet}; use sov_state::codec::BcsCodec; -/// Genesis configuration for the [`SequencerRegistry`] module. -/// -/// This `struct` must be passed as an argument to -/// [`Module::genesis`](sov_modules_api::Module::genesis). -/// -// TODO: Should we allow multiple sequencers in genesis? -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct SequencerConfig { - /// The rollup address of the sequencer. - pub seq_rollup_address: C::Address, - /// The Data Availability (DA) address of the sequencer. - pub seq_da_address: Da::Address, - /// Coins that will be slashed if the sequencer is malicious. - /// - /// The coins will be transferred from - /// [`SequencerConfig::seq_rollup_address`] to this module's address - /// ([`ModuleInfo::address`]) and locked away until the sequencer - /// decides to exit (unregister). - /// - /// Only sequencers that are [`SequencerRegistry::is_sender_allowed`] list are - /// allowed to exit. - pub coins_to_lock: sov_bank::Coins, - /// Determines whether this sequencer is *regular* or *preferred*. - /// - /// Batches from the preferred sequencer are always processed first in - /// block, which means the preferred sequencer can guarantee soft - /// confirmation time for transactions. - pub is_preferred_sequencer: bool, -} - /// The `sov-sequencer-registry` module `struct`. #[cfg_attr(feature = "native", derive(sov_modules_api::ModuleCallJsonSchema))] #[derive(Clone, ModuleInfo)] diff --git a/module-system/sov-modules-api/Cargo.toml b/module-system/sov-modules-api/Cargo.toml index 6e2e256e9..228b3b3a0 100644 --- a/module-system/sov-modules-api/Cargo.toml +++ b/module-system/sov-modules-api/Cargo.toml @@ -19,7 +19,6 @@ sov-first-read-last-write-cache = { path = "../utils/sov-first-read-last-write-c sov-state = { path = "../sov-state", version = "0.2" } sov-rollup-interface = { path = "../../rollup-interface", version = "0.2" } sov-modules-macros = { path = "../sov-modules-macros", version = "0.2", optional = true } -sov-sequencer = { path = "../../full-node/sov-sequencer", version = "0.2", optional = true } serde = { workspace = true } borsh = { workspace = true } thiserror = { workspace = true } @@ -50,16 +49,15 @@ arbitrary = ["dep:arbitrary", "sov-state/arbitrary"] bench = ["sov-zk-cycle-macros", "risc0-zkvm", "risc0-zkvm-platform"] default = ["macros"] native = [ - "serde_json", - "rand", - "schemars", - "ed25519-dalek/default", - "ed25519-dalek/rand_core", - "clap", - "jsonrpsee", - "macros", - "sov-modules-macros/native", - "sov-state/native", - "sov-sequencer", + "serde_json", + "rand", + "schemars", + "ed25519-dalek/default", + "ed25519-dalek/rand_core", + "clap", + "jsonrpsee", + "macros", + "sov-modules-macros/native", + "sov-state/native", ] macros = ["sov-modules-macros"] diff --git a/module-system/sov-modules-api/src/utils.rs b/module-system/sov-modules-api/src/utils.rs index 003e4a858..311104e91 100644 --- a/module-system/sov-modules-api/src/utils.rs +++ b/module-system/sov-modules-api/src/utils.rs @@ -1,4 +1,4 @@ -pub use sov_sequencer::utils::to_jsonrpsee_error_object; +use jsonrpsee::types::ErrorObjectOwned; use crate::{Context, Digest, Spec}; @@ -6,3 +6,11 @@ pub fn generate_address(key: &str) -> ::Address { let hash: [u8; 32] = ::Hasher::digest(key.as_bytes()).into(); C::Address::from(hash) } + +pub fn to_jsonrpsee_error_object(err: impl ToString, message: &str) -> ErrorObjectOwned { + ErrorObjectOwned::owned( + jsonrpsee::types::error::UNKNOWN_ERROR_CODE, + message, + Some(err.to_string()), + ) +} diff --git a/module-system/sov-modules-macros/src/rpc/expose_rpc.rs b/module-system/sov-modules-macros/src/rpc/expose_rpc.rs index 96451b5e3..77bf55479 100644 --- a/module-system/sov-modules-macros/src/rpc/expose_rpc.rs +++ b/module-system/sov-modules-macros/src/rpc/expose_rpc.rs @@ -70,6 +70,7 @@ impl ExposeRpcMacro { let mut rpc_trait_impls = proc_macro2::TokenStream::new(); for field in fields { + let attrs = field.attrs; let ty = match field.ty { syn::Type::Path(type_path) => type_path.clone(), _ => panic!("Expected a path type"), @@ -91,6 +92,7 @@ impl ExposeRpcMacro { syn::Ident::new(&format!("{}RpcServer", &module_ident), module_ident.span()); let merge_operation = quote! { + #(#attrs)* module .merge(#rpc_server_ident:: #field_path_args ::into_rpc(r.clone())) .unwrap(); @@ -99,6 +101,7 @@ impl ExposeRpcMacro { merge_operations.extend(merge_operation); let rpc_trait_impl = quote! { + #(#attrs)* impl #impl_generics #rpc_trait_ident #field_path_args for RpcStorage #ty_generics #where_clause { /// Get a working set on top of the current storage fn get_working_set(&self) -> ::sov_modules_api::WorkingSet<#context_type> diff --git a/rollup-interface/specs/interfaces/da.md b/rollup-interface/specs/interfaces/da.md index 313e4e1db..a3767e52b 100644 --- a/rollup-interface/specs/interfaces/da.md +++ b/rollup-interface/specs/interfaces/da.md @@ -173,7 +173,7 @@ peer network (likely via JSON-RPC requests to a local light node), and for conve which can be efficiently verified in the SNARK. The DA service exists outside of the rollup's state machine, so it will not be proven in-circuit. For this reason, implementers are encouraged to prioritize readability and maintainability over efficiency. -### Method:`extract_relevant_txs` +### Method:`extract_relevant_blobs` - **Usage:** @@ -194,12 +194,12 @@ in-circuit. For this reason, implementers are encouraged to prioritize readabili | ----- | --------------------------- | ------------------------------------------------------------ | | `txs` | `iterable` | A list of L1 transactions ("data blobs"), with their senders | -### Method:`extract_relevant_txs_with_proof` +### Method:`extract_relevant_blobs_with_proof` - **Usage:** - - An adaptation of the `extract_relevant_txs` method designed for use by provers. This method - returns the same list of transactions that would be returned by `extract_relevant_txs`, in addition + - An adaptation of the `extract_relevant_blobs` method designed for use by provers. This method + returns the same list of transactions that would be returned by `extract_relevant_blobs`, in addition to a witness proving the inclusion of these transactions in the DA layer block, and a witness showing the completeness of the provided list. The output of this function is intended to be passed to the `DaVerifier`. diff --git a/rollup-interface/src/node/services/da.rs b/rollup-interface/src/node/services/da.rs index f7bb04f67..11897803e 100644 --- a/rollup-interface/src/node/services/da.rs +++ b/rollup-interface/src/node/services/da.rs @@ -41,7 +41,7 @@ pub trait DaService: Send + Sync + 'static { /// Extract the relevant transactions from a block. For example, this method might return /// all of the blob transactions in rollup's namespace on Celestia. - fn extract_relevant_txs( + fn extract_relevant_blobs( &self, block: &Self::FilteredBlock, ) -> Vec<::BlobTransaction>; @@ -62,7 +62,7 @@ pub trait DaService: Send + Sync + 'static { /// together with a range proof against the root of the namespaced-merkle-tree, demonstrating that the entire /// rollup namespace has been covered. #[allow(clippy::type_complexity)] - async fn extract_relevant_txs_with_proof( + async fn extract_relevant_blobs_with_proof( &self, block: &Self::FilteredBlock, ) -> ( @@ -70,7 +70,7 @@ pub trait DaService: Send + Sync + 'static { ::InclusionMultiProof, ::CompletenessProof, ) { - let relevant_txs = self.extract_relevant_txs(block); + let relevant_txs = self.extract_relevant_blobs(block); let (etx_proofs, rollup_row_proofs) = self .get_extraction_proof(block, relevant_txs.as_slice()) diff --git a/rollup-interface/src/state_machine/mocks/da.rs b/rollup-interface/src/state_machine/mocks/da.rs index d4229fb3c..bc53b88df 100644 --- a/rollup-interface/src/state_machine/mocks/da.rs +++ b/rollup-interface/src/state_machine/mocks/da.rs @@ -1,4 +1,5 @@ use std::fmt::Display; +use std::str::FromStr; #[cfg(feature = "native")] use std::sync::Arc; @@ -19,26 +20,47 @@ use crate::{BasicAddress, RollupAddress}; const JAN_1_2023: i64 = 1672531200; +/// Sequencer DA address used in tests. +pub const MOCK_SEQUENCER_DA_ADDRESS: [u8; 32] = [0u8; 32]; + /// A mock address type used for testing. Internally, this type is standard 32 byte array. #[derive( - Debug, - PartialEq, - Clone, - Eq, - Copy, - serde::Serialize, - serde::Deserialize, - Hash, - Default, - borsh::BorshDeserialize, - borsh::BorshSerialize, + Debug, PartialEq, Clone, Eq, Copy, Hash, Default, borsh::BorshDeserialize, borsh::BorshSerialize, )] pub struct MockAddress { /// Underlying mock address. pub addr: [u8; 32], } -impl core::str::FromStr for MockAddress { +impl serde::Serialize for MockAddress { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + if serializer.is_human_readable() { + serde::Serialize::serialize(&hex::encode(self.addr), serializer) + } else { + serde::Serialize::serialize(&self.addr, serializer) + } + } +} + +impl<'de> serde::Deserialize<'de> for MockAddress { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + if deserializer.is_human_readable() { + let hex_addr: String = serde::Deserialize::deserialize(deserializer)?; + Ok(MockAddress::from_str(&hex_addr).map_err(serde::de::Error::custom)?) + } else { + let addr = <[u8; 32] as serde::Deserialize>::deserialize(deserializer)?; + Ok(MockAddress { addr }) + } + } +} + +impl FromStr for MockAddress { type Err = anyhow::Error; fn from_str(s: &str) -> Result { @@ -325,7 +347,7 @@ impl DaService for MockDaService { self.get_finalized_at(height).await } - fn extract_relevant_txs( + fn extract_relevant_blobs( &self, block: &Self::FilteredBlock, ) -> Vec<::BlobTransaction> { diff --git a/rollup-interface/src/state_machine/mocks/mod.rs b/rollup-interface/src/state_machine/mocks/mod.rs index a489035ea..3afbfd835 100644 --- a/rollup-interface/src/state_machine/mocks/mod.rs +++ b/rollup-interface/src/state_machine/mocks/mod.rs @@ -8,7 +8,7 @@ mod zk_vm; pub use da::MockDaService; pub use da::{ MockAddress, MockBlob, MockBlock, MockBlockHeader, MockDaConfig, MockDaSpec, MockDaVerifier, - MockHash, + MockHash, MOCK_SEQUENCER_DA_ADDRESS, }; pub use validity_condition::{MockValidityCond, MockValidityCondChecker}; pub use zk_vm::{MockCodeCommitment, MockProof, MockZkvm}; diff --git a/utils/nft-utils/Cargo.toml b/utils/nft-utils/Cargo.toml deleted file mode 100644 index 6375f1ee6..000000000 --- a/utils/nft-utils/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "nft-utils" -authors = { workspace = true } -description = "Utils for NFTs" -edition = { workspace = true } -homepage = { workspace = true } -license = { workspace = true } -repository = { workspace = true } -rust-version = { workspace = true } -version = { workspace = true } -readme = "README.md" -resolver = "2" -autotests = false -publish = false - -[dependencies] -borsh = { workspace = true } -tokio = { workspace = true } - -sov-nft-module = { path = "../../module-system/module-implementations/sov-nft-module", features = ["native"]} -sov-sequencer = { path = "../../full-node/sov-sequencer"} -demo-stf = {path = "../../examples/demo-stf"} -sov-rollup-interface = {path = "../../rollup-interface"} - -sov-modules-api = {path = "../../module-system/sov-modules-api", features = ["native"]} diff --git a/utils/nft-utils/src/lib.rs b/utils/nft-utils/src/lib.rs deleted file mode 100644 index bb280d598..000000000 --- a/utils/nft-utils/src/lib.rs +++ /dev/null @@ -1,201 +0,0 @@ -use borsh::ser::BorshSerialize; -use demo_stf::runtime::RuntimeCall; -use sov_modules_api::default_context::DefaultContext; -use sov_modules_api::default_signature::private_key::DefaultPrivateKey; -use sov_modules_api::transaction::Transaction; -use sov_modules_api::{Address, PrivateKey}; -use sov_nft_module::utils::get_collection_address; -use sov_nft_module::{CallMessage, CollectionAddress, UserAddress}; -use sov_rollup_interface::mocks::MockDaSpec; - -fn get_collection_metadata_url(base_url: &str, collection_address: &str) -> String { - format!("{}/collection/{}", base_url, collection_address) -} - -fn get_nft_metadata_url(base_url: &str, collection_address: &str, nft_id: u64) -> String { - format!("{}/nft/{}/{}", base_url, collection_address, nft_id) -} - -/// Convenience and readability wrapper for build_create_collection_transaction -pub fn build_create_collection_transactions( - creator_pk: &DefaultPrivateKey, - start_nonce: &mut u64, - base_uri: &str, - collections: &[&str], -) -> Vec> { - collections - .iter() - .map(|&collection_name| { - let tx = build_create_collection_transaction( - creator_pk, - *start_nonce, - collection_name, - base_uri, - ); - *start_nonce += 1; - tx - }) - .collect() -} - -/// Constructs a transaction to create a new NFT collection. -/// -/// # Arguments -/// -/// * `signer`: The private key used for signing the transaction. -/// * `nonce`: The nonce to be used for the transaction. -/// * `collection_name`: The name of the collection to be created. -/// -/// # Returns -/// -/// Returns a signed transaction for creating a new NFT collection. -pub fn build_create_collection_transaction( - signer: &DefaultPrivateKey, - nonce: u64, - collection_name: &str, - base_uri: &str, -) -> Transaction { - let collection_address = get_collection_address::( - collection_name, - signer.default_address().as_ref(), - ); - - let collection_uri = get_collection_metadata_url(base_uri, &collection_address.to_string()); - let create_collection_message = RuntimeCall::::nft( - CallMessage::::CreateCollection { - name: collection_name.to_string(), - collection_uri, - }, - ); - Transaction::::new_signed_tx( - signer, - create_collection_message.try_to_vec().unwrap(), - nonce, - ) -} - -/// Convenience and readability wrapper for build_mint_nft_transaction -pub fn build_mint_transactions( - creator_pk: &DefaultPrivateKey, - start_nonce: &mut u64, - collection: &str, - start_nft_id: &mut u64, - num: usize, - base_uri: &str, - owner_pk: &DefaultPrivateKey, -) -> Vec> { - (0..num) - .map(|_| { - let tx = build_mint_nft_transaction( - creator_pk, - *start_nonce, - collection, - *start_nft_id, - base_uri, - &owner_pk.default_address(), - ); - *start_nft_id += 1; - *start_nonce += 1; - tx - }) - .collect() -} - -/// Constructs a transaction to mint a new NFT. -/// -/// # Arguments -/// -/// * `signer`: The private key used for signing the transaction. -/// * `nonce`: The nonce to be used for the transaction. -/// * `collection_name`: The name of the collection to which the NFT belongs. -/// * `token_id`: The unique identifier for the new NFT. -/// * `owner`: The address of the user to whom the NFT will be minted. -/// -/// # Returns -/// -/// Returns a signed transaction for minting a new NFT to a specified user. -pub fn build_mint_nft_transaction( - signer: &DefaultPrivateKey, - nonce: u64, - collection_name: &str, - token_id: u64, - base_uri: &str, - owner: &Address, -) -> Transaction { - let collection_address = get_collection_address::( - collection_name, - signer.default_address().as_ref(), - ); - let token_uri = get_nft_metadata_url(base_uri, &collection_address.to_string(), token_id); - let mint_nft_message = - RuntimeCall::::nft(CallMessage::::MintNft { - collection_name: collection_name.to_string(), - token_uri, - token_id, - owner: UserAddress::new(owner), - frozen: false, - }); - Transaction::::new_signed_tx( - signer, - mint_nft_message.try_to_vec().unwrap(), - nonce, - ) -} - -/// Convenience and readability wrapper for build_transfer_nft_transaction -pub fn build_transfer_transactions( - signer: &DefaultPrivateKey, - start_nonce: &mut u64, - collection_address: &CollectionAddress, - nft_ids: Vec, -) -> Vec> { - nft_ids - .into_iter() - .map(|nft_id| { - let new_owner = DefaultPrivateKey::generate().default_address(); - let tx = build_transfer_nft_transaction( - signer, - *start_nonce, - collection_address, - nft_id, - &new_owner, - ); - *start_nonce += 1; - tx - }) - .collect() -} - -/// Constructs a transaction to transfer an NFT to another user. -/// -/// # Arguments -/// -/// * `signer`: The private key used for signing the transaction. -/// * `nonce`: The nonce to be used for the transaction. -/// * `collection_address`: The address of the collection to which the NFT belongs. -/// * `token_id`: The unique identifier for the NFT being transferred. -/// * `to`: The address of the user to whom the NFT will be transferred. -/// -/// # Returns -/// -/// Returns a signed transaction for transferring an NFT to a specified user. -pub fn build_transfer_nft_transaction( - signer: &DefaultPrivateKey, - nonce: u64, - collection_address: &CollectionAddress, - token_id: u64, - to: &Address, -) -> Transaction { - let transfer_message = RuntimeCall::::nft(CallMessage::< - DefaultContext, - >::TransferNft { - collection_address: collection_address.clone(), - token_id, - to: UserAddress::new(to), - }); - Transaction::::new_signed_tx( - signer, - transfer_message.try_to_vec().unwrap(), - nonce, - ) -}