diff --git a/.github/workflows/dependency_audit.yml b/.github/workflows/dependency_audit.yml new file mode 100644 index 0000000..85a4dab --- /dev/null +++ b/.github/workflows/dependency_audit.yml @@ -0,0 +1,18 @@ +name: "Audit depdencies" + +# Midnight each day +on: + schedule: + - cron: '0 0 * * *' + +jobs: + security_audit: + name: "Security audit" + runs-on: + group: ubuntu-22.04-8core + steps: + - uses: actions/checkout@v1 + - uses: actions-rs/audit-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + diff --git a/.github/workflows/on_main.yml b/.github/workflows/on_main.yml index 2aeb4fd..3689b47 100644 --- a/.github/workflows/on_main.yml +++ b/.github/workflows/on_main.yml @@ -34,3 +34,4 @@ jobs: ghcr.io/near/near-light-client/light-client:${{ github.sha }} ghcr.io/near/near-light-client/light-client:latest +# TODO: releasing to succinct on tag diff --git a/.github/workflows/on_pull_request.yml b/.github/workflows/on_pull_request.yml index 0ebddcb..050796a 100644 --- a/.github/workflows/on_pull_request.yml +++ b/.github/workflows/on_pull_request.yml @@ -1,9 +1,20 @@ +# See workflow runs at https://github.com/nextest-rs/reuse-build-partition-example/actions/workflows/ci.yml. name: "Check PR is ready for merge" +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + on: pull_request: branches: - master + # schedule: + # # Run this every day at 01:00 UTC. + # - cron: 0 1 * * * + +env: + CARGO_TERM_COLOR: always jobs: lint: @@ -13,24 +24,118 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - - uses: actions-rust-lang/setup-rust-toolchain@v1 - - uses: Swatinem/rust-cache@v2 - - name: "Check rust format" - uses: actions-rs/cargo@v1 + - uses: actions-rust-lang/setup-rust-toolchain@v1.8.0 + with: + cache-workspaces: |- + . + - uses: actions-rust-lang/rustfmt@v1 + - uses: actions-rs/clippy-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + args: --all-features + + build-test-artifacts: + name: Build test artifacts + runs-on: ubuntu-20.04-16core + steps: + - uses: actions/checkout@v3 + with: + # By default actions/checkout checks out a merge commit. Check out the PR head instead. + # https://github.com/actions/checkout#checkout-pull-request-head-commit-instead-of-merge-commit + ref: ${{ github.event.pull_request.head.sha }} + - uses: actions-rust-lang/setup-rust-toolchain@v1.8.0 + with: + cache-workspaces: |- + . + - name: "Install cargo-nextest" + run: cargo install cargo-nextest + - name: Build and archive tests + run: cargo nextest archive -r --workspace --archive-file nextest-archive.tar.zst --locked + - name: Upload archive to workflow + uses: actions/upload-artifact@v3 with: - command: fmt - args: --all -- --check + name: nextest-archive + path: nextest-archive.tar.zst + test-rust: name: "Test Rust" runs-on: - group: ubuntu-22.04-16core + group: ubuntu-22.04-8core + needs: build-test-artifacts steps: - name: Checkout uses: actions/checkout@v3 - - uses: actions-rust-lang/setup-rust-toolchain@v1 - - uses: Swatinem/rust-cache@v2 + - uses: actions-rust-lang/setup-rust-toolchain@v1.8.0 + with: + cache-workspaces: |- + . - name: "Install cargo-nextest" run: cargo install cargo-nextest - - name: "Run tests" - run: cargo nextest run --workspace --locked + - name: Download archive + uses: actions/download-artifact@v3 + with: + name: nextest-archive + - name: "Run normal tests" + run: | + cargo nextest run \ + --archive-file nextest-archive.tar.zst \ + --no-fail-fast + + run-tests-partitioned: + name: "Run Beefy tests partitioned" + needs: build-test-artifacts + strategy: + matrix: + os: [ubuntu-22.04-32core, ubuntu-20.04-32core] + include: + - os: ubuntu-22.04-32core + share: 1 + - os: ubuntu-20.04-32core + share: 2 + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + - uses: actions-rust-lang/setup-rust-toolchain@v1.8.0 + with: + cache-workspaces: |- + . + - name: "Install cargo-nextest" + run: cargo install cargo-nextest + - name: Download archive + uses: actions/download-artifact@v3 + with: + name: nextest-archive + - name: Run tests + run: | + cargo nextest run \ + --run-ignored ignored-only \ + --archive-file nextest-archive.tar.zst \ + --partition count:${{ matrix.share }}/2 + test-solidity-contracts: + name: "Test Solidity Contracts" + runs-on: + group: ubuntu-22.04-16core + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: recursive + token: ${{ secrets.GITHUB_TOKEN }} + - uses: actions-rust-lang/setup-rust-toolchain@v1.8.0 + with: + cache-workspaces: |- + . + - name: "Install Foundry" + uses: taiki-e/cache-cargo-install-action@v1 + with: + git: https://github.com/foundry-rs/foundry + tool: forge + rev: 6ee3e88d2a48c7df48c85986e67f73cd2e6403d8 + - name: "Forge install" + run: cd nearx/contract && forge install + - name: "Run tests" + run: cd nearx/contract && forge test -vv + diff --git a/.gitignore b/.gitignore index 4ea0f70..d498792 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,29 @@ -/target +**/target +# Nixos Direnv .direnv +# Light client local config file local.toml -state.db +# Lightclient DBs +*.db + +# ZK Compiler files +build/ +wrapped/ +nearx/build +nearx/contract/cache +nearx/contract/out +nearx/contract/lib +# Ignores development broadcast logs +!**broadcast +**broadcast/*/31337/ +**broadcast/**/dry-run/ +nearx/contract/broadcast + +# Docs +docs/ + +# Dotenv file +.env diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..96bfd38 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,21 @@ +[submodule "vendor/starkyx"] + path = vendor/starkyx + url = git@github.com:succinctlabs/starkyx.git +[submodule "vendor/succinctx"] + path = vendor/succinctx + url = git@github.com:succinctlabs/succinctx.git +[submodule "nearx/contract/lib/openzeppelin-contracts"] + path = nearx/contract/lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "nearx/contract/lib/openzeppelin-contracts-upgradeable"] + path = nearx/contract/lib/openzeppelin-contracts-upgradeable + url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable +[submodule "nearx/contract/lib/foundry-devops"] + path = nearx/contract/lib/foundry-devops + url = https://github.com/chainaccelorg/foundry-devops +[submodule "nearx/contract/lib/solidity-bytes-utils"] + path = nearx/contract/lib/solidity-bytes-utils + url = https://github.com/GNSPS/solidity-bytes-utils +[submodule "nearx/contract/lib/forge-std"] + path = nearx/contract/lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/Cargo.lock b/Cargo.lock index ce4a387..64bc164 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,16 +2,26 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + [[package]] name = "actix" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cba56612922b907719d4a01cf11c8d5b458e7d3dba946d0435f20f58d6795ed2" +checksum = "fb72882332b6d6282f428b77ba0358cb2687e61a6f6df6a6d3871e8a177c2d4f" dependencies = [ "actix-macros", "actix-rt", "actix_derive", - "bitflags 2.4.1", + "bitflags 2.4.2", "bytes", "crossbeam-channel", "futures-core", @@ -34,7 +44,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] @@ -55,7 +65,27 @@ checksum = "7c7db3d5a9718568e4cf4a537cfd7070e6e6ff7481510d0237fb529ac850f6d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", +] + +[[package]] +name = "addchain" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" +dependencies = [ + "num-bigint 0.3.3", + "num-integer", + "num-traits", +] + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", ] [[package]] @@ -65,35 +95,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] -name = "ahash" -version = "0.7.7" +name = "aes" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ - "getrandom 0.2.11", - "once_cell", - "version_check", + "cfg-if", + "cipher 0.4.4", + "cpufeatures", ] [[package]] name = "ahash" -version = "0.8.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "cfg-if", + "getrandom 0.2.12", "once_cell", "version_check", - "zerocopy", ] [[package]] -name = "aho-corasick" -version = "0.7.20" +name = "ahash" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" dependencies = [ - "memchr", + "cfg-if", + "const-random", + "once_cell", + "version_check", + "zerocopy", ] [[package]] @@ -143,9 +176,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.5" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", @@ -157,9 +190,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" @@ -204,11 +237,38 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "array-macro" +version = "2.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "220a2c618ab466efe41d0eace94dfeff1c35e3aa47891bdb95e1c0fefffd3c99" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + [[package]] name = "async-compression" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc2d0cfb2a7388d34f590e76686704c494ed7aaceed62ee1ba35cbf363abc2a5" +checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c" dependencies = [ "brotli", "flate2", @@ -237,7 +297,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] @@ -248,7 +308,18 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version", ] [[package]] @@ -262,6 +333,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "auto_impl" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "823b8bb275161044e2ac7a25879cb3e2480cb403e3943022c7c769c599b756aa" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.49", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -275,46 +357,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", - "axum-core 0.3.4", + "axum-core", "bitflags 1.3.2", "bytes", "futures-util", - "http 0.2.11", - "http-body 0.4.6", - "hyper 0.14.28", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d09dbe0e490df5da9d69b36dca48a76635288a82f92eca90024883a56202026d" -dependencies = [ - "async-trait", - "axum-core 0.4.2", - "bytes", - "futures-util", - "http 1.0.0", - "http-body 1.0.0", - "http-body-util", - "hyper 1.1.0", - "hyper-util", + "http", + "http-body", + "hyper", "itoa", "matchit", "memchr", @@ -331,7 +380,6 @@ dependencies = [ "tower", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -343,8 +391,8 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 0.2.11", - "http-body 0.4.6", + "http", + "http-body", "mime", "rustversion", "tower-layer", @@ -352,26 +400,26 @@ dependencies = [ ] [[package]] -name = "axum-core" -version = "0.4.2" +name = "backtrace" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c8503f93e6d144ee5690907ba22db7ba79ab001a932ab99034f0fe836b3df" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http 1.0.0", - "http-body 1.0.0", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.13.1" @@ -380,9 +428,45 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bitflags" @@ -392,9 +476,21 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" + +[[package]] +name = "bitvec" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] [[package]] name = "blake2" @@ -407,15 +503,6 @@ dependencies = [ "opaque-debug", ] -[[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" @@ -427,47 +514,26 @@ dependencies = [ [[package]] name = "borsh" -version = "0.10.3" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +checksum = "f58b559fd6448c6e2fd0adb5720cd98a2506594cafa4737ff98c396f3e82f667" dependencies = [ "borsh-derive", - "hashbrown 0.13.2", + "cfg_aliases", ] [[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", - "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" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +checksum = "7aadb5b6ccbd078890f6d7003694e33816e6b784358f18e15e7e6d9f065a57cd" dependencies = [ + "once_cell", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.49", + "syn_derive", ] [[package]] @@ -497,11 +563,27 @@ 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 = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +dependencies = [ + "sha2", + "tinyvec", +] + [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" [[package]] name = "byteorder" @@ -514,6 +596,9 @@ name = "bytes" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +dependencies = [ + "serde", +] [[package]] name = "bytesize" @@ -524,22 +609,76 @@ dependencies = [ "serde", ] +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[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 = "c2-chacha" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d27dae93fe7b1e0424dc57179ac396908c26b035a87234809f5c4dfd1b47dc80" dependencies = [ - "cipher", + "cipher 0.2.5", "ppv-lite86", ] +[[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cc" version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ + "jobserver", "libc", ] @@ -549,11 +688,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "android-tzdata", "iana-time-zone", @@ -561,7 +706,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-targets 0.52.0", ] [[package]] @@ -573,11 +718,21 @@ dependencies = [ "generic-array", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clap" -version = "4.4.12" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfab8ba68f3668e89f6ff60f5b205cea56aa7b769451a59f34b8682f51c056d" +checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f" dependencies = [ "clap_builder", "clap_derive", @@ -585,43 +740,43 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.12" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9" +checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.0", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "coerce" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba30a4bf4bebf9112b9f42124de78b0e5dccad05c86181072663c7d8567aedec" +checksum = "3311405ed7a9b541faddd4e2de71cfa908e5558658d504f7954d2aee684b96a6" dependencies = [ "anyhow", "async-trait", - "axum 0.6.20", + "axum", "byteorder", "bytes", "chrono", @@ -638,31 +793,83 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "tokio", "tokio-stream", "tokio-util 0.7.10", "tracing", "utoipa", "utoipa-swagger-ui", - "uuid", + "uuid 1.7.0", "valuable", ] [[package]] -name = "colorchoice" -version = "1.0.0" +name = "coins-bip32" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" +dependencies = [ + "bs58 0.5.0", + "coins-core", + "digest 0.10.7", + "hmac", + "k256", + "serde", + "sha2", + "thiserror", +] [[package]] -name = "config" -version = "0.13.4" +name = "coins-bip39" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23738e11972c7643e4ec947840fc463b6a571afcd3e735bdfce7d03c7a784aca" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ - "async-trait", - "json5", + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2 0.12.2", + "rand 0.8.5", + "sha2", + "thiserror", +] + +[[package]] +name = "coins-core" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" +dependencies = [ + "base64 0.21.7", + "bech32", + "bs58 0.5.0", + "digest 0.10.7", + "generic-array", + "hex", + "ripemd", + "serde", + "serde_derive", + "sha2", + "sha3", + "thiserror", +] + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "config" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23738e11972c7643e4ec947840fc463b6a571afcd3e735bdfce7d03c7a784aca" +dependencies = [ + "async-trait", + "json5", "lazy_static", "nom", "pathdiff", @@ -670,10 +877,55 @@ dependencies = [ "rust-ini", "serde", "serde_json", - "toml", + "toml 0.5.11", "yaml-rust", ] +[[package]] +name = "const-hex" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d59688ad0945eaf6b84cb44fedbe93484c81b48970e98f09db8a22832d7961" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-random" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aaf16c9c2c612020bcfd042e170f6e32de9b9d75adb5277cdbbd2e2c8c8299a" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.12", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + [[package]] name = "convert_case" version = "0.4.0" @@ -698,58 +950,74 @@ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a9b73a36529d9c47029b9fb3a6f0ea3cc916a261195352ba19e770fc1748b2" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.17" +name = "crossbeam-deque" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "autocfg", - "cfg-if", + "crossbeam-epoch", "crossbeam-utils", ] [[package]] -name = "crossbeam-utils" -version = "0.8.18" +name = "crossbeam-epoch" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "cfg-if", + "crossbeam-utils", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + [[package]] name = "crunchy" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -770,24 +1038,49 @@ dependencies = [ "subtle", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher 0.4.4", +] + [[package]] name = "curve25519-dalek" -version = "3.2.1" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "platforms", + "rand_core 0.6.4", + "rustc_version", "subtle", "zeroize", ] +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.49", +] + [[package]] name = "darling" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "c376d08ea6aa96aafe61237c7200d1241cb177b7d3a542d791f2d118e9cbb955" dependencies = [ "darling_core", "darling_macro", @@ -795,27 +1088,56 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "33043dcd19068b8192064c704b3f83eb464f91f1ff527b44a4e2b08d9cdb8855" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn 2.0.46", + "strsim 0.10.0", + "syn 2.0.49", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" dependencies = [ "darling_core", "quote", - "syn 2.0.46", + "syn 2.0.49", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.3", + "lock_api", + "once_cell", + "parking_lot_core 0.9.9", +] + +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "zeroize", ] [[package]] @@ -836,7 +1158,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] @@ -852,6 +1174,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + [[package]] name = "digest" version = "0.9.0" @@ -867,7 +1195,8 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.4", + "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -878,7 +1207,26 @@ version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" dependencies = [ - "dirs-sys", + "dirs-sys 0.3.7", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys 0.4.1", +] + +[[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]] @@ -892,50 +1240,129 @@ dependencies = [ "winapi", ] +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "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 = "dlv-list" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + [[package]] name = "easy-ext" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53aff6fdc1b181225acdcb5b14c47106726fd8e486707315b1b138baed68ee31" +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + [[package]] name = "ed25519" -version = "1.5.3" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ + "pkcs8", "signature", ] [[package]] name = "ed25519-dalek" -version = "1.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", - "rand 0.7.3", + "rand_core 0.6.4", "serde", - "sha2 0.9.9", + "sha2", + "subtle", "zeroize", ] [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" dependencies = [ "serde", ] +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ena" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" +dependencies = [ + "log", +] + [[package]] name = "encoding_rs" version = "0.8.33" @@ -951,6 +1378,24 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" +[[package]] +name = "enr" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe81b5c06ecfdbc71dd845216f225f53b62a10cb8a16c946836a3467f701d05b" +dependencies = [ + "base64 0.21.7", + "bytes", + "hex", + "k256", + "log", + "rand 0.8.5", + "rlp", + "serde", + "sha3", + "zeroize", +] + [[package]] name = "enum-map" version = "2.7.3" @@ -968,14 +1413,27 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] name = "env_logger" -version = "0.10.1" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "env_logger" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -1001,33 +1459,408 @@ dependencies = [ ] [[package]] -name = "fastrand" -version = "2.0.1" +name = "eth-keystore" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" +dependencies = [ + "aes", + "ctr", + "digest 0.10.7", + "hex", + "hmac", + "pbkdf2 0.11.0", + "rand 0.8.5", + "scrypt", + "serde", + "serde_json", + "sha2", + "sha3", + "thiserror", + "uuid 0.8.2", +] [[package]] -name = "fixed-hash" -version = "0.7.0" +name = "ethabi" +version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ - "static_assertions", + "ethereum-types", + "hex", + "once_cell", + "regex", + "serde", + "serde_json", + "sha3", + "thiserror", + "uint", ] [[package]] -name = "fixedbitset" -version = "0.4.2" +name = "ethbloom" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash 0.8.0", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] [[package]] -name = "flate2" -version = "1.0.28" +name = "ethereum-types" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ - "crc32fast", + "ethbloom", + "fixed-hash 0.8.0", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types 0.12.2", + "scale-info", + "uint", +] + +[[package]] +name = "ethers" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c7cd562832e2ff584fa844cd2f6e5d4f35bbe11b28c7c9b8df957b2e1d0c701" +dependencies = [ + "ethers-addressbook", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-middleware", + "ethers-providers", + "ethers-signers", + "ethers-solc", +] + +[[package]] +name = "ethers-addressbook" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35dc9a249c066d17e8947ff52a4116406163cf92c7f0763cb8c001760b26403f" +dependencies = [ + "ethers-core", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "ethers-contract" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43304317c7f776876e47f2f637859f6d0701c1ec7930a150f169d5fbe7d76f5a" +dependencies = [ + "const-hex", + "ethers-contract-abigen", + "ethers-contract-derive", + "ethers-core", + "ethers-providers", + "futures-util", + "once_cell", + "pin-project", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "ethers-contract-abigen" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f96502317bf34f6d71a3e3d270defaa9485d754d789e15a8e04a84161c95eb" +dependencies = [ + "Inflector", + "const-hex", + "dunce", + "ethers-core", + "ethers-etherscan", + "eyre", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "reqwest", + "serde", + "serde_json", + "syn 2.0.49", + "toml 0.8.10", + "walkdir", +] + +[[package]] +name = "ethers-contract-derive" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "452ff6b0a64507ce8d67ffd48b1da3b42f03680dcf5382244e9c93822cbbf5de" +dependencies = [ + "Inflector", + "const-hex", + "ethers-contract-abigen", + "ethers-core", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.49", +] + +[[package]] +name = "ethers-core" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aab3cef6cc1c9fd7f787043c81ad3052eff2b96a3878ef1526aa446311bdbfc9" +dependencies = [ + "arrayvec", + "bytes", + "cargo_metadata", + "chrono", + "const-hex", + "elliptic-curve", + "ethabi", + "generic-array", + "k256", + "num_enum", + "once_cell", + "open-fastrlp", + "rand 0.8.5", + "rlp", + "serde", + "serde_json", + "strum 0.25.0", + "syn 2.0.49", + "tempfile", + "thiserror", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "ethers-etherscan" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d45b981f5fa769e1d0343ebc2a44cfa88c9bc312eb681b676318b40cef6fb1" +dependencies = [ + "chrono", + "ethers-core", + "reqwest", + "semver", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "ethers-middleware" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145211f34342487ef83a597c1e69f0d3e01512217a7c72cc8a25931854c7dca0" +dependencies = [ + "async-trait", + "auto_impl", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-providers", + "ethers-signers", + "futures-channel", + "futures-locks", + "futures-util", + "instant", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "tracing-futures", + "url", +] + +[[package]] +name = "ethers-providers" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb6b15393996e3b8a78ef1332d6483c11d839042c17be58decc92fa8b1c3508a" +dependencies = [ + "async-trait", + "auto_impl", + "base64 0.21.7", + "bytes", + "const-hex", + "enr", + "ethers-core", + "futures-core", + "futures-timer", + "futures-util", + "hashers", + "http", + "instant", + "jsonwebtoken", + "once_cell", + "pin-project", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-tungstenite", + "tracing", + "tracing-futures", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "ws_stream_wasm", +] + +[[package]] +name = "ethers-signers" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3b125a103b56aef008af5d5fb48191984aa326b50bfd2557d231dc499833de3" +dependencies = [ + "async-trait", + "coins-bip32", + "coins-bip39", + "const-hex", + "elliptic-curve", + "eth-keystore", + "ethers-core", + "rand 0.8.5", + "sha2", + "thiserror", + "tracing", +] + +[[package]] +name = "ethers-solc" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d21df08582e0a43005018a858cc9b465c5fff9cf4056651be64f844e57d1f55f" +dependencies = [ + "cfg-if", + "const-hex", + "dirs 5.0.1", + "dunce", + "ethers-core", + "glob", + "home", + "md-5", + "num_cpus", + "once_cell", + "path-slash", + "rayon", + "regex", + "semver", + "serde", + "serde_json", + "solang-parser", + "svm-rs", + "thiserror", + "tiny-keccak", + "tokio", + "tracing", + "walkdir", + "yansi", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[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 0.6.4", + "subtle", +] + +[[package]] +name = "ff_derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f54704be45ed286151c5e11531316eaef5b8f5af7d597b806fdb8af108d84a" +dependencies = [ + "addchain", + "cfg-if", + "num-bigint 0.3.3", + "num-integer", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" + +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[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.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", "miniz_oxide", ] @@ -1071,6 +1904,12 @@ dependencies = [ "winapi", ] +[[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.30" @@ -1119,6 +1958,16 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +[[package]] +name = "futures-locks" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" +dependencies = [ + "futures-channel", + "futures-task", +] + [[package]] name = "futures-macro" version = "0.3.30" @@ -1127,7 +1976,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] @@ -1142,6 +1991,16 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +[[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 0.4.0", +] + [[package]] name = "futures-util" version = "0.3.30" @@ -1177,6 +2036,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -1192,47 +2052,65 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] -name = "h2" -version = "0.3.22" +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gloo-timers" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" dependencies = [ - "bytes", - "fnv", + "futures-channel", "futures-core", - "futures-sink", - "futures-util", - "http 0.2.11", - "indexmap 2.1.0", - "slab", - "tokio", - "tokio-util 0.7.10", - "tracing", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", ] [[package]] name = "h2" -version = "0.4.0" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d308f63daf4181410c242d34c11f928dcb3aa105852019e043c9d1f4e4368a" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http 1.0.0", - "indexmap 2.1.0", + "http", + "indexmap 2.2.3", "slab", "tokio", "tokio-util 0.7.10", @@ -1245,16 +2123,16 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.8", ] [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", ] [[package]] @@ -1263,8 +2141,19 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "allocator-api2", + "rayon", + "serde", +] + +[[package]] +name = "hashers" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +dependencies = [ + "fxhash", ] [[package]] @@ -1302,9 +2191,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "hex" @@ -1344,17 +2233,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http-body" version = "0.4.6" @@ -1362,30 +2240,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http 0.2.11", - "pin-project-lite", -] - -[[package]] -name = "http-body" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http 1.0.0", -] - -[[package]] -name = "http-body-util" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" -dependencies = [ - "bytes", - "futures-util", - "http 1.0.0", - "http-body 1.0.0", + "http", "pin-project-lite", ] @@ -1417,14 +2272,14 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.22", - "http 0.2.11", - "http-body 0.4.6", + "h2", + "http", + "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.5", + "socket2", "tokio", "tower-service", "tracing", @@ -1432,22 +2287,17 @@ dependencies = [ ] [[package]] -name = "hyper" -version = "1.1.0" +name = "hyper-rustls" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ - "bytes", - "futures-channel", "futures-util", - "h2 0.4.0", - "http 1.0.0", - "http-body 1.0.0", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", + "http", + "hyper", + "rustls", "tokio", + "tokio-rustls", ] [[package]] @@ -1456,7 +2306,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.28", + "hyper", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -1469,35 +2319,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.28", + "hyper", "native-tls", "tokio", "tokio-native-tls", ] -[[package]] -name = "hyper-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.0.0", - "http-body 1.0.0", - "hyper 1.1.0", - "pin-project-lite", - "socket2 0.5.5", - "tokio", - "tracing", -] - [[package]] name = "iana-time-zone" -version = "0.1.59" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1532,6 +2364,50 @@ dependencies = [ "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-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexmap" version = "1.9.3" @@ -1545,15 +2421,24 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown 0.14.3", "serde", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "instant" version = "0.1.12" @@ -1571,12 +2456,12 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.3", - "rustix", + "hermit-abi 0.3.6", + "libc", "windows-sys 0.52.0", ] @@ -1591,9 +2476,18 @@ dependencies = [ [[package]] name = "itertools" -version = "0.12.0" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -1604,11 +2498,20 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +[[package]] +name = "jobserver" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" dependencies = [ "wasm-bindgen", ] @@ -1630,6 +2533,20 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105" +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.7", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + [[package]] name = "jwt" version = "0.16.0" @@ -1642,20 +2559,90 @@ dependencies = [ "hmac", "serde", "serde_json", - "sha2 0.10.8", + "sha2", +] + +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2bd4c29270e724d3eaadf7bdc8700af4221fc0ed771b855eadcd1b98d52851" +dependencies = [ + "primitive-types 0.10.1", + "tiny-keccak", +] + +[[package]] +name = "lalrpop" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da4081d44f4611b66c6dd725e6de3169f9f63905421e8626fcb86b6a898998b8" +dependencies = [ + "ascii-canvas", + "bit-set", + "diff", + "ena", + "is-terminal", + "itertools 0.10.5", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax 0.7.5", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", ] +[[package]] +name = "lalrpop-util" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" + [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] [[package]] name = "libc" -version = "0.2.151" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libm" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libredox" @@ -1663,7 +2650,7 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libc", "redox_syscall 0.4.1", ] @@ -1676,9 +2663,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" @@ -1720,19 +2707,38 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + [[package]] name = "memchr" version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "metrics" version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "metrics-macros", "portable-atomic", ] @@ -1743,8 +2749,8 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d4fa7ce7c4862db464a37b0b31d89bca874562f034bd7993895572783d02950" dependencies = [ - "base64 0.21.5", - "hyper 0.14.28", + "base64 0.21.7", + "hyper", "indexmap 1.9.3", "ipnet", "metrics", @@ -1763,19 +2769,19 @@ checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] name = "metrics-util" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111cb375987443c3de8d503580b536f77dc8416d32db62d9456db5d93bd7ac47" +checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" dependencies = [ - "aho-corasick 0.7.20", + "aho-corasick", "crossbeam-epoch", "crossbeam-utils", - "hashbrown 0.13.2", + "hashbrown 0.13.1", "indexmap 1.9.3", "metrics", "num_cpus", @@ -1809,9 +2815,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] @@ -1853,9 +2859,9 @@ dependencies = [ [[package]] name = "near-account-id" -version = "0.17.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0cb40869cab7f5232f934f45db35bffe0f2d2a7cb0cd0346202fbe4ebf2dd7" +checksum = "35cbb989542587b47205e608324ddd391f0cee1c22b4b64ae49f458334b95907" dependencies = [ "borsh", "serde", @@ -1863,31 +2869,32 @@ dependencies = [ [[package]] name = "near-chain-configs" -version = "0.17.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4f9a1c805846237d56f99b328ba6ab77e5d43ef59aaaf8d2a41d42fdc708a7b" +checksum = "d05e5a8ace81c09d7eb165dffc1742358a021b2fa761f2160943305f83216003" dependencies = [ "anyhow", + "bytesize", "chrono", "derive_more", "near-config-utils", "near-crypto", - "near-o11y", + "near-parameters", "near-primitives", - "num-rational", + "num-rational 0.3.2", "once_cell", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "smart-default", "tracing", ] [[package]] name = "near-config-utils" -version = "0.17.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5523e7dce493c45bc3241eb3100d943ec471852f9b1f84b46a34789eadf17031" +checksum = "2ae1eaab1d545a9be7a55b6ef09f365c2017f93a03063547591d12c0c6d27e58" dependencies = [ "anyhow", "json_comments", @@ -1897,13 +2904,13 @@ dependencies = [ [[package]] name = "near-crypto" -version = "0.17.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6b382b626e7e0cd372d027c6672ac97b4b6ee6114288c9e58d8180b935d315" +checksum = "2991d2912218a80ec0733ac87f84fa803accea105611eea209d4419271957667" dependencies = [ "blake2", "borsh", - "bs58", + "bs58 0.4.0", "c2-chacha", "curve25519-dalek", "derive_more", @@ -1913,7 +2920,7 @@ dependencies = [ "near-config-utils", "near-stdx", "once_cell", - "primitive-types", + "primitive-types 0.10.1", "rand 0.7.3", "secp256k1", "serde", @@ -1924,18 +2931,18 @@ dependencies = [ [[package]] name = "near-fmt" -version = "0.17.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c44c842c6cfcd9b8c387cccd4cd0619a5f21920cde5d5c292af3cc5d40510672" +checksum = "b7d998dfc1e04001608899b2498ad5a782c7d036b73769d510de21964db99286" dependencies = [ "near-primitives-core", ] [[package]] name = "near-jsonrpc-client" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "118f44c02ad211db805c1370ad3ff26576af6ff554093c9fece1b835d29d233a" +checksum = "18ad81e015f7aced8925d5b9ba3f369b36da9575c15812cfd0786bc1213284ca" dependencies = [ "borsh", "lazy_static", @@ -1952,9 +2959,9 @@ dependencies = [ [[package]] name = "near-jsonrpc-primitives" -version = "0.17.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b2934b5ab243e25e951c984525ba0aff0e719ed915c988c5195405aa0f6987" +checksum = "b0ce745e954ae776eef05957602e638ee9581106a3675946fb43c2fe7e38ef03" dependencies = [ "arbitrary", "near-chain-configs", @@ -1968,25 +2975,28 @@ dependencies = [ [[package]] name = "near-light-client" -version = "0.2.0" +version = "0.3.0" dependencies = [ "anyhow", "async-trait", - "axum 0.7.3", + "axum", + "borsh", "coerce", "config", "either", "futures", "hex", - "itertools 0.12.0", + "itertools 0.12.1", "log", "near-crypto", "near-jsonrpc-client", + "near-light-client-protocol", + "near-light-client-rpc", "near-primitives", "near-primitives-core", "pretty_env_logger", "protobuf 3.2.0", - "rand 0.8.5", + "rand 0.7.3", "reqwest", "serde", "serde_json", @@ -1995,16 +3005,88 @@ dependencies = [ "tokio", ] +[[package]] +name = "near-light-client-protocol" +version = "0.3.0" +dependencies = [ + "anyhow", + "borsh", + "either", + "hex", + "itertools 0.12.1", + "log", + "near-crypto", + "near-jsonrpc-primitives", + "near-primitives", + "near-primitives-core", + "pretty_env_logger", + "rand 0.7.3", + "serde", + "serde_json", + "test-utils", + "thiserror", +] + +[[package]] +name = "near-light-client-rpc" +version = "0.3.0" +dependencies = [ + "anyhow", + "async-trait", + "borsh", + "either", + "futures", + "hex", + "itertools 0.12.1", + "log", + "near-crypto", + "near-jsonrpc-client", + "near-jsonrpc-primitives", + "near-primitives", + "near-primitives-core", + "pretty_env_logger", + "rand 0.7.3", + "serde", + "serde_json", + "thiserror", + "tokio", +] + +[[package]] +name = "near-light-clientx" +version = "0.3.0" +dependencies = [ + "async-trait", + "borsh", + "cfg-if", + "ethers", + "hex", + "log", + "near-light-client-protocol", + "near-light-client-rpc", + "near-primitives", + "plonky2 0.1.4 (git+https://github.com/mir-protocol/plonky2.git)", + "plonky2x", + "pretty_assertions", + "pretty_env_logger", + "serde", + "serde_json", + "serial_test", + "test-utils", + "tokio", +] + [[package]] name = "near-o11y" -version = "0.17.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7d35397b02b131c188c72f3885e97daeccab134ec2fc8cc0073a94cf1cfe19" +checksum = "d20762631bc8253030013bbae9b5f0542691edc1aa6722f1e8141cc9b928ae5b" dependencies = [ "actix", - "atty", + "base64 0.21.7", "clap", "near-crypto", + "near-fmt", "near-primitives-core", "once_cell", "opentelemetry", @@ -2012,7 +3094,8 @@ dependencies = [ "opentelemetry-semantic-conventions", "prometheus", "serde", - "strum", + "serde_json", + "strum 0.24.1", "thiserror", "tokio", "tracing", @@ -2021,13 +3104,33 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "near-parameters" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f16a59b6c3e69b0585be951af6fe42a0ba86c0e207cb8c63badd19efd16680" +dependencies = [ + "assert_matches", + "borsh", + "enum-map", + "near-account-id", + "near-primitives-core", + "num-rational 0.3.2", + "serde", + "serde_repr", + "serde_yaml", + "strum 0.24.1", + "thiserror", +] + [[package]] name = "near-primitives" -version = "0.17.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f7051aaf199adc4d068620fca6d5f70f906a1540d03a8bb3701271f8881835" +checksum = "0462b067732132babcc89d5577db3bfcb0a1bcfbaaed3f2db4c11cd033666314" dependencies = [ "arbitrary", + "base64 0.21.7", "borsh", "bytesize", "cfg-if", @@ -2038,21 +3141,25 @@ dependencies = [ "hex", "near-crypto", "near-fmt", + "near-o11y", + "near-parameters", "near-primitives-core", "near-rpc-error-macro", "near-stdx", - "near-vm-errors", - "num-rational", + "near-vm-runner", + "num-rational 0.3.2", "once_cell", - "primitive-types", + "primitive-types 0.10.1", "rand 0.8.5", + "rand_chacha 0.3.1", "reed-solomon-erasure", "serde", "serde_json", "serde_with", "serde_yaml", + "sha3", "smart-default", - "strum", + "strum 0.24.1", "thiserror", "time", "tracing", @@ -2060,103 +3167,187 @@ dependencies = [ [[package]] name = "near-primitives-core" -version = "0.17.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775fec19ef51a341abdbf792a9dda5b4cb89f488f681b2fd689b9321d24db47b" +checksum = "8443eb718606f572c438be6321a097a8ebd69f8e48d953885b4f16601af88225" dependencies = [ "arbitrary", - "base64 0.21.5", + "base64 0.21.7", "borsh", - "bs58", + "bs58 0.4.0", "derive_more", "enum-map", "near-account-id", - "num-rational", + "num-rational 0.3.2", "serde", "serde_repr", "serde_with", - "sha2 0.10.8", - "strum", + "sha2", + "strum 0.24.1", "thiserror", ] [[package]] name = "near-rpc-error-core" -version = "0.17.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c1eda300e2e78f4f945ae58117d49e806899f4a51ee2faa09eda5ebc2e6571" +checksum = "80fca203c51edd9595ec14db1d13359fb9ede32314990bf296b6c5c4502f6ab7" dependencies = [ "quote", "serde", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] name = "near-rpc-error-macro" -version = "0.17.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d2dadd765101c77e664029dd6fbec090e696877d4ae903c620d02ceda4969a" +checksum = "897a445de2102f6732c8a185d922f5e3bf7fd0a41243ce40854df2197237f799" dependencies = [ "fs2", "near-rpc-error-core", "serde", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] name = "near-stdx" -version = "0.17.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6540152fba5e96fe5d575b79e8cd244cf2add747bb01362426bdc069bc3a23bc" +checksum = "855fd5540e3b4ff6fedf12aba2db1ee4b371b36f465da1363a6d022b27cb43b8" [[package]] -name = "near-vm-errors" -version = "0.17.0" +name = "near-vm-runner" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec545d1bede0579e7c15dd2dce9b998dc975c52f2165702ff40bec7ff69728bb" +checksum = "c56c80bdb1954808f59bd36a9112377197b38d424991383bf05f52d0fe2e0da5" dependencies = [ + "base64 0.21.7", "borsh", - "near-account-id", - "near-rpc-error-macro", + "ed25519-dalek", + "enum-map", + "memoffset", + "near-crypto", + "near-parameters", + "near-primitives-core", + "near-stdx", + "num-rational 0.3.2", + "once_cell", + "prefix-sum-vec", + "ripemd", "serde", - "strum", + "serde_repr", + "serde_with", + "sha2", + "sha3", + "strum 0.24.1", "thiserror", + "tracing", + "zeropool-bn", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + +[[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" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" +dependencies = [ + "num-bigint 0.4.4", + "num-complex", + "num-integer", + "num-iter", + "num-rational 0.4.1", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", + "rand 0.8.5", ] [[package]] -name = "nibble_vec" -version = "0.1.0" +name = "num-complex" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" dependencies = [ - "smallvec", + "num-traits", + "rand 0.8.5", ] [[package]] -name = "nom" -version = "7.1.3" +name = "num-conv" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] -name = "nu-ansi-term" -version = "0.46.0" +name = "num-integer" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "overload", - "winapi", + "num-traits", ] [[package]] -name = "num-bigint" -version = "0.3.3" +name = "num-iter" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" dependencies = [ "autocfg", "num-integer", @@ -2164,35 +3355,38 @@ dependencies = [ ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "num-rational" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" dependencies = [ "autocfg", + "num-bigint 0.3.3", + "num-integer", "num-traits", + "serde", ] [[package]] name = "num-rational" -version = "0.3.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", - "num-bigint", + "num-bigint 0.4.4", "num-integer", "num-traits", - "serde", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2201,10 +3395,40 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.6", "libc", ] +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.49", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -2217,13 +3441,38 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "ethereum-types", + "open-fastrlp-derive", +] + +[[package]] +name = "open-fastrlp-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +dependencies = [ + "bytes", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "openssl" -version = "0.10.62" +version = "0.10.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" +checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg-if", "foreign-types", "libc", @@ -2240,7 +3489,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] @@ -2251,9 +3500,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.98" +version = "0.9.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" +checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" dependencies = [ "cc", "libc", @@ -2291,7 +3540,7 @@ dependencies = [ "async-trait", "futures", "futures-util", - "http 0.2.11", + "http", "opentelemetry", "prost", "thiserror", @@ -2309,6 +3558,12 @@ dependencies = [ "opentelemetry", ] +[[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 = "3.9.2" @@ -2334,6 +3589,32 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parity-scale-codec" +version = "3.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" +dependencies = [ + "proc-macro-crate 2.0.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "parking_lot" version = "0.11.2" @@ -2383,109 +3664,399 @@ dependencies = [ ] [[package]] -name = "pathdiff" -version = "0.2.1" +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", + "hmac", + "password-hash", + "sha2", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.49", +] + +[[package]] +name = "pest_meta" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap 2.2.3", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.49", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.49", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[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.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] -name = "percent-encoding" -version = "2.3.1" +name = "platforms" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] -name = "pest" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" +name = "plonky2" +version = "0.1.4" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=d2598bd#d2598bded0cb24d36b0a9900e8ffd104c470831b" dependencies = [ - "memchr", - "thiserror", - "ucd-trie", + "ahash 0.8.8", + "anyhow", + "getrandom 0.2.12", + "hashbrown 0.14.3", + "itertools 0.11.0", + "keccak-hash", + "log", + "num", + "plonky2_field 0.1.1 (git+https://github.com/mir-protocol/plonky2.git?rev=d2598bd)", + "plonky2_maybe_rayon 0.1.1 (git+https://github.com/mir-protocol/plonky2.git?rev=d2598bd)", + "plonky2_util 0.1.1 (git+https://github.com/mir-protocol/plonky2.git?rev=d2598bd)", + "rand 0.8.5", + "serde", + "serde_json", + "static_assertions", + "unroll", + "web-time", ] [[package]] -name = "pest_derive" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" +name = "plonky2" +version = "0.1.4" +source = "git+https://github.com/mir-protocol/plonky2.git#8753162b77190f02ec6bbf1c3e31d6c3c843eb8e" dependencies = [ - "pest", - "pest_generator", + "ahash 0.8.8", + "anyhow", + "getrandom 0.2.12", + "hashbrown 0.14.3", + "itertools 0.11.0", + "keccak-hash", + "log", + "num", + "plonky2_field 0.1.1 (git+https://github.com/mir-protocol/plonky2.git)", + "plonky2_maybe_rayon 0.1.1 (git+https://github.com/mir-protocol/plonky2.git)", + "plonky2_util 0.1.1 (git+https://github.com/mir-protocol/plonky2.git)", + "rand 0.8.5", + "rand_chacha 0.3.1", + "serde", + "static_assertions", + "unroll", + "web-time", ] [[package]] -name = "pest_generator" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" +name = "plonky2_field" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=d2598bd#d2598bded0cb24d36b0a9900e8ffd104c470831b" dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.46", + "anyhow", + "itertools 0.11.0", + "num", + "plonky2_util 0.1.1 (git+https://github.com/mir-protocol/plonky2.git?rev=d2598bd)", + "rand 0.8.5", + "serde", + "static_assertions", + "unroll", ] [[package]] -name = "pest_meta" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" +name = "plonky2_field" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git#8753162b77190f02ec6bbf1c3e31d6c3c843eb8e" dependencies = [ - "once_cell", - "pest", - "sha2 0.10.8", + "anyhow", + "itertools 0.11.0", + "num", + "plonky2_util 0.1.1 (git+https://github.com/mir-protocol/plonky2.git)", + "rand 0.8.5", + "serde", + "static_assertions", + "unroll", ] [[package]] -name = "petgraph" -version = "0.6.4" +name = "plonky2_maybe_rayon" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "194db0cbdd974e92d897cd92b74adb3968dc1b967315eb280357c49a7637994e" dependencies = [ - "fixedbitset", - "indexmap 2.1.0", + "rayon", ] [[package]] -name = "pin-project" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +name = "plonky2_maybe_rayon" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=d2598bd#d2598bded0cb24d36b0a9900e8ffd104c470831b" dependencies = [ - "pin-project-internal", + "rayon", ] [[package]] -name = "pin-project-internal" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +name = "plonky2_maybe_rayon" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git#8753162b77190f02ec6bbf1c3e31d6c3c843eb8e" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.46", + "rayon", ] [[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +name = "plonky2_util" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=d2598bd#d2598bded0cb24d36b0a9900e8ffd104c470831b" [[package]] -name = "pin-utils" +name = "plonky2_util" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git#8753162b77190f02ec6bbf1c3e31d6c3c843eb8e" + +[[package]] +name = "plonky2x" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +source = "git+https://github.com/dndll/succinctx.git#4e539f2ea4a42cedcd0b056346ef8009cc24f619" +dependencies = [ + "anyhow", + "array-macro", + "async-trait", + "backtrace", + "base64 0.13.1", + "bincode", + "clap", + "curve25519-dalek", + "digest 0.10.7", + "dotenv", + "ed25519-dalek", + "env_logger 0.10.2", + "ethers", + "ff", + "futures", + "hex", + "itertools 0.10.5", + "lazy_static", + "log", + "num", + "num-bigint 0.4.4", + "plonky2 0.1.4 (git+https://github.com/mir-protocol/plonky2.git?rev=d2598bd)", + "plonky2x-derive", + "rand 0.8.5", + "reqwest", + "serde", + "serde_json", + "serde_plain", + "serde_with", + "sha2", + "sha256", + "starkyx", + "tokio", + "tracing", + "uuid 1.7.0", +] [[package]] -name = "pkg-config" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" +name = "plonky2x-derive" +version = "0.1.0" +source = "git+https://github.com/dndll/succinctx.git#4e539f2ea4a42cedcd0b056346ef8009cc24f619" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.49", +] [[package]] name = "portable-atomic" @@ -2505,33 +4076,98 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prefix-sum-vec" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa06bd51638b6e76ac9ba9b6afb4164fa647bd2916d722f2623fbb6d1ed8bdba" + +[[package]] +name = "pretty_assertions" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +dependencies = [ + "diff", + "yansi", +] + [[package]] name = "pretty_env_logger" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" dependencies = [ - "env_logger", + "env_logger 0.10.2", "log", ] +[[package]] +name = "prettyplease" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" +dependencies = [ + "proc-macro2", + "syn 2.0.49", +] + [[package]] name = "primitive-types" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" dependencies = [ - "fixed-hash", + "fixed-hash 0.7.0", + "uint", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash 0.8.0", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", "uint", ] [[package]] name = "proc-macro-crate" -version = "0.1.5" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +dependencies = [ + "toml_edit 0.20.7", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml", + "toml_edit 0.21.1", ] [[package]] @@ -2560,9 +4196,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.74" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2de98502f212cfcea8d0bb305bd0f49d7ebdd75b64ba0a68f937d888f4e0d6db" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -2582,6 +4218,22 @@ dependencies = [ "thiserror", ] +[[package]] +name = "proptest" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +dependencies = [ + "bitflags 2.4.2", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax 0.8.2", + "unarray", +] + [[package]] name = "prost" version = "0.9.0" @@ -2686,6 +4338,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "radix_trie" version = "0.2.1" @@ -2755,7 +4413,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", ] [[package]] @@ -2767,6 +4425,15 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "raw-cpuid" version = "10.7.0" @@ -2776,6 +4443,26 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "rayon" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.2.16" @@ -2800,7 +4487,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", "libredox", "thiserror", ] @@ -2816,13 +4503,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ - "aho-corasick 1.1.2", + "aho-corasick", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.5", "regex-syntax 0.8.2", ] @@ -2837,11 +4524,11 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ - "aho-corasick 1.1.2", + "aho-corasick", "memchr", "regex-syntax 0.8.2", ] @@ -2853,49 +4540,131 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] -name = "regex-syntax" -version = "0.8.2" +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "reqwest" +version = "0.11.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +dependencies = [ + "async-compression", + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tokio-util 0.7.10", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +dependencies = [ + "cc", + "getrandom 0.2.12", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] [[package]] -name = "reqwest" -version = "0.11.23" +name = "rlp" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ - "async-compression", - "base64 0.21.5", "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.22", - "http 0.2.11", - "http-body 0.4.6", - "hyper 0.14.28", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-util 0.7.10", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", + "rlp-derive", + "rustc-hex", +] + +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -2930,7 +4699,7 @@ dependencies = [ "quote", "rust-embed-utils", "shellexpand", - "syn 2.0.46", + "syn 2.0.49", "walkdir", ] @@ -2940,7 +4709,7 @@ version = "7.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d38ff6bf570dc3bb7100fce9f7b60c33fa71d80e88da3f2580df4ff2bdded74" dependencies = [ - "sha2 0.10.8", + "sha2", "walkdir", ] @@ -2954,6 +4723,18 @@ dependencies = [ "ordered-multimap", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[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.4.0" @@ -2965,17 +4746,48 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "errno", "libc", "linux-raw-sys", "windows-sys 0.52.0", ] +[[package]] +name = "rustls" +version = "0.21.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +dependencies = [ + "log", + "ring 0.17.7", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.7", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -2988,6 +4800,15 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher 0.4.4", +] + [[package]] name = "same-file" version = "1.0.6" @@ -2997,6 +4818,30 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "scale-info" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +dependencies = [ + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "schannel" version = "0.1.23" @@ -3012,6 +4857,42 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scrypt" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" +dependencies = [ + "hmac", + "pbkdf2 0.11.0", + "salsa20", + "sha2", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.7", + "untrusted 0.9.0", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "secp256k1" version = "0.27.0" @@ -3059,32 +4940,47 @@ name = "semver" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +dependencies = [ + "serde", +] + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.194" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.194" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] name = "serde_json" -version = "1.0.110" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fbd975230bada99c8bb618e0c365c2eefa219158d5c6c29610fd09ff1833257" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ "itoa", "ryu", @@ -3101,6 +4997,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_plain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1fc6db65a611022b23a0dec6975d63fb80a302cb3388835ff02c097258d50" +dependencies = [ + "serde", +] + [[package]] name = "serde_repr" version = "0.1.18" @@ -3109,7 +5014,16 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", +] + +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", ] [[package]] @@ -3126,16 +5040,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.4.0" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.1.0", + "indexmap 2.2.3", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -3143,23 +5058,23 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.4.0" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] name = "serde_yaml" -version = "0.9.30" +version = "0.9.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1bf28c79a99f70ee1f1d83d10c875d2e70618417fda01ad1785e027579d9d38" +checksum = "adf8a49373e98a4c5f0ceb5d05aa7c648d75f63774981ed95b7c7443bbd50c6e" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "itoa", "ryu", "serde", @@ -3167,16 +5082,39 @@ dependencies = [ ] [[package]] -name = "sha2" -version = "0.9.9" +name = "serial_test" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ad9342b3aaca7cb43c45c097dd008d4907070394bd0751a0aa8817e5a018d" +dependencies = [ + "dashmap", + "futures", + "lazy_static", + "log", + "parking_lot 0.12.1", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93fb4adc70021ac1b47f7d45e8cc4169baaa7ea58483bc5b721d19a26202212" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.49", +] + +[[package]] +name = "sha1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "block-buffer 0.9.0", "cfg-if", "cpufeatures", - "digest 0.9.0", - "opaque-debug", + "digest 0.10.7", ] [[package]] @@ -3190,6 +5128,29 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha256" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18278f6a914fa3070aa316493f7d2ddfb9ac86ebc06fa3b83bffda487e9065b0" +dependencies = [ + "async-trait", + "bytes", + "hex", + "sha2", + "tokio", +] + +[[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.7" @@ -3205,7 +5166,7 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" dependencies = [ - "dirs", + "dirs 4.0.0", ] [[package]] @@ -3219,9 +5180,25 @@ dependencies = [ [[package]] name = "signature" -version = "1.6.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint 0.4.4", + "num-traits", + "thiserror", + "time", +] [[package]] name = "siphasher" @@ -3231,9 +5208,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "sketches-ddsketch" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" +checksum = "85636c14b73d81f541e525f585c0a2109e6744e1565b5c1668e31c70c10ed65c" [[package]] name = "slab" @@ -3262,9 +5239,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "smart-default" @@ -3279,22 +5256,68 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.10" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "winapi", + "windows-sys 0.48.0", ] [[package]] -name = "socket2" -version = "0.5.5" +name = "solang-parser" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" dependencies = [ - "libc", - "windows-sys 0.48.0", + "itertools 0.11.0", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror", + "unicode-xid", +] + +[[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" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "starkyx" +version = "0.1.0" +source = "git+https://github.com/dndll/starkyx.git#80604accb5f6a287e31f945e4e923c3d0e1a7832" +dependencies = [ + "anyhow", + "bincode", + "curve25519-dalek", + "env_logger 0.9.3", + "hex", + "itertools 0.10.5", + "log", + "num", + "plonky2 0.1.4 (git+https://github.com/mir-protocol/plonky2.git?rev=d2598bd)", + "plonky2_maybe_rayon 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.8.5", + "serde", + "subtle-encoding", ] [[package]] @@ -3303,32 +5326,73 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot 0.12.1", + "phf_shared 0.10.0", + "precomputed-hash", +] + [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + [[package]] name = "strum" version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "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 0.25.3", +] + +[[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", + "quote", + "rustversion", + "syn 1.0.109", ] [[package]] name = "strum_macros" -version = "0.24.3" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", "rustversion", - "syn 1.0.109", + "syn 2.0.49", ] [[package]] @@ -3337,6 +5401,35 @@ 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 = "svm-rs" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" +dependencies = [ + "dirs 5.0.1", + "fs2", + "hex", + "once_cell", + "reqwest", + "semver", + "serde", + "serde_json", + "sha2", + "thiserror", + "url", + "zip", +] + [[package]] name = "syn" version = "1.0.109" @@ -3350,15 +5443,27 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.46" +version = "2.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89456b690ff72fddcecf231caedbe615c59480c93358a93dfae7fc29e3ebbf0e" +checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.49", +] + [[package]] name = "sync_wrapper" version = "0.1.2" @@ -3386,46 +5491,86 @@ dependencies = [ "libc", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" -version = "3.9.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.4.1", "rustix", "windows-sys 0.52.0", ] +[[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.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] +[[package]] +name = "test-utils" +version = "0.3.0" +dependencies = [ + "anyhow", + "borsh", + "derive_more", + "either", + "hex", + "itertools 0.12.1", + "log", + "near-crypto", + "near-jsonrpc-primitives", + "near-light-client-protocol", + "near-primitives", + "near-primitives-core", + "pretty_assertions", + "pretty_env_logger", + "rand 0.7.3", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] @@ -3440,12 +5585,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -3460,13 +5606,23 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -3484,11 +5640,11 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.2" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -3496,7 +5652,7 @@ dependencies = [ "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", - "socket2 0.4.10", + "socket2", "tokio-macros", "windows-sys 0.48.0", ] @@ -3513,13 +5669,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] @@ -3532,6 +5688,16 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.14" @@ -3543,6 +5709,21 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots", +] + [[package]] name = "tokio-util" version = "0.6.10" @@ -3584,6 +5765,73 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.6", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.2.3", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.2.3", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.3", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" +dependencies = [ + "indexmap 2.2.3", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.1", +] + [[package]] name = "tonic" version = "0.6.2" @@ -3596,10 +5844,10 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "h2 0.3.22", - "http 0.2.11", - "http-body 0.4.6", - "hyper 0.14.28", + "h2", + "http", + "http-body", + "hyper", "hyper-timeout", "percent-encoding", "pin-project", @@ -3691,7 +5939,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] @@ -3774,6 +6022,26 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "rustls", + "sha1", + "thiserror", + "url", + "utf-8", +] + [[package]] name = "typenum" version = "1.17.0" @@ -3798,6 +6066,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicase" version = "2.7.0" @@ -3809,9 +6083,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -3830,9 +6104,25 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-xid" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "unroll" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad948c1cb799b1a70f836077721a92a35ac177d4daddf4c20a633786d4cf618" +dependencies = [ + "quote", + "syn 1.0.109", +] [[package]] name = "unsafe-libyaml" @@ -3840,6 +6130,18 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.0" @@ -3851,6 +6153,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8parse" version = "0.2.1" @@ -3863,7 +6171,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d82b1bc5417102a73e8464c686eef947bdfb99fcdfc0a4f228e81afa9526470a" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "serde", "serde_json", "utoipa-gen", @@ -3879,7 +6187,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] @@ -3888,7 +6196,7 @@ version = "3.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84614caa239fb25b2bb373a52859ffd94605ceb256eeb1d63436325cf81e3653" dependencies = [ - "axum 0.6.20", + "axum", "mime_guess", "regex", "rust-embed", @@ -3900,11 +6208,21 @@ dependencies = [ [[package]] name = "uuid" -version = "1.6.1" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.12", + "serde", +] + +[[package]] +name = "uuid" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", "serde", ] @@ -3973,9 +6291,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3983,24 +6301,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.39" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" dependencies = [ "cfg-if", "js-sys", @@ -4010,9 +6328,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4020,33 +6338,49 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" [[package]] name = "web-sys" -version = "0.3.66" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +checksum = "2ee269d72cc29bf77a2c4bc689cc750fb39f5cbd493d2205bbb3f5c7779cf7b0" dependencies = [ "js-sys", "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + [[package]] name = "which" version = "4.4.2" @@ -4231,6 +6565,24 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d90f4e0f530c4c69f62b80d839e9ef3855edc9cba471a160c4d692deed62b401" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" @@ -4241,6 +6593,34 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version", + "send_wrapper 0.6.0", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "yaml-rust" version = "0.4.5" @@ -4250,6 +6630,12 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + [[package]] name = "zerocopy" version = "0.7.32" @@ -4267,27 +6653,26 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.49", ] [[package]] name = "zeroize" -version = "1.3.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" -dependencies = [ - "zeroize_derive", -] +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" [[package]] -name = "zeroize_derive" -version = "1.4.2" +name = "zeropool-bn" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "71e61de68ede9ffdd69c01664f65a178c5188b73f78faa21f0936016a888ff7c" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.46", + "byteorder", + "crunchy", + "lazy_static", + "rand 0.8.5", + "rustc-hex", ] [[package]] @@ -4296,8 +6681,45 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" dependencies = [ + "aes", "byteorder", + "bzip2", + "constant_time_eq", "crc32fast", "crossbeam-utils", "flate2", + "hmac", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.9+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +dependencies = [ + "cc", + "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index dbf23f9..38d28a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,21 +1,28 @@ -[package] +[workspace.package] edition = "2021" -name = "near-light-client" -version = "0.2.0" +license = "MIT" +version = "0.3.0" -[dependencies] +[workspace] +members = [ "bin/*", "crates/*", "nearx" ] +resolver = "2" + +[workspace.dependencies] anyhow = "1.0" async-trait = "0.1" config = "0.13" +derive_more = "0.99" either = { version = "1.9", features = [ "serde" ] } itertools = "0.12" log = "0.4" +pretty_assertions = "1.4" pretty_env_logger = "0.5" -sled = "0.34" # TODO: maybe heavy +sled = "0.34" # TODO: maybe heavy, use heed instead thiserror = "1.0" # Async axum = "*" +borsh = "1.3" coerce = { version = "0.8", features = [ "full" ] } futures = "0.3" reqwest = { version = "0.11", features = [ "gzip", "brotli", "deflate", "json" ] } @@ -27,12 +34,22 @@ protobuf = "=3.2.0" serde = { version = "1.0", features = [ "derive" ] } serde_json = "1.0" -# TODO: upgrade # Near specific -near-crypto = "0.17" -near-jsonrpc-client = "0.6" -near-primitives = "0.17" -near-primitives-core = "0.17" +near-crypto = "0.20" +near-jsonrpc-client = "0.8" +near-jsonrpc-primitives = "0.20" +near-primitives = "0.20" +near-primitives-core = "0.20" + +near-light-client-protocol = { path = "crates/protocol" } +near-light-client-rpc = { path = "crates/rpc" } +near-light-clientx = { path = "circuits/plonky2x" } +test-utils = { path = "crates/test-utils" } + +[patch."https://github.com/succinctlabs/starkyx.git"] +starkyx = { git = "https://github.com/dndll/starkyx.git" } +#curta = { path = "./vendor/starkyx/starkyx" } -[dev-dependencies] -rand = "*" +[patch."https://github.com/succinctlabs/succinctx.git"] +#plonky2x = { path = "./vendor/succinctx/plonky2x/core" } +plonky2x = { git = "https://github.com/dndll/succinctx.git" } diff --git a/Makefile b/Makefile index 7de0c96..7623105 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,81 @@ +.EXPORT_ALL_VARIABLES: +-include .env + TAG_PREFIX?=near -IMAGE_TAG?=0.0.1 +IMAGE_TAG?=0.0.3 docker: DOCKER_BUILDKIT=1 docker build --progress=plain -t $(TAG_PREFIX)/light-client:$(IMAGE_TAG) . + +test: + cargo test --workspace + +# Runs all of the beefy tests that require a pretty good machine, builds all proofs in release mode +# NOTE: this might OOM if your machine is small! At least 32GB of ram is recommended with a very modern CPU. +# Likely OSX will not work and your fans will turn on! +beefy-test: + RUST_LOG=debug cargo test --workspace --ignored --release + +BUILDCIRCUIT := cargo build --release --bin near-light-clientx --features +MVCIRCUIT := mv -f target/release/near-light-clientx + +build-sync-circuit: + $(BUILDCIRCUIT) sync + $(MVCIRCUIT) build/sync + RUST_LOG=debug ./build/sync build +.PHONY: build-sync-circuit + +prove-sync-circuit: + RUST_LOG=debug ./build/sync prove input.json + +# TODO: build various parameters of NUM:BATCH, e.g 1024x64 2x1, 128x4, etc +build-verify-circuit: + $(BUILDCIRCUIT) verify + $(MVCIRCUIT) build/verify + RUST_LOG=debug ./build/verify build +.PHONY: build-verify-circuit + +prove-verify-circuit: + RUST_LOG=debug ./build/verify prove input.json + +# TODO: these should be configurable and need updating +SYNC_FUNCTION_ID=0x350c2939eb7ff2185612710a2b641b4b46faab68e1e2c57b6f15e0af0674f5e9 +VERIFY_FUNCTION_ID=0x39fb2562b80725bb7538dd7d850126964e565a1a837d2d7f2a018e185b08fc0e +ETH_RPC=https://rpc.goerli.eth.gateway.fm +NEAR_CHECKPOINT_HEADER_HASH=0x63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3 +CHAIN_ID=5 +CD_CONTRACTS=cd ./circuits/plonky2x/contract + +build-contracts: + $(CD_CONTRACTS) && forge build + +deploy: build-contracts + $(CD_CONTRACTS) && forge script Deploy \ + --rpc-url $(ETH_RPC) \ + --private-key $$ETH_PRIVATE_KEY \ + --broadcast \ + --verify \ + --verifier etherscan + +initialise: + $(CD_CONTRACTS) && forge script Initialise \ + --rpc-url $(ETH_RPC) \ + --private-key $$ETH_PRIVATE_KEY \ + --broadcast \ + --verify \ + --verifier etherscan +upgrade: + $(CD_CONTRACTS) && forge script Upgrade \ + --rpc-url $(ETH_RPC) \ + --private-key $$ETH_PRIVATE_KEY \ + --broadcast \ + --verify \ + --verifier etherscan +verify: + $(CD_CONTRACTS) && forge script Verify \ + --rpc-url $(ETH_RPC) \ + --private-key $$ETH_PRIVATE_KEY \ + --broadcast \ + --verify \ + --verifier etherscan + diff --git a/bin/client/Cargo.toml b/bin/client/Cargo.toml new file mode 100644 index 0000000..9032d08 --- /dev/null +++ b/bin/client/Cargo.toml @@ -0,0 +1,37 @@ +[package] +edition.workspace = true +license.workspace = true +name = "near-light-client" +version.workspace = true + +[dependencies] +anyhow.workspace = true +async-trait.workspace = true +axum.workspace = true +borsh.workspace = true +reqwest.workspace = true +serde.workspace = true +serde_json.workspace = true +sled.workspace = true +thiserror.workspace = true +tokio.workspace = true +coerce.workspace = true +config.workspace = true +either.workspace = true +futures.workspace = true +hex.workspace = true +itertools.workspace = true +log.workspace = true +pretty_env_logger.workspace = true +protobuf.workspace = true + +near-crypto.workspace = true +near-jsonrpc-client.workspace = true +near-primitives-core.workspace = true +near-primitives.workspace = true + +protocol = { path = "../../crates/protocol", package = "near-light-client-protocol" } +rpc = { path = "../../crates/rpc", package = "near-light-client-rpc" } + +[dev-dependencies] +rand = "*" diff --git a/src/client/message.rs b/bin/client/src/client/message.rs similarity index 76% rename from src/client/message.rs rename to bin/client/src/client/message.rs index d32a46c..b7f67c3 100644 --- a/src/client/message.rs +++ b/bin/client/src/client/message.rs @@ -1,7 +1,8 @@ -use super::{protocol::experimental::Proof as ExperimentalProof, Header, Proof}; -use crate::prelude::*; use coerce::actor::message::Message; use near_primitives::types::TransactionOrReceiptId; +use protocol::{experimental::Proof as ExperimentalProof, Proof}; + +use crate::prelude::*; pub struct Shutdown; @@ -34,7 +35,7 @@ impl Message for GetProof { pub struct BatchGetProof(pub Vec); impl Message for BatchGetProof { - type Result = Option<(ExperimentalProof, Vec)>; + type Result = Option; } pub struct VerifyProof { @@ -44,13 +45,3 @@ pub struct VerifyProof { impl Message for VerifyProof { type Result = Result; } - -// TODO: batch messages -// -// -#[cfg(test)] -mod tests { - - #[test] - fn test_name() {} -} diff --git a/src/client/mod.rs b/bin/client/src/client/mod.rs similarity index 74% rename from src/client/mod.rs rename to bin/client/src/client/mod.rs index 2bd45b9..497a925 100644 --- a/src/client/mod.rs +++ b/bin/client/src/client/mod.rs @@ -1,60 +1,22 @@ -use self::{message::BatchGetProof, store::Store}; -use crate::prelude::*; -use crate::{ - client::{ - protocol::Protocol, - store::{head_key, Collection, Entity}, - }, - config::Config, -}; +use std::{str::FromStr, sync::Arc}; + use coerce::actor::{context::ActorContext, message::Handler, Actor}; use message::{Archive, GetProof, Head, Shutdown, VerifyProof}; use near_primitives::views::validator_stake_view::ValidatorStakeView; -use std::{str::FromStr, sync::Arc}; +use protocol::{Proof, Protocol}; +use rpc::LightClientRpc; use tokio::time; -pub mod error; +use self::{message::BatchGetProof, store::Store}; +use crate::{ + client::store::{head_key, Collection, Entity}, + config::Config, + prelude::*, +}; + pub mod message; -pub mod protocol; -pub mod rpc; mod store; -#[derive(Debug, Serialize, Deserialize)] -#[serde(untagged)] -pub enum Proof { - Basic { - head_block_root: CryptoHash, - proof: Box, - }, - Experimental(protocol::experimental::Proof), -} - -impl From<(CryptoHash, BasicProof)> for Proof { - fn from((head_block_root, proof): (CryptoHash, BasicProof)) -> Self { - Self::Basic { - head_block_root, - proof: Box::new(proof), - } - } -} - -impl From for Proof { - fn from(proof: protocol::experimental::Proof) -> Self { - Self::Experimental(proof) - } -} - -impl Proof { - pub fn block_merkle_root(&self) -> &CryptoHash { - match self { - Self::Basic { - head_block_root, .. - } => head_block_root, - Self::Experimental(proof) => &proof.head_block_root, - } - } -} - pub struct LightClient { config: Config, client: rpc::NearRpcClient, @@ -151,7 +113,7 @@ impl Handler for LightClient { impl LightClient { pub fn new(config: &Config) -> Result { - let client = rpc::NearRpcClient::new(config.network.clone()); + let client = rpc::NearRpcClient::new(config.network); // TODO: store selector in config let store = store::sled::init(config)?; @@ -172,7 +134,7 @@ impl LightClient { let starting_head = self .client .fetch_latest_header(&sync_from) - .await + .await? .ok_or_else(|| anyhow::anyhow!("We need a starting header"))?; log::info!("starting head: {:?}", starting_head.inner_lite.height); @@ -242,14 +204,14 @@ impl LightClient { client: rpc::NearRpcClient, ) -> Result { let head = store.head().await?; - log::debug!("Current head: {:#?}", head.inner_lite); + log::debug!("Current head: {:#?}", head); let next_header = client .fetch_latest_header( &CryptoHash::from_str(&format!("{}", head.hash())) .map_err(|e| anyhow!("Failed to parse hash: {:?}", e))?, ) - .await + .await? .ok_or_else(|| anyhow!("Failed to fetch latest header"))?; log::trace!("Got new header: {:#?}", next_header.inner_lite); @@ -282,30 +244,6 @@ impl LightClient { .ok() } - pub async fn batch_fetch_proofs( - &self, - last_verified_hash: &CryptoHash, - p: BatchGetProof, - collect_errors: bool, - ) -> Result<(Vec, Vec)> { - let mut futs = vec![]; - for req in p.0 { - let proof = self - .client - .fetch_light_client_proof(req, *last_verified_hash); - futs.push(proof); - } - let unpin_futs: Vec<_> = futs.into_iter().map(Box::pin).collect(); - - let proofs: Vec> = futures::future::join_all(unpin_futs).await; - let (proofs, errors): (Vec<_>, Vec<_>) = if collect_errors { - proofs.into_iter().partition_result() - } else { - (proofs.into_iter().collect::>>()?, vec![]) - }; - Ok((proofs, errors)) - } - pub async fn verify_proof(&self, p: Proof) -> Result { anyhow::ensure!( self.store @@ -317,32 +255,49 @@ impl LightClient { Protocol::inclusion_proof_verify(p) } - // TODO: this and below are the same except from two lines - pub async fn get_proofs(&self, p: BatchGetProof) -> Result> { + pub async fn get_proofs(&self, req: BatchGetProof) -> Result> { + let req = req.0.into_iter().map(|p| p.0).collect(); let head = self.store.head().await?; - let proofs = self.batch_fetch_proofs(&head.hash(), p, false).await?.0; + let proofs = self.client.batch_fetch_proofs(&head.hash(), req).await; + let (oks, errs): (Vec<_>, Vec<_>) = proofs.into_values().partition_result(); + + if !errs.is_empty() { + return Err(anyhow::format_err!("Failed to fetch proofs: {:?}", errs)); + } self.store .insert(&[(head.inner_lite.block_merkle_root, Entity::UsedRoot)]) .await?; - Ok(proofs + Ok(oks .into_iter() .map(|x| (head.inner_lite.block_merkle_root, x)) .map(Into::into) .collect()) } - pub async fn experimental_get_proofs( - &self, - p: BatchGetProof, - ) -> Result<(ExperimentalProof, Vec)> { + pub async fn experimental_get_proofs(&self, req: BatchGetProof) -> Result { + let req = req.0.into_iter().map(|p| p.0).collect(); + let head = self.store.head().await?; - let (proofs, errors) = self.batch_fetch_proofs(&head.hash(), p, true).await?; - let p = protocol::experimental::Proof::new(head.inner_lite.block_merkle_root, proofs); - self.store - .insert(&[(head.inner_lite.block_merkle_root, Entity::UsedRoot)]) - .await?; + let proofs = self.client.batch_fetch_proofs(&head.hash(), req).await; - Ok((p, errors)) + let (oks, errs): (Vec<_>, Vec<_>) = proofs.into_values().partition_result(); + if !errs.is_empty() { + Err(anyhow::format_err!("Failed to fetch proofs: {:?}", errs)) + } else { + let p = protocol::experimental::Proof::new(head.inner_lite.block_merkle_root, oks); + self.store + .insert(&[(head.inner_lite.block_merkle_root, Entity::UsedRoot)]) + .await?; + + Ok(p) + } } } + +#[cfg(test)] +mod tests { + + #[test] + fn t() {} +} diff --git a/src/client/store.rs b/bin/client/src/client/store.rs similarity index 91% rename from src/client/store.rs rename to bin/client/src/client/store.rs index 1bc3397..e263b4f 100644 --- a/src/client/store.rs +++ b/bin/client/src/client/store.rs @@ -1,9 +1,10 @@ -use super::Header; -use crate::prelude::*; use ::sled::IVec; use near_primitives::types::validator_stake::ValidatorStake; use tokio::sync::RwLock; +use super::Header; +use crate::prelude::*; + pub struct Store(pub RwLock); impl Store { @@ -94,31 +95,16 @@ pub trait DatabaseOperations { fn shutdown(&mut self); } -fn encode(x: &T) -> Result> { - x.try_to_vec().map_err(|e| { - let e = anyhow::format_err!("Failed to encode: {:?}", e); - log::error!("{:?}", e); - e - }) -} - -fn decode(x: &[u8]) -> Result { - T::try_from_slice(x).map_err(|e| { - let e = anyhow::format_err!("Failed to decode: {:?}", e); - log::error!("{:?}", e); - e - }) -} - pub fn head_key() -> CryptoHash { CryptoHash::default() } pub mod sled { - use super::*; use ::sled::{open, transaction::TransactionError, Batch, Db, Transactional, Tree}; use itertools::Itertools; + use super::*; + pub struct Store { db: Db, block_producers: Tree, @@ -162,7 +148,7 @@ pub mod sled { Collection::UsedRoots => self.used_roots.get(key), }? .ok_or_else(|| anyhow::anyhow!("Key not found")) - .and_then(|value| decode(&value)) + .and_then(|value| T::try_from_slice(&value).map_err(|e| anyhow::anyhow!(e))) } fn shutdown(&mut self) { @@ -228,8 +214,8 @@ pub mod sled { .map(|(k, v)| { log::debug!("Insert {:?}", k); log::trace!("Insert {:?}", v); - encode(k).and_then(|ek| { - encode(v).map(|ev| { + borsh::to_vec(k).and_then(|ek| { + borsh::to_vec(v).map(|ev| { let collection = match v { Entity::BlockProducers(_) => Collection::BlockProducers, Entity::Header(_) => Collection::Headers, @@ -247,15 +233,15 @@ pub mod sled { } fn get(&self, collection: &Collection, k: &CryptoHash) -> Result { - self.raw_get(collection, encode(k)?) + self.raw_get(collection, borsh::to_vec(k)?) } fn head(&self) -> Result
{ let head = self .headers - .get(encode(&head_key())?)? + .get(borsh::to_vec(&head_key())?)? .ok_or_else(|| anyhow::anyhow!("Failed to get head, no head in store"))?; - let h: Entity = decode(&head)?; + let h: Entity = borsh::from_slice(&head)?; h.header() } @@ -264,7 +250,7 @@ pub mod sled { } fn contains(&self, collection: &Collection, k: &CryptoHash) -> Result { - self.raw_contains(collection, encode(k)?) + self.raw_contains(collection, borsh::to_vec(k)?) } } @@ -276,9 +262,9 @@ pub mod sled { let ref_count = old_ref .map(|ov| ov.to_vec()) .and_then(|ov| u32::try_from_slice(&ov).ok()) - .unwrap_or_else(|| 0); + .unwrap_or(0); log::debug!("Incrementing ref count for {:?}, {}", key, ref_count); - (ref_count + 1).try_to_vec().ok() + borsh::to_vec(&(ref_count + 1)).ok() } #[cfg(test)] mod tests { diff --git a/src/config.rs b/bin/client/src/config.rs similarity index 95% rename from src/config.rs rename to bin/client/src/config.rs index b8aafe3..df8b86f 100644 --- a/src/config.rs +++ b/bin/client/src/config.rs @@ -1,8 +1,10 @@ -use crate::client::rpc::Network; -use crate::prelude::*; -use config::{Config as ConfigTrait, ConfigError, Environment, File}; use std::{env, path::PathBuf}; +use config::{Config as ConfigTrait, ConfigError, Environment, File}; +use rpc::Network; + +use crate::prelude::*; + #[derive(Debug, Deserialize, Clone)] pub struct Config { #[serde(default = "default_db_path")] @@ -27,6 +29,8 @@ impl Config { let run_mode = env::var("NEAR_LIGHT_CLIENT_NETWORK") .unwrap_or_else(|_| "testnet".into()) .to_lowercase(); + log::debug!("Run mode {run_mode}"); + let default_path = env::var("NEAR_LIGHT_CLIENT_CONFIG_FILE").unwrap_or_else(|_| "default".to_string()); diff --git a/src/controller.rs b/bin/client/src/controller.rs similarity index 80% rename from src/controller.rs rename to bin/client/src/controller.rs index 49f219f..1d8c027 100644 --- a/src/controller.rs +++ b/bin/client/src/controller.rs @@ -1,6 +1,7 @@ -use crate::prelude::*; -use crate::{client::LightClient, config::Config}; +use std::{net::SocketAddr, str::FromStr}; + use axum::{ + body, extract::{Path, State}, http::StatusCode, response::{IntoResponse, Response}, @@ -10,6 +11,8 @@ use axum::{ use coerce::actor::LocalActorRef; use tokio::task::JoinHandle; +use crate::{client::LightClient, config::Config, prelude::*}; + // TODO: replace with jsonrpc pub(crate) fn init(config: &Config, ctx: LocalActorRef) -> JoinHandle> { let controller = Router::new() @@ -26,16 +29,15 @@ pub(crate) fn init(config: &Config, ctx: LocalActorRef) -> JoinHand .with_state(ctx.clone()); let host = config.host.clone(); - tokio::spawn(async { - let listener = tokio::net::TcpListener::bind(host).await.map_err(|e| { - log::error!("Failed to start server: {:?}", e); - anyhow::anyhow!(e) - })?; - println!("listening on {}", listener.local_addr().unwrap()); - axum::serve(listener, controller).await.map_err(|e| { - log::error!("Failed to start server: {:?}", e); - anyhow::anyhow!(e) - }) + tokio::spawn(async move { + let addr = SocketAddr::from_str(&host).map_err(|e| anyhow::anyhow!(e))?; + axum::Server::bind(&addr) + .serve(controller.into_make_service()) + .await + .map_err(|e| { + log::error!("Failed to start server: {:?}", e); + anyhow::anyhow!(e) + }) }) } @@ -78,12 +80,11 @@ mod header { } mod proof { - use super::*; - use crate::client::{ - message::{BatchGetProof, GetProof, VerifyProof}, - Proof, - }; use axum::Json; + use protocol::Proof; + + use super::*; + use crate::client::message::{BatchGetProof, GetProof, VerifyProof}; pub(super) async fn post_get_proof( State(client): State>, @@ -113,7 +114,7 @@ mod proof { #[derive(Debug, Serialize)] pub struct BatchProofWithErrors { - proofs: crate::client::protocol::experimental::Proof, + proofs: protocol::experimental::Proof, errors: Vec, } @@ -128,10 +129,6 @@ mod proof { .and_then(|x| x.ok_or_else(|| anyhow::anyhow!("Failed to get batch proof"))) .map_err(ErrorMapper) .map_err(IntoResponse::into_response) - .map(|(proofs, errors)| BatchProofWithErrors { - proofs, - errors: errors.into_iter().map(|e| e.to_string()).collect(), - }) .map(axum::Json) } } @@ -142,7 +139,7 @@ where T: ToString, { fn into_response(self) -> Response { - let mut r = Response::new(self.0.to_string().into()); + let mut r = Response::new(body::boxed(self.0.to_string())); *r.status_mut() = StatusCode::INTERNAL_SERVER_ERROR; r } diff --git a/src/main.rs b/bin/client/src/main.rs similarity index 58% rename from src/main.rs rename to bin/client/src/main.rs index 24b49e3..48844ff 100644 --- a/src/main.rs +++ b/bin/client/src/main.rs @@ -1,6 +1,7 @@ -use crate::client::{message::Shutdown, LightClient}; use coerce::actor::{system::ActorSystem, IntoActor}; +use crate::client::{message::Shutdown, LightClient}; + mod client; mod config; mod controller; @@ -31,17 +32,6 @@ async fn main() -> anyhow::Result<()> { } pub mod prelude { - pub use anyhow::anyhow; - pub use anyhow::Result; pub use async_trait::async_trait; - pub use itertools::Itertools; - pub use log::{debug, error, info, trace, warn}; - pub use near_primitives::borsh::{self, BorshDeserialize, BorshSerialize}; - pub use near_primitives_core::hash::CryptoHash; - pub use serde::{Deserialize, Serialize}; - - pub type Header = near_primitives::views::LightClientBlockLiteView; - pub type BasicProof = - near_jsonrpc_client::methods::light_client_proof::RpcLightClientExecutionProofResponse; - pub type ExperimentalProof = super::client::protocol::experimental::Proof; + pub use protocol::prelude::*; } diff --git a/build/.gitkeep b/build/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/crates/protocol/Cargo.toml b/crates/protocol/Cargo.toml new file mode 100644 index 0000000..6c2afb3 --- /dev/null +++ b/crates/protocol/Cargo.toml @@ -0,0 +1,34 @@ +[package] +edition.workspace = true +license.workspace = true +name = "near-light-client-protocol" +version.workspace = true + +[dependencies] +anyhow.workspace = true +borsh.workspace = true +either.workspace = true +itertools.workspace = true +log.workspace = true +near-crypto.workspace = true +near-jsonrpc-primitives.workspace = true +near-primitives-core.workspace = true +near-primitives.workspace = true +serde.workspace = true +thiserror.workspace = true + +# async-trait.workspace = true +# axum.workspace = true +# coerce.workspace = true +# config.workspace = true +# near-jsonrpc-client.workspace = true +# protobuf.workspace = true +# reqwest.workspace = true +# sled.workspace = true + +[dev-dependencies] +hex.workspace = true +pretty_env_logger.workspace = true +rand = "*" +serde_json.workspace = true +test-utils.workspace = true diff --git a/crates/protocol/src/config.rs b/crates/protocol/src/config.rs new file mode 100644 index 0000000..8e8971f --- /dev/null +++ b/crates/protocol/src/config.rs @@ -0,0 +1,7 @@ +// https://github.com/near/nearcore/blob/master/nearcore/src/config.rs#L133C1-L134C1 +// TODO: expose this from NP, currently this is a risk that the light client +// could be exploited if the max seats changes without knowing +pub const NUM_BLOCK_PRODUCER_SEATS: usize = 50; + +// Used by nearcore to determine the end of the account in the state trie. +pub const ACCOUNT_DATA_SEPARATOR: u8 = b','; diff --git a/src/client/error.rs b/crates/protocol/src/error.rs similarity index 100% rename from src/client/error.rs rename to crates/protocol/src/error.rs diff --git a/src/client/protocol/experimental.rs b/crates/protocol/src/experimental.rs similarity index 78% rename from src/client/protocol/experimental.rs rename to crates/protocol/src/experimental.rs index 5209404..ad8aaad 100644 --- a/src/client/protocol/experimental.rs +++ b/crates/protocol/src/experimental.rs @@ -1,6 +1,5 @@ -use crate::client::protocol::Protocol; -use crate::prelude::*; use either::Either; +use itertools::Itertools; use near_primitives::{ block_header::BlockHeaderInnerLite, merkle::{combine_hash, MerklePathItem}, @@ -9,6 +8,8 @@ use near_primitives::{ use near_primitives_core::hash::CryptoHash; use serde::{Deserialize, Serialize}; +use crate::{prelude::*, Protocol}; + /// Requires only needed parts of the LightClientBlockLiteView, and pre hashes /// the inner_lite. #[derive(Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize)] @@ -326,35 +327,20 @@ pub fn verify_proof(proof: Proof) -> bool { #[cfg(test)] pub(crate) mod tests { - use super::*; - use crate::client::{ - protocol::merkle_util::{compute_root_from_path, compute_root_from_path_and_item}, - rpc::{NearRpcClient, Network}, - }; - use futures::FutureExt; - use near_primitives::types::TransactionOrReceiptId; - use near_primitives_core::types::AccountId; - use std::{path::Path, str::FromStr}; + use std::str::FromStr; - pub const BLOCK_MERKLE_ROOT: &str = "WWrLWbWHwSmjtTn5oBZPYgRCuCYn6fkYVa4yhPWNK4L"; - pub const LIGHT_CLIENT_HEAD: &str = "4bM5eXMDGxpFZXbWNT6TqX1HdZsWoHZ11KerCHJ8RKmU"; + use test_utils::fixture; - pub fn get_constants() -> (CryptoHash, CryptoHash, NearRpcClient) { - let client = NearRpcClient::new(Network::Testnet); - let block_root = CryptoHash::from_str(BLOCK_MERKLE_ROOT).unwrap(); - let light_client_head = CryptoHash::from_str(LIGHT_CLIENT_HEAD).unwrap(); - (light_client_head, block_root, client) - } + use super::*; + use crate::merkle_util::{compute_root_from_path, compute_root_from_path_and_item}; - fn read_proof Deserialize<'a>>(path: &str) -> T { - println!("Reading {}", path); - serde_json::from_reader(std::fs::File::open(path).unwrap()).unwrap() - } + pub const BLOCK_MERKLE_ROOT: &str = "WWrLWbWHwSmjtTn5oBZPYgRCuCYn6fkYVa4yhPWNK4L"; + #[allow(dead_code)] fn write_proof(path: &str, proof: &Proof) { std::fs::write( path.to_string().replace(".json", ".hex"), - hex::encode(proof.try_to_vec().unwrap()), + hex::encode(borsh::to_vec(&proof).unwrap()), ) .unwrap(); let json = serde_json::to_string_pretty(&proof).unwrap(); @@ -363,12 +349,8 @@ pub(crate) mod tests { } fn proof_fixture(is_new: bool) -> BasicProof { - let path = if is_new { - "fixtures/new.json" - } else { - "fixtures/old.json" - }; - read_proof(path) + let path = if is_new { "new.json" } else { "old.json" }; + fixture(path) } #[test] @@ -419,8 +401,8 @@ pub(crate) mod tests { let mut blinded = original.into_iter().map(BlindedProof::from).collect_vec(); let mut cache = MerkleCache::default(); cache.cache(&mut blinded); - // Since the proofs were the same, the cache should contain all of the paths for all of the - // proofs + // Since the proofs were the same, the cache should contain all of the paths for + // all of the proofs itertools::assert_equal(paths, cache.items); } @@ -450,7 +432,7 @@ pub(crate) mod tests { println!("{:#?}", proof_size); let batch = vec![proof1, proof2]; let proof = Proof::new(root, batch); - let new_proof_size = proof.try_to_vec().unwrap().len(); + let new_proof_size = borsh::to_vec(&proof).unwrap().len(); assert!(new_proof_size < proof_size / 2); println!("{:#?}", new_proof_size); @@ -495,10 +477,10 @@ pub(crate) mod tests { }) .all(|(block_root, path)| { let proof = if path.contains("old") { - let proof: BasicProof = read_proof(&path); + let proof: BasicProof = fixture(&path); Proof::new(block_root, vec![proof]) } else { - read_proof(&path) + fixture(&path) }; write_proof(&path, &proof); @@ -507,69 +489,10 @@ pub(crate) mod tests { assert!(rewritten); } - // This test populates a reasonably large batch of proofs for verifying the - // slimmer onchain light client - #[tokio::test] - async fn batch_proofs() { + #[test] + fn batch_proofs() { let _ = pretty_env_logger::try_init(); - let (head, common_root, client) = get_constants(); - let receiver_id = AccountId::from_str("da.topgunbakugo.testnet").unwrap(); - - let path = "fixtures/batch.json"; - - let p = if Path::new(path).exists() { - read_proof(path) - } else { - // Get a bunch of receipts to test - let receipts = vec![ - "2QUBErafE2zU3dV9HBYCUyqpcP74erBm7k1j7tXduRa2", - "BixAd4vjnYKzxNtSLGD5w7jk7vD3ZedesHizutwWvDDK", - "6W5LXCxFwg21XMxVLqZMzq24g531kFu2hxBr2N5yN67f", - "Dwwv7KeNP8H9Pr6suUkAqDwex8mp1vK3KykE7asjaYHk", - "D75Ej8NJ8kYE62CnaVX3p8SCHiNLBQCA7pLpudeRbnM6", - "ERDrqb65Sa8mKr4XrXCw1uBae3a8mrByLPcEN92zewfG", - "FuNDcy6u3sS5B8j1szxZGTh6BCjsDTWfUbfFWsFwUyPA", - "2EVVdVsw1nM3hRFV4LTkBYYRWPCR77TVmYxZwipLHmYn", - "9Exwa5z51bTGWPzMMkRcVdGZ6a8rpu4CuWfAvrMuqXHn", - "J65AycXr48nCqrRc8eErLp5AiQb6xUAWF1sgG2fRbn9t", - "5axBiFL3GkvizK4KobsJjzychu7UckoKACnX23RefhoS", - "GEG9nhhwbgMHw61fTrFYvtpeRidAB6NKmNFJmkMc8AuE", - "BFdir5jFtyWQWoLPbxWEGtRedbjgt4nSPcDrdNfWLXcd", - "48tF8CXXLLaUgEbvayqhvX1UZLzLrqSjVJBq5bWXFX7T", - "3L2vmfXBZzMGoXx8bLDaSRxtp2dV65SZr3rYKM46wqe1", - "4g3zeZEt4UrXqFh8Vxcdz8UCGaBBdT7K7MELrnNbu3PH", - "2r652tQLr8kpGtY6KQNLhVC4j6S5jwC1Q6VcuLxQM1UQ", - "DNAQsgrEqJ6kYhqaXbhCNP5W4K891jLUhBtY3nsU17dv", - "EJCfAgRT3x8hPmTvLJgqexuwRqhgujUKbby4b81ypXX4", - "3FFWvbPQXkpQNvGwJ6NkkJtya6XXo8x88Wmhoyv6ABQU", - "BVgDgRBcJJoXeFYarSTrsH9NYe6kgfC14Des88hSJp1j", - "EcnvcNZDgwyiBP7NpV2afkDDvPCmw5rwKT2MLiG1jUFD", - "Hbjut1evHnfm1Ee9eeGJe5ydorVE3W66RacprLuciFpY", - "AKknXHv6Y7iyD44yyTjdTLmgC8AM9CmUHtLXvgEh4qdS", - ] - .into_iter() - .map(CryptoHash::from_str) - .map(Result::unwrap) - .map(|receipt_id| { - client - .fetch_light_client_proof( - crate::client::message::GetProof(TransactionOrReceiptId::Receipt { - receipt_id, - receiver_id: receiver_id.clone(), - }), - head, - ) - .map(Result::unwrap) - }) - .collect_vec(); - - let proofs: Vec<_> = futures::future::join_all(receipts).await; - - let p = Proof::new(common_root, proofs); - write_proof(path, &p); - p - }; - + let p = fixture("batch.json"); assert!(verify_proof(p)); } } diff --git a/src/client/protocol/mod.rs b/crates/protocol/src/lib.rs similarity index 82% rename from src/client/protocol/mod.rs rename to crates/protocol/src/lib.rs index 9e00d9f..3e09afa 100644 --- a/src/client/protocol/mod.rs +++ b/crates/protocol/src/lib.rs @@ -1,15 +1,23 @@ -use super::{error::Error, Proof}; -use crate::prelude::*; -use merkle_util::*; -use near_crypto::{PublicKey, Signature}; -use near_primitives::{ - block_header::ApprovalInner, +use config::NUM_BLOCK_PRODUCER_SEATS; +use error::Error; +pub use merkle_util::*; +pub use near_crypto::{ED25519PublicKey, PublicKey, Signature}; +pub use near_primitives::{ + block_header::{ApprovalInner, BlockHeaderInnerLite}, merkle::MerklePathItem, types::{validator_stake::ValidatorStake, BlockHeight, EpochId}, - views::{validator_stake_view::ValidatorStakeView, LightClientBlockView}, + views::{ + validator_stake_view::ValidatorStakeView, BlockHeaderInnerLiteView, + LightClientBlockLiteView, LightClientBlockView, ValidatorStakeViewV1, + }, }; +use crate::prelude::*; + +pub mod config; +pub mod error; pub mod merkle_util; +pub mod prelude; // Lightweight batch protocol with lookups for proofs pub mod experimental; @@ -19,6 +27,42 @@ pub struct Synced { pub next_bps: Option<(EpochId, Vec)>, } +#[derive(Debug, Serialize, Deserialize)] +#[serde(untagged)] +pub enum Proof { + Basic { + head_block_root: CryptoHash, + proof: Box, + }, + Experimental(experimental::Proof), +} + +impl From<(CryptoHash, BasicProof)> for Proof { + fn from((head_block_root, proof): (CryptoHash, BasicProof)) -> Self { + Self::Basic { + head_block_root, + proof: Box::new(proof), + } + } +} + +impl From for Proof { + fn from(proof: experimental::Proof) -> Self { + Self::Experimental(proof) + } +} + +impl Proof { + pub fn block_merkle_root(&self) -> &CryptoHash { + match self { + Self::Basic { + head_block_root, .. + } => head_block_root, + Self::Experimental(proof) => &proof.head_block_root, + } + } +} + pub struct Protocol; impl Protocol { @@ -71,7 +115,6 @@ impl Protocol { synced }) } - pub fn inclusion_proof_verify(proof: Proof) -> Result { match proof { Proof::Experimental(proof) => Ok(experimental::verify_proof(proof)), @@ -114,8 +157,16 @@ impl Protocol { expected_outcome_root: &CryptoHash, ) -> bool { let outcome_root = compute_root_from_path(outcome_proof, *outcome_hash); + #[cfg(test)] + println!("outcome_root: {:?}", hex::encode(outcome_root)); + + let leaf = CryptoHash::hash_borsh(outcome_root); + #[cfg(test)] + println!("leaf: {:?}", hex::encode(leaf)); - let outcome_root = compute_root_from_path_and_item(outcome_root_proof, outcome_root); + let outcome_root = compute_root_from_path(outcome_root_proof, leaf); + #[cfg(test)] + println!("outcome_root: {:?}", hex::encode(outcome_root)); log::debug!("outcome_root: {:?}", outcome_root); &outcome_root == expected_outcome_root @@ -129,37 +180,23 @@ impl Protocol { verify_hash(*block_merkle_root, block_proof, *block_hash) } - fn next_block_hash( - current_block_hash: &CryptoHash, - block_view: &LightClientBlockView, - ) -> CryptoHash { - // TODO: remove the check once tests pass - let old = CryptoHash::hash_bytes(&{ - let mut temp_vec = Vec::new(); - temp_vec.extend_from_slice(&(block_view.next_block_inner_hash.0)); - temp_vec.extend_from_slice(&(current_block_hash.0)); - temp_vec - }); - let new = combine_hash(&block_view.next_block_inner_hash, current_block_hash); - assert_eq!(old, new); - log::debug!("Current block hash: {}", current_block_hash); - new - } - - fn reconstruct_approval_message(block_view: &LightClientBlockView) -> Option> { + pub fn reconstruct_approval_message(block_view: &LightClientBlockView) -> Option> { let new_head = Header { prev_block_hash: block_view.prev_block_hash, inner_rest_hash: block_view.inner_rest_hash, inner_lite: block_view.inner_lite.clone(), }; - let next_block_hash = Self::next_block_hash(&new_head.hash(), block_view); + let next_block_hash = combine_hash(&block_view.next_block_inner_hash, &new_head.hash()); + let endorsement = ApprovalInner::Endorsement(next_block_hash); let approval_message = { let mut temp_vec = Vec::new(); - temp_vec.extend_from_slice(&(endorsement.try_to_vec().ok()?[..])); + BorshSerialize::serialize(&endorsement, &mut temp_vec).ok()?; + //temp_vec.extend_from_slice(&(endorsement.try_to_vec().ok()?[..])); temp_vec.extend_from_slice(&((block_view.inner_lite.height + 2).to_le_bytes()[..])); + println!("temp_vec len: {:?}", temp_vec.len()); temp_vec }; @@ -184,7 +221,12 @@ impl Protocol { epoch_id: &CryptoHash, ) -> Result<(), Error> { if ![head.inner_lite.epoch_id, head.inner_lite.next_epoch_id].contains(epoch_id) { - log::debug!("Block is not in the current or next epoch"); + log::debug!( + "Next Block Epoch({:?}) is not in the current({:?}) or next({:?}) epoch", + epoch_id, + head.inner_lite.epoch_id, + head.inner_lite.next_epoch_id + ); Err(Error::BlockNotCurrentOrNextEpoch) } else { Ok(()) @@ -205,13 +247,14 @@ impl Protocol { } pub fn validate_signatures( - signatures: &[Option], + signatures: &[Option>], epoch_bps: &[ValidatorStake], approval_message: &[u8], ) -> StakeInfo { signatures .iter() .zip(epoch_bps.iter()) + .take(NUM_BLOCK_PRODUCER_SEATS) .fold((0, 0), |(total_stake, approved_stake), (sig, vs)| { let pk = vs.public_key(); let stake = vs.stake(); @@ -228,9 +271,9 @@ impl Protocol { .into() } - fn validate_signature( + pub fn validate_signature( msg: &[u8], - sig: &Option, + sig: &Option>, pk: &PublicKey, ) -> Result<(), Error> { match sig { @@ -283,9 +326,9 @@ impl Protocol { } #[derive(Debug, Clone, PartialEq, Eq)] -pub(crate) struct StakeInfo { - total: u128, - approved: u128, +pub struct StakeInfo { + pub total: u128, + pub approved: u128, } impl From<(u128, u128)> for StakeInfo { @@ -309,65 +352,29 @@ macro_rules! cvec { #[cfg(test)] mod tests { - use super::*; use itertools::Itertools; - use near_jsonrpc_client::methods::light_client_proof::RpcLightClientExecutionProofResponse; + use near_jsonrpc_primitives::types::light_client::RpcLightClientExecutionProofResponse; use serde_json::{self}; + use test_utils::*; - fn fixture(file: &str) -> LightClientBlockView { - serde_json::from_reader(std::fs::File::open(format!("fixtures/{}", file)).unwrap()).unwrap() - } - - fn get_next_epoch() -> LightClientBlockView { - fixture("2.json") - } - - fn get_first_epoch() -> LightClientBlockView { - fixture("1.json") - } - - fn get_current_epoch() -> LightClientBlockView { - fixture("current_epoch.json") - } - - fn view_to_lite_view(h: LightClientBlockView) -> Header { - Header { - prev_block_hash: h.prev_block_hash, - inner_rest_hash: h.inner_rest_hash, - inner_lite: h.inner_lite, - } - } - - fn test_state() -> (Header, Vec, LightClientBlockView) { - let first = get_first_epoch(); - let next = get_next_epoch(); - - ( - view_to_lite_view(first.clone()), - first - .next_bps - .clone() - .unwrap() - .into_iter() - .map(Into::into) - .collect(), - next, - ) - } + use super::*; #[test] fn test_sync_across_epoch_boundaries() { - let (mut head, mut next_bps, next_block) = test_state(); + let (mut head, mut next_bps, next_block) = testnet_state(); + println!("head: {:#?}", head.inner_lite); let mut next_epoch_id = EpochId(head.inner_lite.next_epoch_id); let mut sync_and_update = |next_block: LightClientBlockView| { - let sync_next = Protocol::sync(&head, &next_bps, next_block.clone()).unwrap(); + let sync_next = Protocol::sync(&head, &next_bps[..], next_block.clone()).unwrap(); // Assert we matched the epoch id for the new BPS assert_eq!( head.inner_lite.next_epoch_id, sync_next.next_bps.as_ref().unwrap().0 .0 ); + println!("new head: {:#?}", sync_next.new_head.inner_lite); + head = sync_next.new_head; next_bps = sync_next.next_bps.unwrap().1; @@ -391,14 +398,12 @@ mod tests { sync_and_update(next_block.clone()); // Get next header, do next sync - let next_block = get_current_epoch(); - sync_and_update(next_block.clone()); + let next_block = test_last(); + sync_and_update(next_block.body); } #[test] fn test_validate_already_verified() { - pretty_env_logger::try_init().ok(); - let (head, _, _) = test_state(); assert_eq!( Protocol::ensure_not_already_verified(&head, &BlockHeight::MIN), @@ -408,8 +413,6 @@ mod tests { #[test] fn test_validate_bad_epoch() { - pretty_env_logger::try_init().ok(); - let (head, _, _) = test_state(); assert_eq!( Protocol::ensure_epoch_is_current_or_next( @@ -422,8 +425,6 @@ mod tests { #[test] fn test_next_epoch_bps_invalid() { - pretty_env_logger::try_init().ok(); - let (head, _, mut next_block) = test_state(); next_block.next_bps = None; @@ -439,8 +440,6 @@ mod tests { #[test] fn test_next_invalid_signature() { - pretty_env_logger::try_init().ok(); - let (_, next_bps, next_block) = test_state(); assert_eq!( Protocol::validate_signature( @@ -454,8 +453,6 @@ mod tests { #[test] fn test_next_invalid_signatures_no_approved_stake() { - pretty_env_logger::try_init().ok(); - let (_, next_bps, mut next_block) = test_state(); let approval_message = Protocol::reconstruct_approval_message(&next_block); @@ -473,28 +470,26 @@ mod tests { &approval_message.unwrap(), ); - assert_eq!((total, approved), (512915271547861520119028536348929, 0)); + assert_eq!((total, approved), (440511369730158962073902098744970, 0)); } #[test] fn test_next_invalid_signatures_stake_isnt_sufficient() { - pretty_env_logger::try_init().ok(); - let (_, next_bps, next_block) = test_state(); let approval_message = Protocol::reconstruct_approval_message(&next_block); let StakeInfo { total, approved } = Protocol::validate_signatures( &next_block.approvals_after_next, - &next_bps, + &next_bps[..], &approval_message.unwrap(), ); assert_eq!( (total, approved), ( - 512915271547861520119028536348929, - 345140782903867823005444871054881 + 440511369730158962073902098744970, + 296239000750863364078617965755968 ) ); @@ -510,8 +505,6 @@ mod tests { #[test] fn test_next_bps_invalid_hash() { - pretty_env_logger::try_init().ok(); - let (_, _, next_block) = test_state(); assert_eq!( @@ -525,8 +518,6 @@ mod tests { #[test] fn test_next_bps() { - pretty_env_logger::try_init().ok(); - let (_, _, next_block) = test_state(); assert_eq!( @@ -541,8 +532,6 @@ mod tests { #[test] fn test_next_bps_noop_on_empty() { - pretty_env_logger::try_init().ok(); - let (_, _, next_block) = test_state(); assert_eq!( Protocol::ensure_next_bps_is_valid(&next_block.inner_lite.next_bp_hash, None).unwrap(), @@ -552,7 +541,6 @@ mod tests { #[test] fn test_outcome_root() { - pretty_env_logger::try_init().ok(); let req = r#"{"outcome_proof":{"proof":[],"block_hash":"5CY72FinjVV2Hd5zRikYYMaKh67pftXJsw8vwRXAUAQF","id":"9UhBumQ3eEmPH5ALc3NwiDCQfDrFakteRD7rHE9CfZ32","outcome":{"logs":[],"receipt_ids":["2mrt6jXKwWzkGrhucAtSc8R3mjrhkwCjnqVckPdCMEDo"],"gas_burnt":2434069818500,"tokens_burnt":"243406981850000000000","executor_id":"datayalla.testnet","status":{"SuccessReceiptId":"2mrt6jXKwWzkGrhucAtSc8R3mjrhkwCjnqVckPdCMEDo"},"metadata":{"version":1,"gas_profile":null}}},"outcome_root_proof":[{"hash":"9f7YjLvzvSspJMMJ3DDTrFaEyPQ5qFqQDNoWzAbSTjTy","direction":"Right"},{"hash":"67ZxFmzWXbWJSyi7Wp9FTSbbJx2nMr7wSuW3EP1cJm4K","direction":"Left"}],"block_header_lite":{"prev_block_hash":"AEnTyGRrk2roQkYSWoqYhzkbp5SWWJtCd71ZYyj1P26i","inner_rest_hash":"G25j8jSWRyrXV317cPC3qYA4SyJWXsBfErjhBYQkxw5A","inner_lite":{"height":134481525,"epoch_id":"4tBzDozzGED3QiCRURfViVuyJy5ikaN9dVH7m2MYkTyw","next_epoch_id":"9gYJSiT3TQbKbwui5bdbzBA9PCMSSfiffWhBdMtcasm2","prev_state_root":"EwkRecSP8GRvaxL7ynCEoHhsL1ksU6FsHVLCevcccF5q","outcome_root":"8Eu5qpDUMpW5nbmTrTKmDH2VYqFEHTKPETSTpPoyGoGc","timestamp":1691615068679535000,"timestamp_nanosec":"1691615068679535094","next_bp_hash":"8LCFsP6LeueT4X3PEni9CMvH7maDYpBtfApWZdXmagss","block_merkle_root":"583vb6csYnczHyt5z6Msm4LzzGkceTZHdvXjC8vcWeGK"}},"block_proof":[{"hash":"AEnTyGRrk2roQkYSWoqYhzkbp5SWWJtCd71ZYyj1P26i","direction":"Left"},{"hash":"HgZaHXpb5zs4rxUQTeW69XBNLBJoo4sz2YEDh7aFnMpC","direction":"Left"},{"hash":"EYNXYsnESQkXo7B27a9xu6YgbDSyynNcByW5Q2SqAaKH","direction":"Right"},{"hash":"AbKbsD7snoSnmzAtwNqXLBT5sm7bZr48GCCLSdksFuzi","direction":"Left"},{"hash":"7KKmS7n3MtCfv7UqciidJ24Abqsk8m85jVQTh94KTjYS","direction":"Left"},{"hash":"5nKA1HCZMJbdCccZ16abZGEng4sMoZhKez74rcCFjnhL","direction":"Left"},{"hash":"BupagAycSLD7v42ksgMKJFiuCzCdZ6ksrGLwukw7Vfe3","direction":"Right"},{"hash":"D6v37P4kcVJh8N9bV417eqJoyMeQbuZ743oNsbKxsU7z","direction":"Right"},{"hash":"8sWxxbe1rdquP5VdYfQbw1UvtcXDRansJYJV5ySzyow4","direction":"Right"},{"hash":"CmKVKWRqEqi4UaeKKYXpPSesYqdQYwHQM3E4xLKEUAj8","direction":"Left"},{"hash":"3TvjFzVyPBvPpph5zL6VCASLCxdNeiKV6foPwUpAGqRv","direction":"Left"},{"hash":"AnzSG9f91ePS6L6ii3eAkocp4iKjp6wjzSwWsDYWLnMX","direction":"Right"},{"hash":"FYVJDL4T6c87An3pdeBvntB68NzpcPtpvLP6ifjxxNkr","direction":"Left"},{"hash":"2YMF6KE8XTz7Axj3uyAoFbZisWej9Xo8mxgVtauWCZaV","direction":"Left"},{"hash":"4BHtLcxqNfWSneBdW76qsd8om8Gjg58Qw5BX8PHz93hf","direction":"Left"},{"hash":"7G3QUT7NQSHyXNQyzm8dsaYrFk5LGhYaG7aVafKAekyG","direction":"Left"},{"hash":"3XaMNnvnX69gGqBJX43Na1bSTJ4VUe7z6h5ZYJsaSZZR","direction":"Left"},{"hash":"FKu7GtfviPioyAGXGZLBVTJeG7KY5BxGwuL447oAZxiL","direction":"Right"},{"hash":"BePd7DPKUQnGtnSds5fMJGBUwHGxSNBpaNLwceJGUcJX","direction":"Left"},{"hash":"2BVKWMd9pXZTEyE9D3KL52hAWAyMrXj1NqutamyurrY1","direction":"Left"},{"hash":"EWavHKhwQiT8ApnXvybvc9bFY6aJYJWqBhcrZpubKXtA","direction":"Left"},{"hash":"83Fsd3sdx5tsJkb6maBE1yViKiqbWCCNfJ4XZRsKnRZD","direction":"Left"},{"hash":"AaT9jQmUvVpgDHdFkLR2XctaUVdTti49enmtbT5hsoyL","direction":"Left"}]}"#; let p: RpcLightClientExecutionProofResponse = serde_json::from_str(req).unwrap(); diff --git a/src/client/protocol/merkle_util.rs b/crates/protocol/src/merkle_util.rs similarity index 67% rename from src/client/protocol/merkle_util.rs rename to crates/protocol/src/merkle_util.rs index 3da44a0..cd526b0 100644 --- a/src/client/protocol/merkle_util.rs +++ b/crates/protocol/src/merkle_util.rs @@ -1,8 +1,8 @@ -use crate::prelude::*; -pub use near_primitives::merkle::combine_hash; -pub use near_primitives::merkle::{Direction, MerklePathItem}; +pub use near_primitives::merkle::{combine_hash, Direction, MerklePath, MerklePathItem}; use near_primitives_core::types::MerkleHash; +use crate::prelude::*; + pub fn verify_hash<'a>( root: MerkleHash, path: impl Iterator, @@ -15,18 +15,18 @@ pub fn compute_root_from_path<'a>( path: impl Iterator, item_hash: MerkleHash, ) -> MerkleHash { - let mut res = item_hash; - for item in path { - match item.direction { + let mut hash_so_far = item_hash; + for uncle in path { + match uncle.direction { Direction::Left => { - res = combine_hash(&item.hash, &res); + hash_so_far = combine_hash(&uncle.hash, &hash_so_far); } Direction::Right => { - res = combine_hash(&res, &item.hash); + hash_so_far = combine_hash(&hash_so_far, &uncle.hash); } } } - res + hash_so_far } pub fn compute_root_from_path_and_item<'a, T: BorshSerialize>( diff --git a/crates/protocol/src/prelude.rs b/crates/protocol/src/prelude.rs new file mode 100644 index 0000000..13c83d2 --- /dev/null +++ b/crates/protocol/src/prelude.rs @@ -0,0 +1,14 @@ +pub use anyhow::{anyhow, Result}; +pub use itertools::{izip, Itertools}; +pub use log::{debug, error, info, trace, warn}; +pub use near_primitives::types::AccountId; +pub use near_primitives_core::{ + borsh::{self, BorshDeserialize, BorshSerialize}, + hash::CryptoHash, +}; +pub use serde::{Deserialize, Serialize}; + +pub type Header = near_primitives::views::LightClientBlockLiteView; +pub type BasicProof = + near_jsonrpc_primitives::types::light_client::RpcLightClientExecutionProofResponse; +pub type ExperimentalProof = crate::experimental::Proof; diff --git a/crates/rpc/Cargo.toml b/crates/rpc/Cargo.toml new file mode 100644 index 0000000..2e32c32 --- /dev/null +++ b/crates/rpc/Cargo.toml @@ -0,0 +1,37 @@ +[package] +edition.workspace = true +license.workspace = true +name = "near-light-client-rpc" +version.workspace = true + +[dependencies] +anyhow.workspace = true +async-trait.workspace = true +borsh.workspace = true +either.workspace = true +futures.workspace = true +itertools.workspace = true +log.workspace = true +near-crypto.workspace = true +near-jsonrpc-client.workspace = true +near-jsonrpc-primitives.workspace = true +near-primitives-core.workspace = true +near-primitives.workspace = true +serde.workspace = true +thiserror.workspace = true + +# async-trait.workspace = true +# axum.workspace = true +# coerce.workspace = true +# config.workspace = true +# near-jsonrpc-client.workspace = true +# protobuf.workspace = true +# reqwest.workspace = true +# sled.workspace = true + +[dev-dependencies] +hex.workspace = true +pretty_env_logger.workspace = true +rand = "*" +serde_json.workspace = true +tokio.workspace = true diff --git a/crates/rpc/src/lib.rs b/crates/rpc/src/lib.rs new file mode 100644 index 0000000..f82fc66 --- /dev/null +++ b/crates/rpc/src/lib.rs @@ -0,0 +1,329 @@ +use std::{ + collections::HashMap, + fmt::{Display, Formatter}, +}; + +use async_trait::async_trait; +use futures::TryFutureExt; +use near_jsonrpc_client::{ + methods::{self, light_client_proof::RpcLightClientExecutionProofResponse}, + JsonRpcClient, +}; +use near_primitives::{ + block_header::BlockHeader, + views::{validator_stake_view::ValidatorStakeView, LightClientBlockView}, +}; + +use crate::prelude::*; + +pub mod prelude; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default)] +pub enum Network { + Mainnet, + #[default] + Testnet, + Localnet, + Statelessnet, +} + +impl Network { + pub fn to_endpoint(&self) -> &str { + const MAINNET_RPC_ENDPOINT: &str = "https://rpc.mainnet.near.org"; + const TESTNET_RPC_ENDPOINT: &str = "https://rpc.testnet.near.org"; + match self { + Self::Mainnet => MAINNET_RPC_ENDPOINT, + Self::Testnet => TESTNET_RPC_ENDPOINT, + Self::Statelessnet => "https://rpc.statelessnet.near.org", + _ => "http://`localhost:3030", + } + } + pub fn archive_endpoint(&self) -> &str { + const MAINNET_RPC_ARCHIVE_ENDPOINT: &str = "https://archival-rpc.mainnet.near.org"; + const TESTNET_RPC_ARCHIVE_ENDPOINT: &str = "https://archival-rpc.testnet.near.org"; + match self { + Self::Mainnet => MAINNET_RPC_ARCHIVE_ENDPOINT, + Self::Testnet => TESTNET_RPC_ARCHIVE_ENDPOINT, + Self::Statelessnet => "https://archival-rpc.statelessnet.near.org", + _ => "http://`localhost:3030", + } + } +} + +impl From for Network { + fn from(n: usize) -> Self { + match n { + 0 => Self::Mainnet, + 1 => Self::Testnet, + 48 => Self::Statelessnet, + _ => Self::Localnet, + } + } +} + +impl Display for Network { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let s = match self { + Self::Mainnet => "mainnet", + Self::Testnet => "testnet", + Self::Statelessnet => "statelessnet", + _ => "localnet", + }; + write!(f, "{}", s) + } +} + +#[derive(Clone)] +pub struct NearRpcClient { + client: JsonRpcClient, + archive: JsonRpcClient, +} + +impl std::fmt::Debug for NearRpcClient { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("NearRpcClient").finish() + } +} + +impl NearRpcClient { + pub fn new(network: Network) -> Self { + let client = JsonRpcClient::connect(network.to_endpoint()); + let archive = JsonRpcClient::connect(network.archive_endpoint()); + + NearRpcClient { client, archive } + } + pub async fn batch_fetch_proofs( + &self, + last_verified_hash: &CryptoHash, + reqs: Vec, + ) -> HashMap> { + let mut futs = vec![]; + for req in reqs { + futs.push(Box::pin(async { + ( + match req { + near_primitives::types::TransactionOrReceiptId::Transaction { + transaction_hash, + .. + } => transaction_hash, + near_primitives::types::TransactionOrReceiptId::Receipt { + receipt_id, + .. + } => receipt_id, + }, + self.fetch_light_client_proof(req, *last_verified_hash) + .await, + ) + })); + } + + let proofs: Vec<(CryptoHash, Result)> = futures::future::join_all(futs).await; + proofs.into_iter().fold(HashMap::new(), |mut acc, (r, p)| { + acc.insert(r, p); + acc + }) + } +} + +#[async_trait] +pub trait LightClientRpc { + async fn fetch_latest_header( + &self, + latest_verified: &CryptoHash, + ) -> Result>; + async fn fetch_light_client_proof( + &self, + req: GetProof, + latest_verified: CryptoHash, + ) -> Result; + async fn fetch_epoch_bps(&self, epoch_id: &CryptoHash) -> Result>; + async fn fetch_header(&self, hash: &CryptoHash) -> Result
; +} + +#[async_trait] +impl LightClientRpc for NearRpcClient { + async fn fetch_header(&self, hash: &CryptoHash) -> Result
{ + let req = methods::block::RpcBlockRequest { + block_reference: near_primitives::types::BlockReference::BlockId( + near_primitives::types::BlockId::Hash(*hash), + ), + }; + self.client + .call(&req) + .or_else(|e| { + trace!("Error hitting main rpc, falling back to archive: {:?}", e); + self.archive.call(&req) + }) + .await + .map_err(|e| anyhow!(e)) + .map(|x| x.header) + .map(BlockHeader::from) + .map(Into::into) + } + async fn fetch_latest_header( + &self, + latest_verified: &CryptoHash, + ) -> Result> { + let req = methods::next_light_client_block::RpcLightClientNextBlockRequest { + last_block_hash: *latest_verified, + }; + log::debug!("requesting next block: {:?}", req); + self.client + .call(&req) + .or_else(|e| { + trace!("Error hitting main rpc, falling back to archive: {:?}", e); + self.archive.call(&req) + }) + .await + .map_err(|e| anyhow::format_err!("{:?}", e)) + } + + async fn fetch_light_client_proof( + &self, + req: GetProof, + latest_verified: CryptoHash, + ) -> Result { + let req = methods::light_client_proof::RpcLightClientExecutionProofRequest { + id: req, + light_client_head: latest_verified, + }; + log::debug!("requesting proof: {:?}", req); + self.client + .call(&req) + .or_else(|e| { + trace!("Error hitting main rpc, falling back to archive: {:?}", e); + self.archive.call(&req) + }) + .await + .map_err(|e| anyhow::format_err!("{:?}:{}", req.id, e)) + } + + // It's cleaner to get epoch bps based on epoch id + async fn fetch_epoch_bps(&self, epoch_id: &CryptoHash) -> Result> { + let req = methods::next_light_client_block::RpcLightClientNextBlockRequest { + last_block_hash: *epoch_id, + }; + log::debug!("requesting validators: {:?}", req); + self.client + .call(&req) + .or_else(|e| { + trace!("Error hitting main rpc, falling back to archive: {:?}", e); + self.archive.call(&req) + }) + .await + .map_err(|e| anyhow::format_err!("{:?}", e)) + .and_then(|x| x.ok_or_else(|| anyhow::format_err!("no block found for {:?}", epoch_id))) + .and_then(|x| { + x.next_bps + .ok_or_else(|| anyhow::format_err!("no BPS found for {:?}", epoch_id)) + }) + .map_err(|e| anyhow::format_err!("{:?}:{}", epoch_id, e)) + } +} + +#[cfg(test)] +mod tests { + use std::str::FromStr; + + use near_primitives::{ + types::{BlockId, BlockReference, TransactionOrReceiptId}, + views::{BlockView, ChunkView}, + }; + + use super::*; + + #[allow(dead_code)] + async fn fetch_chunk(c: &NearRpcClient, chunk_id: &CryptoHash) -> Result { + println!("fetching chunk: {:?}", chunk_id); + let req = methods::chunk::RpcChunkRequest { + chunk_reference: near_jsonrpc_primitives::types::chunks::ChunkReference::ChunkHash { + chunk_id: *chunk_id, + }, + }; + c.client + .call(&req) + .or_else(|e| { + trace!("Error hitting main rpc, falling back to archive: {:?}", e); + c.archive.call(&req) + }) + .await + .map_err(|e| anyhow::format_err!("{:?}", e)) + } + + #[allow(dead_code)] + async fn fetch_block(c: &NearRpcClient, block_reference: BlockReference) -> Result { + println!("fetching block: {:?}", block_reference); + let req = methods::block::RpcBlockRequest { block_reference }; + c.client + .call(&req) + .or_else(|e| { + trace!("Error hitting main rpc, falling back to archive: {:?}", e); + c.archive.call(&req) + }) + .await + .map_err(|e| anyhow::format_err!("{:?}", e)) + } + + #[allow(dead_code)] + async fn fetch_ids(client: &NearRpcClient, block: &BlockView) -> Vec { + let futs = block + .chunks + .iter() + .map(|c| fetch_chunk(client, &c.chunk_hash).map(|x| x.unwrap())) + .map(Box::pin) + .collect_vec(); + let chunks = futures::future::join_all(futs).await; + + let receipts = chunks + .iter() + .flat_map(|c| c.receipts.clone()) + .map(|r| TransactionOrReceiptId::Receipt { + receipt_id: r.receipt_id, + receiver_id: r.receiver_id, + }) + .collect_vec(); + let txs = chunks + .iter() + .flat_map(|c| c.transactions.clone()) + .map(|t| TransactionOrReceiptId::Transaction { + transaction_hash: t.hash, + sender_id: t.signer_id, + }) + .collect_vec(); + + [receipts, txs].concat() + } + + // #[tokio::test] + // this is committed in the repo, only needed for gathering data + #[allow(dead_code)] + async fn test_get_ids() { + let client = NearRpcClient::new(Network::Testnet); + + let first_block = fetch_block( + &client, + BlockReference::BlockId(BlockId::Hash( + CryptoHash::from_str("6taaeb6h2uJcuUvvmwXpYgagYvyHsFanWhm2ziGGHCff").unwrap(), + )), + ) + .await + .unwrap() + .header; + + let mut ids = vec![]; + + let ids_to_fetch = 1024; + + let mut block = first_block.prev_hash; + + while ids.len() < ids_to_fetch { + let next_block = fetch_block(&client, BlockReference::BlockId(BlockId::Hash(block))) + .await + .unwrap(); + ids.extend(fetch_ids(&client, &next_block).await); + block = next_block.header.prev_hash; + } + + std::fs::write("ids.json", serde_json::to_string(&ids).unwrap()).unwrap(); + } +} diff --git a/crates/rpc/src/prelude.rs b/crates/rpc/src/prelude.rs new file mode 100644 index 0000000..1e42be8 --- /dev/null +++ b/crates/rpc/src/prelude.rs @@ -0,0 +1,16 @@ +pub use anyhow::{anyhow, Result}; +pub use futures::{FutureExt, TryFutureExt}; +pub use itertools::Itertools; +pub use log::{debug, error, info, trace, warn}; +pub use near_primitives::types::AccountId; +use near_primitives::types::TransactionOrReceiptId; +pub use near_primitives_core::{ + borsh::{self, BorshDeserialize, BorshSerialize}, + hash::CryptoHash, +}; +pub use serde::{Deserialize, Serialize}; + +pub type Header = near_primitives::views::LightClientBlockLiteView; +pub type BasicProof = + near_jsonrpc_primitives::types::light_client::RpcLightClientExecutionProofResponse; +pub type GetProof = TransactionOrReceiptId; diff --git a/crates/test-utils/Cargo.toml b/crates/test-utils/Cargo.toml new file mode 100644 index 0000000..9c51369 --- /dev/null +++ b/crates/test-utils/Cargo.toml @@ -0,0 +1,31 @@ +[package] +edition.workspace = true +license.workspace = true +name = "test-utils" +version.workspace = true + +[dependencies] +anyhow.workspace = true +borsh.workspace = true +derive_more.workspace = true +either.workspace = true +itertools.workspace = true +log.workspace = true +near-crypto.workspace = true +near-jsonrpc-primitives.workspace = true +near-light-client-protocol.workspace = true +near-primitives-core.workspace = true +near-primitives.workspace = true +pretty_assertions.workspace = true +serde.workspace = true +thiserror.workspace = true +# async-trait.workspace = true +# near-jsonrpc-client.workspace = true +# protobuf.workspace = true +# reqwest.workspace = true +# sled.workspace = true + +hex.workspace = true +pretty_env_logger.workspace = true +rand = "*" +serde_json.workspace = true diff --git a/crates/test-utils/src/lib.rs b/crates/test-utils/src/lib.rs new file mode 100644 index 0000000..f7d1c39 --- /dev/null +++ b/crates/test-utils/src/lib.rs @@ -0,0 +1,121 @@ +use std::path::{Path, PathBuf}; + +use derive_more::Into; +use near_light_client_protocol::{prelude::Header, LightClientBlockView, ValidatorStake}; +pub use near_primitives::hash::CryptoHash; +pub use pretty_assertions::assert_eq as pas_eq; +pub use serde::de::DeserializeOwned; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize, Into)] +pub struct LightClientFixture { + pub last_block_hash: CryptoHash, + pub body: T, +} + +pub fn workspace_dir() -> PathBuf { + let output = std::process::Command::new(env!("CARGO")) + .arg("locate-project") + .arg("--workspace") + .arg("--message-format=plain") + .output() + .unwrap() + .stdout; + let cargo_path = Path::new(std::str::from_utf8(&output).unwrap().trim()); + cargo_path.parent().unwrap().to_path_buf() +} + +pub fn fixture(file: &str) -> T { + serde_json::from_reader( + std::fs::File::open(format!("{}/fixtures/{}", workspace_dir().display(), file)).unwrap(), + ) + .unwrap() +} + +pub fn lc(file: &str) -> LightClientFixture { + fixture(file) +} + +pub fn main_last() -> LightClientFixture { + lc("main_2.json") +} + +pub fn main_next() -> LightClientFixture { + lc("main_1.json") +} + +pub fn main_first() -> LightClientFixture { + lc("main_0.json") +} + +pub fn test_last() -> LightClientFixture { + lc("test_2.json") +} + +pub fn test_next() -> LightClientFixture { + lc("test_1.json") +} + +pub fn test_first() -> LightClientFixture { + lc("test_0.json") +} + +pub fn view_to_lite_view(h: LightClientBlockView) -> Header { + Header { + prev_block_hash: h.prev_block_hash, + inner_rest_hash: h.inner_rest_hash, + inner_lite: h.inner_lite, + } +} + +pub fn mainnet_state() -> (Header, Vec, LightClientBlockView) { + pretty_env_logger::try_init().ok(); + let first = main_first().body; + let head = view_to_lite_view(first.clone()); + let bps = first + .next_bps + .unwrap() + .into_iter() + .map(Into::into) + .collect(); + let next = main_next(); + + (head, bps, next.body) +} + +pub fn testnet_state() -> (Header, Vec, LightClientBlockView) { + pretty_env_logger::try_init().ok(); + let first = test_first().body; + let head = view_to_lite_view(first.clone()); + let bps = first + .next_bps + .unwrap() + .into_iter() + .map(Into::into) + .collect(); + let next = test_next(); + + (head, bps, next.body) +} + +pub fn test_state() -> (Header, Vec, LightClientBlockView) { + mainnet_state() +} + +pub fn to_header(bv: LightClientBlockView) -> Header { + Header { + prev_block_hash: bv.prev_block_hash, + inner_rest_hash: bv.inner_rest_hash, + inner_lite: bv.inner_lite, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_workspace_dir() { + println!("{:?}", workspace_dir()); + } +} diff --git a/fixtures/86673090.json b/fixtures/86673090.json deleted file mode 100644 index a1c7b40..0000000 --- a/fixtures/86673090.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "approvals": [ - "ed25519:5EyE23RLUwqdJkPW9762sRosM838bUtn5SS2mt8e5xYriG4UfxVbEUaKPAdc9tGQkAem58hYDxvpBMoAPd2GT1sD", - "ed25519:4Mpvtnp6gASgz3pGApMG4P1Tvpxj3zkVmbqoNKvyWBrhMk8G8PdsaZyCHqzYwp43yCLb4dCFwsdDnJPmpGPdCFqq", - null, - "ed25519:4WT7358xtNLpgayEcvzRK4q3j59yVPfMnVK6rhWxUhhHvvyVmY8Q2aU5RP9v4TbGvuH4ETyJfYqu59ne5wCKcYp7", - "ed25519:5fHqyG14B24Q8BUu4dmi6VL8HLCQLu5J4WU9DmpxVQwysiEzUBBY3Gum4xHf21ordQdYUnKt43AewVqLMEwqgmfh", - "ed25519:3hKSLU2WSUitFSfiTzkvEeqTseqzn6L6Y2bFEB1zrNnCzTTmk58FVJBzzE69DLaZqfRntarqjQF2tsaiWkReaqVt", - null, - "ed25519:ccRZRiG1cjHGkshaFEbnbwdvZZBhMoQhUeupHh9rAo4VPU3XTE7merRoJRQn22uG6kcgqaENfDu8hitkeLz9h5K", - null, - null, - "ed25519:3QbVQUBnkYVfdxshCFcykn2sKeXnBsVEGQZ2aE1FMVs9Dg8fRQNBiE1znXRpRuPEFPih8HB2M8NvpCHnXVHThPEQ", - "ed25519:4FxR7aNf1B4tPHE1gPW4w5fdn5omZhgvhrFoKn9CsWxCDCnGk12mZBNJengBC5rP9yixJSN15Dj2UMFgQogeCgmo", - "ed25519:3YgSdETqTwQnaZoBM8y3W8942sLZmAgGzNXfbeV96ehXQ5L37Ye19xMng27U9cSbDRm6KhSo3DdSLBhM5PcsCJwt", - "ed25519:47Q9p7DCpDz3CFYhwSUPYymXq9xUhXZ2gAhx6ftrZFVng73n6SnBSoBUeNyLoxWooEdLzeeX6SC1gC5Gm4TdHgkH", - "ed25519:4Wb5Kjk81PYjEYPzSuTdhref8m2vdTU6aRZNFwkdrf6yDA27JhQh4QshxUqND2RGt5aygVQCQaSQE2ReWL89GaDu", - null, - "ed25519:2GpV67gpeJ5BQLkrsEQXmWvxVJEYo5LRTYKFdD1NJAW8sWuAqBTG1x86MWgFpwsgSRxt8D6BLDupVzh9uudDpbCg", - "ed25519:2QZtay8pcUY3Vd9C7Cx48rQMqMGDQSTySB9qzNtcmSyGFjCx9BTwKoQzHZNK4yMvwxTYLJr2fRANW2EYN3TEWyjK", - null, - "ed25519:4CGjzmDLbVXP5DoDrvsyYPivQiHWZtQetGRgayDisSLGM9UWVkyoMjLuohpcpYn7xjMv4zD3JDtxUVddxxmBsyky", - "ed25519:5TnzJtqpNBtBtajMV2ScZkxZ5Luyo7wgn1HZqEQMS1KaqGdtnFiSP6rR86Fk3ZimKciMexhdP8bJVKf5PRDmboqS", - "ed25519:5kFTm2sBffWSpoST9yCe28cZYFjWajdrRbBmA6aG7YCfcZmEMRbrauGepr4Kk4rUJDSy8NhDMraGkRh1j7oo1FqH", - "ed25519:3Bngm2RYrbbjUAThZ9KZpZXXh7H6GNTWdFr1ZBqxMVvPmPi9Fhnwsr8EsEZ39PavdN6UGgqPyPHXamxkb7DjxqAA", - "ed25519:5HQRYAR1Fjw8JEBGV6SBbUSoEvreVPXK4b6oBM5jBfNNTBG3rjngM2Peaox6D7yjowJfNgGonyA3UbhYbE9ZH9KM", - "ed25519:4dAS3dWvQrzZR4MGmVy6zbtvwdN9ZFRB5StbreTvDMQPsksXdFdMF3inW2GPJQv4d79yQMoXKLYyxzVE6hCUg6KY", - "ed25519:2BJwRznSvYZ8NYrh6q98ex4qQak7F1bgvKu1hds5B75ZBU7zq9RwEycJZYD2Y8NefkoxEj9ufc9oeDuXMb2bg5YT", - "ed25519:5KmYT9UNwwP6zCcKzYU4AgaKmS6EX8C9cRkcMsNaL1cNWWGLy3PBgoqvW2HHAuHg9bckSyKLxFS67BBvga5Evhqp", - "ed25519:465bTrzK51JoHU12g3ZGgnVDUt9iMzw9GKPqYbco5J2cSZGSfBEwvgN4tQn41k5HuR3DnXf63EKromZRASHmQ1Ns", - "ed25519:92UPamPaC9aubd3CV5n1xiY4n9Q56gK6N6TxGMFNuF4QPfxiTZgNTUDEqbERjd5Xr4chF9QgYHv21UYDzJLLZRF", - "ed25519:a1nHUsQcyBFDxeMqxLqrsdUGhUgZGZ9yiUAuyXP6Gk1zaaMQXzGEUW91Vytbat6wH2TYT7izAd2ocJRzHmmGFun", - "ed25519:DiqvANzRMsoVv153ktRyrdXGwzUzPEp5M2ZzMtiwHvSQ7auXM8yBgxBzV9zb4ia2KU1E2uKM3RY7m3jJQGUHWEy", - "ed25519:2uuMLXWZVTSu7F1mYna3CwMEupPByAE9Coayyvx7jY1jXJfJaT1y1DihASgcAgZdLPe9i7vm2G1rjakrmbwLXDF9", - null, - "ed25519:66ATciiU99d2RPMwnabuYE9q3hSEd3SeHefYcW2aAhNz8qZKghrmmBnRbe8qdrXbvvCaMF8oApGzK41RZixVqq2t", - "ed25519:5P5LM6xVAP6rLCMbX8aMUqUDD3Azd1BrayVSrLDrFBdd7vTZc8HVdy5uNVfQhf7kfUQTNw8YzNGaxM6WKGximP73", - "ed25519:P3JF33m6nj8L5xr2D5g8MQCbszaVAap4VWHuas66fPDArk2Vg6mKggKeeiZDvX5wtGUGnB6DWesz38YzyWPiPRR", - "ed25519:5dtM1KUy799LtskhnXZWd5ck8FdnGaCTCozXALo1KkMquWiRTSRX9yTovqs3fXfnyXPRBK8jg4Txxx7cJZjG7joQ", - "ed25519:GHsDcmB47Bv4kyThnYP4uMyAS3Ww5G698f2dxUbTMBZfptGJLsM9zEQsY2xWuN38Hu3rmvhDSpJodki4tFB2Yq1", - "ed25519:3bexxXkRpDdij9wBbwd37fCtUvSQJ9PZYALA9gN26nU5es49cYrVmPgBLDpvU8YhpGvsagW5AyWMUN6SfBbcovic", - "ed25519:4rUV6GnHkSejhb7PNBVrFafZp9eADiX6UWw3bFRSUbachSqcz9de8iJUtLZCmEdT5T3k3FYAnm3R9kZLwksh2kUx", - "ed25519:4RjXNdDiqWi7LxkHMDjM2h7ynksWqqyKC4GvzLqxbykqE6Vp7jKLcDsHFbjy5Nqa5DTqhfudji5nRVvfcXcqte12", - null, - "ed25519:2QZtay8pcUY3Vd9C7Cx48rQMqMGDQSTySB9qzNtcmSyGFjCx9BTwKoQzHZNK4yMvwxTYLJr2fRANW2EYN3TEWyjK", - "ed25519:bVXpA9Ph7bHtsRDZNfYSyCcEaXUgR6iydyuH9ZXyuZKedNBLSEXFrGEVtYo1te3ekz364u6GunaYWJNWR6dPEys", - "ed25519:4Q9BqoukYXS9fdfzJiXQMgsgLKieb1JfAa723tJ54HKg2Vx335yPxbLYtdau9bGMosVHbHE7nuC2xhZEkzaaAjwE", - "ed25519:2MrSHSYAadVazPE5GVpmmG41onoJRvFYDcAV4GWjYYX59GToZYBkN8GdZSr6MPA4GbUmMXjwq485w4QXGEyCzS6G", - "ed25519:2sjKECxBGDCMuLhbHkjNHfPeQPtUf1x5HUyB9izA3UHLXHtZJVYv7nxGfLFgeg1kXJ48PNmXqrQDX9gTKkJ2HJ49", - null, - "ed25519:ApLhgH5mWNn5FMMtNuqC6R8ufebwLvuWucboPSxp7hG1n7nuPmEoTfiY9eXE5CU61atJF6oqDXqSe1eT5gxWkxu", - "ed25519:3YfQJWcq87nvTKXDNWoSoU1Dd45bepoFsLogEBEKDM6dwVk3VwVEdbeKewfCcxqRWg6ToXL4y5cfGTP8K6Yv6UeU", - "ed25519:HGBjthmSMR1mc6by4VZys4BJJFFnFXL2FP1q8ZBo6YAUiDe5gjf7XXs3thoJQ8gTM2KSocaC79hJ6UHkzzyhQ46", - null, - "ed25519:65YrKCGddddFnXiNQM7h6gKnMAoum8gxRcF7DXkvq5c9926Rk2PjmKsTTPZFKdN5xT7F37FxRxvhpmq8FNmFgPKh", - "ed25519:2GhXAPXFSKMLCPPJBwifwt2xgMT3gxi8idz8uTahkFjejGVWLKWYhs6pE5CVVTjSrxYQVLbPWYwVbi4xzoGCvyX5", - "ed25519:F7mcPLLpVCjZBueeJSWTpVjUujeVtEWVdUUZAZngmHrctiEsQ3GPQG4tYAb4eBMqaDMR4CsaMPeDcvvucqQvS5c", - null, - null, - "ed25519:45MV7qHAkiyw3CHrSfedqB4iyQob7wGKE35w26SL2naWUEBxg68P4dy5xR8bTEzRBVjwyA9GB7jjk1GPwV4EwoBf", - null, - "ed25519:2EsSmrPm9GjbTDYUhg2ZrhT9iUpLvyuPqdeaY5VqpD6q8h4xQwECLMLBCydFurP6JR3eU4LqSvLitQJynrhqdjD5", - "ed25519:4P3EfGVSnumrypgbUY8ssc3zvGhHM67nw5pvJ6zAZLq3kMkXwnpiqoUQjgKL6ajRBUWwhJV5o3FKjvDoU3g4ZZJR", - "ed25519:5jcePF2VUe9K3UMzwkq323cLrXBG86EDz5tLoZpXBnmJ2Zq5BasYZpVQPjA33HFtoR93PH87mWUPSSyQwzrcfVme", - "ed25519:3mKQq2rUrSNCDkTBKyLFhCz2DsuyAcssmmP5kdgjLPQiG2kHpXEMQDFMo1g8RNZducCcQgFePUMNwJXMvqpp5DqG", - "ed25519:5hSuo3CxpWxEwaREGrsPpQyN8xqguJRQ1d7bRAT7QnLYQjLF1RR2xEAT5ouDSjnyDmJ9a3gd2uNTMsV6g7W3rL7X", - "ed25519:kHE4wh9kBpnzuBSHmsptMkdMZigqACiV7NMzCrGPRjrR9j9sNx7sLowhjtKxLkGvrAdaNYw2zFXQjE6jsBE2QAJ", - "ed25519:4QV34kRmmiWAugTS88AD6rSek3dgpEAZspHhvkwXrckP6carKCqngi1iHw1746395FWHhwTR13WQDeRXQV2VqYdY", - "ed25519:2ndsCzbHmr8sTVJ9qhNaD2DPv8zzmXLmCV38kSzUZv6Wur7C14YafejLn8Tbde9vgkngRv9U8JiCppUTs58rGPmw", - "ed25519:t1ot7rhp9hwRYsq28vLCijqxSc1RpX8JY9hxLaWmLWU4iAeXHs4XiGXyYr9sEtpxycENsaEyepRkGTnDZnk418p", - "ed25519:534aJtTXJVX8xCcgTVKLrs5XQeJJJtC8DczZVTCHVXb2s8o9KKxoFpY1jC4UktsJqhc61Gk1mLAn4v5omBDERdG1", - "ed25519:3uRa6zZsn5ZgsBuDSVQvDcUaxafvzhbuCFwWDeciW8Pwj9Sp9h851uePXRFXK3KNeCHYxFBDFuWnJBNipBnWhhPu", - "ed25519:f6h6a7pyNuHcvTUjiHJiHHhWdTko3vJe9CwVigse9HHbeJZyRGXZzneb8vugyRYuFc4EuSUqFNjKUWTNBh31W94", - "ed25519:3ejr97xuzX5MYJf3Ecsjb5JcxnWdG7zKYmY6asnNhLCCF1tcHKmSkzBy49ZWT1SM8YeJ53CMpce7DvAYSZiyik5H", - "ed25519:2LhrZgxTqErqwp7Fa4KGcTXKvn3nUnVvehvZEMtyTb9jG1eac4x82sHjrMC4cEQHk8JbNEiUWH2ymGkaAoR9F1LE", - "ed25519:4fUzGDTBNRCV1UoQ9Z7RSpGDnnd8DSw1NJBJ3QBtgcqS2mMY7RKSGA45kgmMGuacCeEoV7N4ozJJGmZmfXUmz4Vu", - "ed25519:kFrKBXb7WwhFL7bVwJiaKbeqfbGrqYSux8knu7quUNPRy5MiPoFyXnX5L7dvfp39yGCv3ueFvyJNt3JYNG2NVoz", - "ed25519:428dbpp38MZCT3iVYdHk1hBNi3SaZkf3BVPQzzxtQkeBEB23ciySw22ffsZZv8trX2fAcFuucnvDb6oDwvJ1MHyV", - "ed25519:p1kemVQixDh9GWc2hwFAFUNcMtHPHeXenawZyc6j1FEK4rtt1TB58PmvGB31mgqBcWVpfPpKtJe55c3ZLFTM3Vg", - "ed25519:64mijUyNR87k9Phq4YxC3EDog9cMqchXqGjszpHShdcGcs5D6j3h5jXCw2Z1KR4Ax2b3XWfg5Js1P2qxK26rnHZM", - "ed25519:4pqCeceFPwfjmVRzu2wn7RwM57pthbR3gbhvQHwvhMh8qkRbHwqxRgwypELatzHZipNYWyKUnGmkXCv7E6rawRSb", - "ed25519:3HQpQKBZH4A5XTRZ8KQgF9zM4oPZ9Lk5wvVsGiB4Ytz3WpyXnTG4EwwwxMjcLR5FSDTvGsJwWeUFRNbFt5UCazyV", - null, - "ed25519:2mfYPj9uc5Wj52Ei4yF7MdQu7HKyDQCMEtK2UYusFSi8eNamsVrsBpkhQK1sqQBYrURBMsyAbmDR7QkShn9UMJCS", - "ed25519:4jim8smGkvi3PscmJzaQrueshK2aQwDWjnLoz5fiUbAVpgbcj3P1JKmrmS445k2TUux7c13pSkE5qoF1NzYKmJeh", - "ed25519:4yWBe1o8GFkjEiso7c1PszL5LLMMDJoNvjhhFxPi6m3frKvDJmTFqALMQQBNSvTvcC9c7yMdGjf54cqLHfJ5qaRE", - "ed25519:4f13JLcebss9Af8XjBvVuskFRDgoy9rzLjBmd5BfkezPniwCAu23WcUjyhSkH6bApDf9jmCTiBR9N2BVWMkgSsQD", - "ed25519:34M1sQnVX4SrbLFLgNvc6YnBiTQZs8Z5Xg12PkjuM9YsSwDrg7JutsihTFSoZFASfPiaPrSLavB1Pi2XfZ885Vaj", - "ed25519:2wsDUAVZH6kZuHMurdBvEcgoc1pnoCXG4aF8ZhP9go5zVf9mFN2733wHypGh53hoWSK4Ybo9SfpErxLr1iPFQ3wD", - "ed25519:3je7ZxGKJVg1YvvwJ3e9RUNnsWSbvxnseUxu7A7gToJHQpBS7CGinH9BdRMjGdof1xnpropj5HKckHfxmwSnwfUw", - null, - "ed25519:31Kf4VqQ9N4icR6eHh9CrySfCDBmdo99zd1pJnumAjEiAYrRtTHXuTMXteq3GPGRGH1RoBUZoNHuoVR6cPFyE32z", - "ed25519:DqH33ngukpfKnVHyUNyQRssV2B6E39dQvPQcgprmjutV5xBfNNiYe9rk7BXdahEuCrV6rDbeRwP23gkpxyxhrUL", - "ed25519:4M3qQ2ciJnpsuuSnECYdmF9MTTj1tMZJ173xyWg8xELS14yUjgwKzXeTRYcttTWLW81Dr81PAUhxZUytmFqA1SRC", - "ed25519:7itcQvk7QKsiVEfKX5X7TfzBetxff2h4ezXfnwYTprhJH3mkh4wcRCSTcRJBqy6tLKHCfju7LeuSGTWWDRubqAs", - "ed25519:5AW64AoxQXsvRvzBX8nGAdKb89N2sM1DUfykPxHYYiKuNPW5bFBKDfZ4jA8podApKy1bkv4J3MHz6YxGaqsqmj3F", - "ed25519:36NdfXxtNavZGu7gfuA2D7rv5bxSsjUaM55TYwHiiT1ZbRxLmMu35kF6ck3zATA7f3iuEHyYAd3HUxzFP5arg9Pe", - null, - "ed25519:43y1TuLutVXWfXGE8jy3at38Rb2a6SR9WVzfgYt3GMrhg4cSN2ufczPy3UbBmyELEmPcryRtdbtg2MwSNWNXxWRj", - "ed25519:2i3PEqDsTVHPA6QUSH1ytVqBvzz5jtGSsriH8Z5qE6Mgn74ExNcTZx3SzvVBzX5Cx5EmVfcvvC2TMGg2PE1mzk5n", - "ed25519:CwvFG636dE7Y6ryYR483aDBH1vRNZbdR1ui4rz8TkFzSpmEAVzQ2ksfzQNxRgunLgG4ALm3XrXpPhTvUTVbUaRX", - "ed25519:4ZdqT5fbAAx4vWjb6dKJTwfsEbavAE7KV3QPGgnLq2mZozFLEdaG9wVaRRdjtriyLFq11qsW9mLjc89PC8msgFmf" - ], - "block_merkle_root": "G5QHBQ8qV2s65Ua7hEbChRggEZdMAuGQEWLcwJsHu6Hp", - "block_ordinal": 76633912, - "challenges_result": [], - "challenges_root": "11111111111111111111111111111111", - "chunk_headers_root": "5nRBSR5hqjQucDmP6xDT3fr3QWen96aWnq8jXAGNpnug", - "chunk_mask": [ - true, - true, - true, - true - ], - "chunk_receipts_root": "UBpXxifFY7Z4LE5UFB4x5tWYquiKHSCc9VqTLuNAWUf", - "chunk_tx_root": "F2chGkeJdCh7J4HYchAJV1Ku3TFk12RZKyC9TpYEGgz", - "chunks_included": 4, - "epoch_id": "FhmQexFCMWUBxNCWKgEKwvPbSWA4ccGMqJ7S5uTAdYYp", - "epoch_sync_data_hash": null, - "gas_price": "100000000", - "hash": "7xxCpbHg44N1jDw25MBqR5JuLCPBzzPenJS18jFmfyFd", - "height": 86673090, - "last_ds_final_block": "7aLAqDbJtwYQTVJz8xHTcRUgTYDGcYGkBptPCNXBrpSA", - "last_final_block": "8nnk9KLfnBdFbMeCSWHB2eEdZ1B7BcAzUxuX7Hcx1ZS2", - "latest_protocol_version": 58, - "next_bp_hash": "GjQ77x2L8jPUFa3Gfr5ASMrQ8d9jvQAQtmz4nSjxEibC", - "next_epoch_id": "5h3PDeeRRQjgyNvzbKepLcBJT3jWJdhu662LzfJGC8ub", - "outcome_root": "8cmecZJqqg6YE9fijMQaPqUreHp97ToB8r5kCn1MmKJ1", - "prev_hash": "7aLAqDbJtwYQTVJz8xHTcRUgTYDGcYGkBptPCNXBrpSA", - "prev_height": 86673089, - "prev_state_root": "FozYhU86PJriD5jz7sq1EZTdewUxsyxa4Raftk8t8h9S", - "random_value": "D1tx6xhfAR4cf5UMsrVou8Bb2FMc9JrfswrHs4kwawu7", - "rent_paid": "0", - "signature": "ed25519:2SHXz3ygwZGtzr6k8pmjZ68Pti2J72ChyF6tE4ftcVCYKqm1sTxBjnQsb6a5NrTjEfZtFoYkN1MHL9EGqwsMLEPy", - "timestamp": 1678091174831592651, - "timestamp_nanosec": "1678091174831592651", - "total_supply": "1123870259780195549872917842454102", - "validator_proposals": [], - "validator_reward": "0" -} \ No newline at end of file diff --git a/fixtures/86673091.json b/fixtures/86673091.json deleted file mode 100644 index 1eb2fb3..0000000 --- a/fixtures/86673091.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "approvals": [ - "ed25519:4hysQKrXdSAECK3NHuPCmSDwvWrxsjwu8sT4eDwuNSpHp7h2bfiPR7XdrcuyK87oPCUEoaKDjZx296VWJL888qmk", - null, - null, - "ed25519:5CuD2zeN5iQ2KWQGfafm6p37STZeVR7cHsgw3JxT52wpTkBzz8X3PjM9Bf2zSt46y5Aj5KGY2i1U5ocSBu71affo", - null, - "ed25519:2jdpy3KL2WNRUssWHLDkS1Ys7RVn3YZUkqHdL34XZs2sYB3HKDBeUGsFQqTB8UdLfDkHFvqeHvBydXVdxLWVSCsW", - null, - "ed25519:4ts2v9hQrqF8rJM3coooXVb8rs5sRxYRu3FXFucEHXX68MBbch8MLmYkRfa3ovTnziob6WvdgsdwroCWnF2NfaRJ", - null, - null, - "ed25519:3j2eobWVUr1G4VmFYSRynWt7a7jJhoMcWrYaAZBSGBxguSkEQ6KXKVjsFrxgKUQm5bbdBEn5XM99ugKhj9mmiysg", - "ed25519:3ExbRqni8qpT4vLnP6RLy8d9FcawgCfh3AsQrpBMT9LAhNTYGXQD22rAvd2Np22RkuTLSozK9kY3TEUiMXL8d5Jv", - "ed25519:4iSqA2tzF5WRRAJB7Bv8EFDU45Gk6krwkV21PvK4VfrMAx6s6389R3V2dEnYR4J1jNUnxXydrMkVhxmPwxRkbnJX", - "ed25519:4J8DARPsFEB5jnFqQDs9vaG4ZuVYSnZPv4kjyNoUXUkEWhuChXx2wgNZ7gqvMBcTMmR3wbmQRtHeW8KL19VMbRRn", - "ed25519:g3LuNHiyXVCv4BMrV8hPsJHUgBDqDfR1NgXE8Q1a1n739rWB61mT4E2WvGXL5RLA479gDpXD7TA9EwGdQHdiSKB", - "ed25519:4Rsp9sVTDyT2qJJyb2ZiHTqsjTRtpoEcVyE9vAC85Q7BfpKKvy9bH4cGcy42ytZBzXsXVNrgbcgCsokLpsHe4pjZ", - "ed25519:Ypypt69K5GasxXTHhMosEVSH1bf4mn8N4MPMwd9Moq6Ht6Qxbbag9Xhpavw8W5jmLDQwLoickSMreRTqDk84kKV", - "ed25519:c95VXgwgWmbocVzChZKfoY1A63EqRB3HDXSDVQp8JQKNCUobmovV57eKDTQMdVLvT5MiLRSsL19EujRdQYmBGRJ", - null, - "ed25519:3S6rvsx92WJkAJ6n4zEHrRu4AFhwxr4yy52tRbjxLysiGcpSQQMGfxHyLKFmmHBVt3Aqz77nwoosU5YAwSbwafCp", - "ed25519:5ddswmCSUMVQyXo1pGAFfJEM7WRGPVW5NJbFSJs7ncjB9jYKvKQAVsDGnx2wPUw1wUngRLKMg3RgNEJZM6JXb7Pj", - "ed25519:3gE4uHPKhJa58w9vRkzW3A2eQ2PTmyPCzgKmXNbFAiSHCdzsE8Bmi1oMLaXUmXmSEBaSQrhLNAayb9YJXEEYCYfF", - "ed25519:4CxDAGhMRrs77qKKXbWtXJncCKM9LpHVacSWLFwgyebV1eyicobUJsC1y45DpKweqXhxVfZXsuEBh24nvadM23Tm", - "ed25519:5sthkhdHNyS449bZ7KFBtCUFbsKxMWVvftwMB81HauNsrEkd3bjq94bqVUWEym1rUPEWR27H8R51WT9Ua2qsxDNS", - "ed25519:2BNuCAQ2cVpCmQ34BkKJvkKb6VPzFDm6q3L4aKurqxbkYbdR1nsH4UhE3EWC2n8Z2GGWizAGKyB5v1MsjhxNvpeE", - "ed25519:3KWeztXE9ziBeLSTQxToLTMfaA4R2jE6AVEpa53FbgxXwcP3KrtveHr5gqeGHiBCKPUc8s4b7hcTHjBK8RW7ArD4", - "ed25519:uAvRRQ1y9YKcqGtBWPuC2W4tHpEXgxpE7pYLURW7Kbxw2mu2dMUSYR4tJi885icP5Cx7AXWoSYE4Yv6Ug4Wg9bt", - "ed25519:5iY5ynmnJZ57LQ5yWxo717bLuSPkt3PuTwuYX9BwXGUcwVsa5bVTRrLs8zvZ2izJyTZugpjmH5ahdELHFJGfgQWW", - "ed25519:5tESvw7wPHPMAhiqty48J3h2fbVwYumMWyFiF6dZR5kvPd8cX7gfXeHMzntdjAxnqQAhUwQyjhPq2VfNCE9Rd9A5", - "ed25519:5CbG2TBqVGHK1H4curT63LCQ4FA6ENM8knS1aV28bQnmZKSaMjat4oGzz4D6V2CX2efwV2nZcNJAPJerSWiHSz4M", - "ed25519:34fF4fQRBVbtvQ56Vm6XRBcyYvMu8z6LrzNWrz2BHEs3dqMyv3fzJMKTNRjm7xuWGer4hciiszj141BuXB7RwAW7", - "ed25519:f3RoSCoQmXpZxVbWs6tPFgjaCXf82DnNoxgze8G183QjXVjZ1iCbwkP15YtrCkQQxSJo8S1nX48FaFwuRexrktw", - null, - "ed25519:21kyxM8TvaBc6PVWW2NSDVmirU98C4CZ4QdfTihwoKbVTnRU74jeMSttVTwtZGxqXVKJeTJ6QSizfkqxGAQFmyZ3", - "ed25519:2aMS6n4KHnrc8mfqQ5KBLVrJeM1huoWuWJW14DSvYTCjY3tBCLM2Xd92xVYaHyfo4oavMaLoVkZysXubo1L7W2PV", - null, - "ed25519:2W2juNiwbhqmxEDXQw4vPVkPufjMpJDUxGEZeKKV4V6bTtyB8mSzrXLEtKsUz4kYv9famJanDNpdJ1f9qWYELD9c", - "ed25519:5PxLWkJ9LbxNoWx81JrkFh4cqYn7FnHt6rVgMrAA6D4iE4DTSdDVJ5yPGa86W9JkmJ99xQU8f3J4RoUhs753rM7Q", - "ed25519:3qiLRz5aKjrsQSADnQ4rMoe51JwPU7bB1MEu8mvzQPLL7B1tkHVw9dBbiSJH9RE8679SYejqLH8Kv4NSkU7H7JCz", - "ed25519:52C8YkYN6mrp2ptMszbt7y7qpYAPuMooaU7AtiAPkidMLm6QsuZRDcZbcpBjfRrETS9f7AW2yrRBajjRkVbEq7AG", - "ed25519:3vWHfV5mmTG1sDWgJFiAsguo2tEb9qKFREKHABE5zgibG4smpboqBMGaxw2MZaAisfRNsXiaRX9WXHjvkqWv7DGC", - null, - "ed25519:c95VXgwgWmbocVzChZKfoY1A63EqRB3HDXSDVQp8JQKNCUobmovV57eKDTQMdVLvT5MiLRSsL19EujRdQYmBGRJ", - "ed25519:5i9S2Nsf2Wt3TMYG1smGDGcLuKhHUPr5ChecTrpBoeXHBAiQmMGdgR6RTvv5dFb35yAwKCqAaPMjGBHw7SkJghhH", - "ed25519:3afcUWK31nMf473tcKxZFMsmgwqb8sRySVwhsaY96KfvnbUXoQ1tBfsYKmemk8tRm6jpXbu7CqXmXPeKZpLCRnH5", - "ed25519:5QUTsptQa3yeBwfeyWnDNAUuEYFsQ2aa4CEhgPNEXxUqppDuHq287WnZARab3jTYdwoZu51UCU2UEEG1otvhwngF", - "ed25519:3T7uCRr99GtRBaXV7G5Jor9BQNRxMKvHvyBJWdrmbf5JtTJvTHkpRLKadcwsLSDJBx6QNYarovUCZ3M8fDodA4UH", - null, - "ed25519:2KpvvQHT4Mp2AwYijNfg4L6xo1V5VVXpBM24Ji8uAX1w5vsJ4nVdKT3Wi53YaWDheGqMRnUGs6tZjNx1XMza5wvW", - "ed25519:TQWc2qTfGP4mr831aQMGUJfk9QPpN2Whzgcq6zsSracTfuWnMQsUNVw8uVoCev9RBRXSf4HEwvAGHdc7heocF3W", - "ed25519:5mVvpNs8HYmB3WbR5GZQQsL9yG1jePTUCr9ZSkLNnYryHLcNwvXdPBtXYEXks1KsiduLznAhxTexv7q8nPTgf6y3", - null, - "ed25519:5RvkF1rmhFFg31VR8ESEAVELPAioU8Nnp8nUSsEMW7KQbixdoRX5X2XtWWyYbJCCQ4QthHH3WUZfgCFCpUfBYUDL", - "ed25519:4wDac2ivB1Gd4NtZStuoodGwmKWYhmnzLNJbdGF9Jy9GNZwKzzNmSmcSxKNx3eg3YNP3S9uJJ6JrnGJzwvs6sZJ8", - "ed25519:YR5zSdpbEeFjU15QjSy3WY74LuhcM9wm4M1ifB7nnj5jSXhhn2LyRTSMPknzWV3VW3djQtC264A9az7y3BS7db6", - null, - null, - "ed25519:4q4m9bGKT6TqjzQzDEswZ6w7SyDxiXYFPupkxwnyHtoeWbo42wrJGaeQt49NiUYpmE6cRi4cBsBRQHbJq6LBdex4", - null, - "ed25519:5xYkBJg45NvdYMj35o22Sryvwzwyhsvhvs4reJAtQgg6QuDyzsKHnLeJxrmEZGqckfaMuosXX9tmLoxJx3NAp71n", - "ed25519:4nu9xHDiGhaXqvLri9vp7HKsJ4D4MyvDL5397StAikHHukUsYDyGtgFQXnDFqpP2xddn9TzT9cQpk4rqeM6dpMqR", - "ed25519:4mxMj1Qqn79zbzb73uSzpYUVYqJ18qVF73goJj38xyt1v3iodBSuQPDUJZtotvxrfMs5FW6d5XyiwEjq848tvbU6", - null, - "ed25519:5Cm3Tuvr5ohbFSUXppjpTNWJEMg5fbzSTxsk4FqEtfFWAA6XmAW4YQehGFNXpEAcyLhUVYT7ZxjrYT6S1AhqnZQH", - "ed25519:3WyLX7a1sJoK3dD9VTpWnG5ofLcS7exgbwn7qAL7hQi8vfkxz8cMGzNpKeBt2NK1GS6RBag1i6KwN4GvpsLvJbBk", - "ed25519:2uPo4wBBeiaHZeW3zjjGjGK1FXC8Jxjx8VcucaJi5RveX249cFytx1cdZbwVh51JTTEXpYywp2R6JsFdPbkxqYZc", - "ed25519:3bR9RPz2fshcFDkT8CAjPgEUr2kDorKgFMyektyJ6Nvo4aN6tm3Qa5EZWAkYHKPNcVJzTJesBbUJAqguJgSzMkeH", - "ed25519:44MqDDL7zCQcw34PbAsxcqMSDqvLJWCNJQVPXWnKtYPGevo4mLYGjXqBHsGE2nLrL4YHxB64xUoggXvL3aCpUbNp", - "ed25519:3uCcg7NVpwRM2PKFj7eRDA3AjpWaW42Uk6M2J5fco3u1rV26nQBWWCQoxHJ3Ntza9nryveg6PkdieUipXMqWuUna", - "ed25519:3XFgvty9UsA8Ub8GkSXRB3WFwV5VQKebyECcqxKufF33CcbwZAv1k6E8KrPq43sSZD4njhoBbja6FYkxRttuGLEq", - "ed25519:3Dzmufoqbys381YscGu4gMg1VzEe1Mm298UcbYkTeJ2hbt5eJFYoquRzFfArZGahREPd3dL2pBTBp1sH9BHqQQWc", - "ed25519:4pewSif5ikGsWFs35hPVEENSxNU516GpXR8JjCnMyKC2wKeYaDz51dL5gU73tSB8HFChRpkrRWdxt7erL1nRLM5r", - "ed25519:5LnSKtHjiY8Vuzzhk2MXmLuyScpgqRFxGes1E1C4AnF3jLbhgmpK6umpW2JkS3L5TkuoTdkhMXnHFXQ3KS2mB8Hu", - "ed25519:54SZrQDqCPUbshL1XaB9JdWhtg2pXPjkbawzB2y9U2Pts6TYQHKanWyLhX2SWzPWPc2xFrAhXewqtdBJPHieSBpZ", - "ed25519:hjf3sWxwnGXiihxs9fDu52JnaBDy9d8bAZKKVMyAqtmnAK9FWSUMqHrZbYBKwLSMxoDHSTGk8F5PiAADLDZMYB1", - "ed25519:2nXfeF4BaeAHBx4NWEuPeJmtNAfSbg4Py97YiYt1Ku5uLSwoHQ3WpL9xCaiJfayEm3Bgz8GjAexPuTwevUGPEmHx", - "ed25519:2Wa2msRqAJ8eLewtDe9VFW4GR6wqJwZdG5n6wu7kqc3WzFkVfRtxEqLhHqVkA2egrqnZGaVzLTFSrkPmCoe2GudD", - "ed25519:39FsJJYaef8ui8bNbS7qaR3J6TE6798rqmhbJQETnwf5MXTRhKXwEC778YyaGB7miCAX7sGckRfLEhUhDjxPVMxV", - "ed25519:2W77QFnaUhzLBePkV4o1sezzPKNsGfo5dpueerMgiskiNfGvw7zJzLJBfgcdSMaC9vjJ5L7DFttzGWRg5DSKBBBD", - "ed25519:65YTygrJPtQYqueWoTUJfhchhBSpNEqHLFDxNbdoCQx7nTVzdRfjnDVhrohxL7qvYPH8tJ8g84MM13gADJ5haAsA", - "ed25519:4o3ZcT51drAAZAhFChSdr6c53U2Pv1nsjYt8mfzSJgRe7PjC9wPq8g14obzTR4ZPdsZuJQYMSQ7iDCZJb2nMLfcn", - "ed25519:3abrD5Lit9FC6ytmuqrmmTNrHypKrwCV3PoDhZAk5rNfFB3DhFS6jy1qj6Ladf4xmsGpGfLdXiqSm8pz1S32gAqw", - "ed25519:3Qn5w7zL3nQfbkUsvWqFkmPDBrizGouiHVnsPKqdboyMbw7YD3iuuABm82gLcXMptTvyFj4MiX5Msv4YppaFq98D", - "ed25519:EfPkfJFzLT6PbmVkJUTGfNMaSerKofUgz2a885WEV2mafB6WppADgFsDU5DPWsEU2UTZumuugNcYZC2Gdhx199h", - "ed25519:5Kz4oHu8GXb2xYEJ3cSHbM4hJskwyDYvka9Ct1xfS2KyrM8T4pCVQuzSCr9X8fCHtTw1FW4hFqx9FkU4w9u23xBm", - "ed25519:3SusMpwVsRy3zgk6QqCwtMLYZ7dkfKQBq9vn8AFfthiq4hpwVgppV6Q72PZaFXy5ryiDq2GR62BzigGjFBAyt9dg", - "ed25519:ToZE9XE5ShD6xvfk6gzHz4Su3MPq65vZtGhJ31HA6J34BspzhePtPLVLqzrKZvNWPcktwce9dZprqC4WJrC9KdF", - "ed25519:1EzjmHrNj9n7SDwDN7GccPp4X1sqZbde58TmLKtENofKVJ8nzkb9sxTLjwxRwuwRjWHt9DqZtLFivS3uQFup33m", - null, - "ed25519:2QWTEnujbuMdjyaN6aJjWZmoad7acqZ3GxZvuVNwMkVXBaTi3f8v7aaL4cdDZKvxHKLr7u9c1bpSxFcCzDnsHnBm", - "ed25519:Z2XaUQL2iABhf7jmfAJFos7hGAj891VwgAvCL5Fxtdy7miAAdmX2R1GBEG3YcytjZ3VxnDopReqddWm5PhRGeea", - "ed25519:2v7gzqt9djYH1jKLrwaza1jHHTJuUY8NX6Cwmeyj4cXYsc5RfSyBaczYUtxhBm6q6juMmUP5ZHX98CHuxw1ojrWa", - "ed25519:8RGcVPkJpUrWYSzzTr2aCNZvQGNCZ3Aw1HsRru9gSxwXHgcWKX3a89Tkq8XWyowrjGznYj5qVvcXcozXyrECSUx", - "ed25519:2X12WxxvUV1VgZcGCCLQygtK5ws9X637FyqYdZeVyMFjYkGwGFpcagdynW72VEZCbkWUW6QVcSnjgGygLk7YWBr8", - "ed25519:2XnPPTtGyygK6eDeDGiobaFyviWiWMK4ZeSNgJGDM9mmbDPB9JVjMDArZXsG1AxC8BZYoPEbksPkYMfLDqXe9EXT", - null, - "ed25519:W3nonS16Nr7ZwWCz31FLhGDAR5CsB8ugMT1WhRWCGv36187mcGZ7jPq35LD9gqNBJtY7sbipML2wCjpxtK97cKJ", - "ed25519:63nseD8cntHbP9ccPX3BErFECdnhWxGVkkr2EARDGUv62FQt1gH4UzTescV1RafQkdqPqVnVfuHdAmZnQMeydHgq", - "ed25519:5ZiwsuF9DadRmM355pudc758PqZFsfzm68RykBs3QCiDnWdF9o5vHJXYjtz6QEarxfVdnZZbKDMmb98Wd96PWnS8", - "ed25519:4mA73TyiTh8T984rt61aYSKCW3v4Agspxw1RtWPuLYwWQaKRT93b4zfvmLDRDY5AuhHKr3WFHE1aq2ofJKkJkMoc" - ], - "block_merkle_root": "yU3gW8PUfzyp4newC1Nw2PtYCaKuojHfG98LU49UKK6", - "block_ordinal": 76633913, - "challenges_result": [], - "challenges_root": "11111111111111111111111111111111", - "chunk_headers_root": "6Eesz6jrDdrUnjHY61Ywm5kZaj2bMvYGbWbCheVVSQ1W", - "chunk_mask": [ - true, - true, - true, - true - ], - "chunk_receipts_root": "DryDrLqJ3a4WhT7CHcaSKwnPbmPFtXkV6osxnNYWfcd6", - "chunk_tx_root": "8AKwCFpihT61nmj8bRHJUiCczJqe9oTw7B1QkiTiJ9W3", - "chunks_included": 4, - "epoch_id": "FhmQexFCMWUBxNCWKgEKwvPbSWA4ccGMqJ7S5uTAdYYp", - "epoch_sync_data_hash": null, - "gas_price": "100000000", - "hash": "64Ho8BgxGx7UuDsjXNbzLVt4kvVkxzt1bThCJb6e9qaq", - "height": 86673091, - "last_ds_final_block": "7xxCpbHg44N1jDw25MBqR5JuLCPBzzPenJS18jFmfyFd", - "last_final_block": "7aLAqDbJtwYQTVJz8xHTcRUgTYDGcYGkBptPCNXBrpSA", - "latest_protocol_version": 58, - "next_bp_hash": "GjQ77x2L8jPUFa3Gfr5ASMrQ8d9jvQAQtmz4nSjxEibC", - "next_epoch_id": "5h3PDeeRRQjgyNvzbKepLcBJT3jWJdhu662LzfJGC8ub", - "outcome_root": "EWmBduehGYj5diH8X7R6fC4ZFDyNUjH9Z3VUvPGLB317", - "prev_hash": "7xxCpbHg44N1jDw25MBqR5JuLCPBzzPenJS18jFmfyFd", - "prev_height": 86673090, - "prev_state_root": "A997vSvhkrTRsKRHnNvQV415Lp4BNBfAeoVBkRLwWafx", - "random_value": "46yc2RXFHjxjAz3ioW3NpoFoqmUNP5Kae5ywDDJ8ccnW", - "rent_paid": "0", - "signature": "ed25519:3EZgjArnbaJK7taUjaW7eZJjF7yNSyScjgxipnwLpVGjgSPFz1w5ptbtFXFZAvpP6s2uVqLGPmcpRcTu4JhfwNaJ", - "timestamp": 1678091176086673765, - "timestamp_nanosec": "1678091176086673765", - "total_supply": "1123870259776647285084581742454102", - "validator_proposals": [], - "validator_reward": "0" -} \ No newline at end of file diff --git a/fixtures/86673092.json b/fixtures/86673092.json deleted file mode 100644 index 99a7a67..0000000 --- a/fixtures/86673092.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "approvals": [ - "ed25519:67jvTS1VLidWiK3umjgkEMxnDaRzqVyaR6125eR8rKzSM7d1Bz5HV57cZFCEAtNaQ8pMtvBVGSSPQfxDMUbFo8zG", - null, - "ed25519:3hLHGgk7NFefLd6GutPje32o4xJvFUKbcBkfMB5h2yyKrZ5NCZm9LZ7qbR3GBqHdkkvWqtpUrDD6ma53JFWFFaUQ", - null, - "ed25519:32uV6fiDDAZQsvVK2AnfLUnP6NEFZk6XvBYzWFGBbf7ZFxg9mjyihgPoiQfAxzWdc8CxugjpCd5wDskSMsaEhC2E", - "ed25519:uzwMPcNXRrbxbX23M2qqJX2U1zEKoi2G9hzoWsLRFRqUhXrk511vyYJYR5AQrCznSFEJ2R5JQ1qiRp1wB5DAsbk", - "ed25519:51dTeJn72inchPEZzvgKbhTPyfddRkXyYZELJ67CzcgDQ3d5ug9pyuzny7dH2DVortn56wDrBfTHkexb5aHJmb5b", - "ed25519:2KZPoVcPBU3LKUzVrp9MxgvvbDEWFMWWDft1YmgsuEEKJT4qe895SYsM1jV5mBqzHnUzW5TUB5epUSDMLMd1NAoG", - null, - null, - "ed25519:4XHrP3JEvjkKPxpg4MmoXxEX7BspusUDA7gx72ViZWcRRjcLEb6xxikiJ9sPpXLkH5FkvWmvEZaYiqf85irGyUHE", - null, - "ed25519:8f1vj9P5S5RbChKCDxJH92EfKsMXUaKPiFa8unsEj3jnYygp8p56ztTCwnyhjbV52E7wS9ZvShJhSvWNQqJ5vtR", - "ed25519:3CKdu2rHSF2V9mP8oHX8VhwNaySY666xnwxoCd8eQ3AHbRYpUD4fj7USxpGHEAoZ443v6iBGzYFHYeZio1b3nwTf", - "ed25519:FYbTT88qkKcMpNUkEam8q5gWa8AoCAqQdCrjugRieHDnWpCXuSNT3d63DTu4LwpTmHcUDTA3rib5YovuEtDxnF9", - null, - "ed25519:4wGmkyNVrpDGaJXkVndR7jNMsUEaN9Sg3HK28eWFfwMeTFoyaMNGdoVmKd2fjbffR63Ue71siJKKtRGAia4ysqwb", - "ed25519:674aMxrWw9p4GZ3Tem2YG5s4Lhtru4mbxfZJkni4hLFvXCmQdtP3p6JzeGSSPnZAte7gom6PVicep1W75XTUTBcs", - "ed25519:41fPj6hoPEPLWBToLPRyNybmMoQbChU16LrpAd2o5RpCsRvVDNE4mnybnV3UHjvnZsFqoKPSA5DqB97E7EwoJZP4", - "ed25519:4nimS82UDzWww6tNihUL9swnbgp5RA9e3ki9LhpBuuqwVE6m22AbHdKrUMP7XuNCsD1MKGapYtmz4bh3USeND85D", - "ed25519:ijZYoszPyTxLDmzREKVTggoc3DXoVhDDroiCsccXTqvvipGYeUMRTqa6BH5A4GVRaUNSGsVuZrbf7HZK4VubAuf", - "ed25519:dtwsdGwh4tWNmTye3r7U8vsr3111P41ZZntMs5t8niifuxnH6HFfE2HnNw2tVzafLKjRE3uWMraby2GqqDuNjhE", - "ed25519:3SAdKNPnMG8X9W2fj9Ba5hkWn7p8RdhCc2fqP1bqa7A5RoizVGdmjPV7jaWpG7xjWHdezkJEepg3MCDxEmxESPFq", - "ed25519:2WgfVSsDkhjECtjYQPqLKEewe2eain7QCNYuMc5cByMoKvXq84TQw9DoZVGLMvYVMFvzbaUNYujpJdzT8JVgtNG4", - "ed25519:9fpfGMjUeC3DGiSnWjpDR3vRogGgT9KjnbcqGFtuGyM79fzTbjv7JBys5tH1kwug7wrcNqMfJj38BuoTxzCgy18", - "ed25519:5ecUnCj92L6NimcPGNCKEiK3bbXuv9gukjTsBhMtt2g7bdPnKotPPvKAqoLELsGanW9kUaZzpXbfHv8ptcMrdAZN", - "ed25519:3xraBpfFWCsWKjvsQMGvjzXrgbzpH5jfiXNDPGphkUCEVk8JsS9JWHiSr5SUnUvyfqcocP11SdCjQ4ahh7GeQSfX", - "ed25519:xn5PdDTveG3GometDA9JaZ7znnc4766a2ieTqa55S9kNwxsS9tUxfhagbQLNfC9pU1FQVrof1hEhK8mvfpuZ2nJ", - "ed25519:aoUsJG1X1oZPqVrYiAb2Mz6BiPCADJEzCKdaWpfPFAqgNxtTtPSJRB9WpHqH8iZ3wiqpr79rsqBYuXD7Y5R7Sg3", - "ed25519:4QnpQNystBLrpnJN66qD5GKXdBfHyv8sKXgVEd35nv7TwUk1nYfahy3HnvzL7tL2ZKfy31D9iv1kEKyUATTqMTmF", - "ed25519:3QUnnCQy5CwKNMdbn1nCYLyUd9b97FkfbPh3JajGjVHdrKeEpFecHTULSyCEU9tCLkpUCBdHZVYyckUtRhDRiL9g", - "ed25519:DGFgVg7DB9RbnDjqkoJQiJXXZwT7jdmTTkq256sToHXmzfbxQUZTjxkqRyHzKe8Sifkg8sYfWeaJbWG3RytVcCH", - "ed25519:5PiYmJAcF3TJ5FSUjJkesoTszdf9JdS7Q4P7Cj8yFLdB1pGHbDEAqZUaqFUSMBQRK5uWpPwzxQjdQ1NbqidMwoYR", - "ed25519:2KPKquRAgKjHdXUu11G4y8RwNwA8s1JMML4Bb893d9M5Guz13W2riVvVJUVwNHuajcGnGSLGhyyogTZZWYqsd4WB", - "ed25519:4uACLwWif3CXfjgZDabKCFtHHjTfSB97wrt1UegDY6h3wp69qZt9bCGLGVusUZBy42agjchNfwGNsBnVWgvdoJfs", - null, - "ed25519:3qCXS6qVfUaWMTc6CCXTR8BicsBxXhnvPGKNmE1JxKJhZguzKoaraZGSBoinHsWoudcdXjW2jxwNxRip7ShaAy2q", - "ed25519:4iN55QxwCYo4xjRtXVdyyRtWQzyKpYrEUtt58wjyYSRQc2be12WRjpqghZ4DTSssipVCibkyvb9tRf6CMVWE1Qpo", - "ed25519:2eCUMouC6eKCmxQvmYJmE28zyPmxqctVXAZwtUP8jMEg5b4MudcthP2aruMM2nRc1vqtkQXic1WgDTrWxM3YkgEz", - "ed25519:rKTS3yHaFEbeBn4J3cJh42dSEk6dsrKb83kUH1SKewJJWGF3eh7jHpYTTLkKS593P6oRsxazGgab4fC4mEhhwA7", - null, - null, - "ed25519:674aMxrWw9p4GZ3Tem2YG5s4Lhtru4mbxfZJkni4hLFvXCmQdtP3p6JzeGSSPnZAte7gom6PVicep1W75XTUTBcs", - "ed25519:2vnWtSxSkjCcL4qnaJ4EyEZxHhFUGsXcBsDxVfB3vGv1W1MGUahsRhHrHwCu6AouKqDM7wCsbatRbdVfFYgQXd4B", - "ed25519:65F6CLzh8HDxfAWrJT1KCmBp3dgLCV38QmKKqnX9H2pBBaVKa3cWRQLRRQaQtf8ERWCZxaqX3Fh2vCnBzkwCxRiM", - null, - "ed25519:itVkGX7rUD27iJqmmGDYFiZ6gPuSHrLKYSxtQgzoqFXuvzDTuhxYk2kjx4TuawFYLAzS1YNiRcQFvvCZajgVztm", - null, - "ed25519:67HZNjz32erMZwM3sKprZrC6iszp2uiuCHm7CYjVGkaCz3bMG7FtoB446zndxu5DqNQ7ruUznFpPXzNxWVc2aiWP", - "ed25519:3oTRFvvM2ac5HoJsCZjy8NJcfbT6aDZXex1qw1ekgXwoctEVkfPZkfkuYh1bDhRzidkHbDbk52AW9froYXSBrkmb", - "ed25519:2qtD3LZzYKM9fiMSCC8i3njrN8hFR5X75K6kQBSU5gJwG3bzLUgsPf65T66Ds5CUHufqX2iuqFqf1DipbYVy69wV", - null, - "ed25519:5EMM4zvAR4rrGAekZrzf4p2LfBLxqStGLn7hnyvY1gUZsvDybD6YZ7YjhBJVp9ufoagJUUQf6gftVvwmjVydYSBp", - "ed25519:2c1w892NbprjmtoRm3cJ2BxqQQGbWTqk5Px1T4Fetyni1xCbF7BpBAQkzsCBbFiGmKxRqnbouyHpQ39gdiciTEid", - "ed25519:3BWQs4xUUQe4fhJspLEQn9mBP28RieeGbACr8jcuheNDuuJuNPZPXtCjzYLGQG7qLDyQhkULC8gqoqXV2VfhZSu1", - "ed25519:5ZLgqG7z59kiWm1hzqmwnkKUcrTHNRUSfksLvDrgoExipKZ53umLDiXA2brf95jXubpCSVBMhswQ6BXNpYThw9Bu", - "ed25519:5PASfeTezoVd39cVdCVErNR68iJMF2HyGWJVRnfn7mATzkE27NSG3Cwz98h1wiqWNeNC2uUhrFr6dUDLHiyrdjAh", - "ed25519:4cdetD1Qk9vySK9fsdaaJ1Xm5jHaLpK17TrhWi9pSUeLyD6VYsh62TahKiahiWxo9bApYeatBEzEEGMb9ioaCjnn", - "ed25519:3BFggZLovnT5BCLYV3NvZaEQq7EJQMq6sbKv2CpgzwqT5tTHppDGrcVH94LcLVroPQqe6kbjnqaL9fFYiXq6b9nS", - "ed25519:2JpscRk1K6pmseRabg7RL5cwLnWhyXhUHeHKroJ2rTh2XajoyNTZhVDimD2LdGYweAgkHCFxoZSeb9ZWdTDpjRKT", - "ed25519:2NLfzwv8JpxvtBivd5ZRjjbZq4yfGFaivgwE5X3dFq71WVrg6vQRatrhM3yRHcpvrCFX4razw78JPBrcmn64MELr", - "ed25519:4JG1vnuxfzM1VDb7TSDrKprGJxeujEdqM7upugfpDiGaTP11ZmeHDS4zV5925pTWAjayD2g9XBCmFGg4SdELkZcR", - "ed25519:4qaUoRp7iw9Vd6VmV6WHi59HJBqk7XHBBYZDQz6vmUoooY1FJEs5qHUGYi9kPZpD8fzzdmPy8QYqpuSARCp6x2DV", - "ed25519:5pxGScNn8SddtRSepfTMnLQEzoVFWtSxbDzzLzJj9cpoY29LqtSaj6Rk633STexpM5Q7CumcvDNQVtLz43Nvs1k4", - null, - "ed25519:57sCrjR3QCHsdvfRzAwnEc74agcbusFtu9faL89181A9gUkAfhr82FASjGSdKpgYATLnxxtHWboWNELiCvskJsf8", - "ed25519:5ZGPE86zBZydmjisq8EKnZSR1duj1i1YXK59Hy38zkHEoiZ7jsCNda5Lo3t6b3hHv2kUenPcQjGUphv5KLrPZLjX", - null, - "ed25519:4Rf3nnn4WmCVAAya5x3oJFiyQHQ3WppHqEaeR4JdvaMMUH1ciZbb4MQ5T74ercQHUseHAn4e12MgqEvc94DZr9PC", - "ed25519:jcGkm13ikyd1pZNxTiWKoh7zc4w9vQYrXZFuRQcdz5HQ7uKcT2W66xw4yunnZJ2uXjQtHkFKnRCfFXgQrgpofZj", - "ed25519:2v2NC6HbvKqw6av2J5iCv2Uxh36tQB9sQPFWounE9zWpHAhb86onsBE6pceK8dBuGAGQ8YxoYyVeBRjHhQ72LyCb", - "ed25519:3DuxX6ypfgc3nSWrZy9oaBHygR5x8WYrwbPgXrNWKvYS2K3zLPnYPu4FqxnmZnM6AsseEHR675Fvg8NWB1B6uqt7", - "ed25519:4j2KCjvytZujGeLHDdxGSmcYWu5EopetH3UBH7XbsEcfHM36gtStBKnq6mfdu4BKVr6UD4iUsiHqpxrs28TcQKvo", - "ed25519:5a61EDB8sApuJKL6Rbe9XmtYQLMpeMg5ra3wFdduVK8AA6LbA7ZwpNHmc5nQ4ojbT9kbLEt15u3MBM2ap9RWvXdG", - "ed25519:2Wn4tFdk7vsswWYnXizp6GtAV3LRy1CKToN4x1T7KcdJSoECxxCanVuaPkf38gRahdNbkXJ4wJnft4exMV4yBeDh", - "ed25519:481GQ9h7fssDfwMtrcXWvMG4TeaSXczZ8VzxgfNLPbQpWVyGxrrwuudVpNc8MVDpPyKPX4yBWDJBL4YkXjJNLdCR", - "ed25519:5sXQUc719DfTxV4oKiGehWKgZvKo4rCikroUxhrkvEVxgU1Lo4piSHcs7msstveviPhqdtUdaSZaiaJnb4UWwHc2", - "ed25519:2cPFrC5wJH7jsQFEcuH1Vx2eANTTdovLrcscMqyozNGneo8YptkYtDZi2TkroMuGcDsazCneCyKXbAD43QDbfYBS", - "ed25519:x5kSD4ncYMSq6TZoAbugQpiTu6xLUAa3DS4pjLgFPaKnJb6HpxWCHopMPmCvk2hbzCVDMDcfmPmDo7k4giDogtq", - "ed25519:5uByef18CuCdCrfpi1BFFy8dG1aLwfdSzEMnbneMqmD3p2EGcyrCfQP9jH7HKy9Le88E6RsjPRwteq3MRpW7YW9B", - null, - null, - "ed25519:4HFBQuXUf9LakdkLF423jbhmsJNp4QjHtzhsS7YTx7oFxLm9LXTVQErz5PxMsYpcSVWADxqREyq2FN1C1tpbEEqJ", - "ed25519:3NQhhU6ufUoyDba9xptb2koT8JXELpYZZC5ou3fzpmFUBYwmLrs55RCnS2fndZZ2US1VAAGf51RVSrhkrGkmTKaF", - "ed25519:4viSJwbxURVejFXLRPeA6yaT9dS5VSgZatZ9Ru3Dmy1Rv5z9B2qy9JmUXzjuwHCdZ8VZSymzTwNmF67ydZpPsUHJ", - "ed25519:42MbZ9JDpQXqTsYeMBojen8DejrBKW3v3cSRDhbaRqK3xLhDZHCeeE6LSDQDWc1FuBtn5SNq7ZNDSq88ZUqgHWnS", - "ed25519:YqPrEWveHcCTB5atunW5bmHFCxQcZ4y9RFSTZGTtUCYXzHg8SLkGj1eNdqse9QTg5B8EFpEJsKKeXajwW9DP8om", - "ed25519:VCP7jMDSo7Ym2Hr9EQQwu9J5X2Nici6zwb4dCMRoFsWQ4bY5m5N2fC2NfahLhaTupZZjPE5fosUCJ6H7QdcgKNx", - null, - "ed25519:wPZ2njXUSi3QTEBAgKAnN9tAo1kRn9rDqpP8AEFRH5umW5XjMvqJM2b7PtNHG2nCzUxR4sLGhuTvWRzybzC7oyZ", - "ed25519:UGwNpcXTAoAeJN5GW2buzSdjN8ebrBC44Hv2amyo7y9ZqgYyn7TgeapV5WJYDofn4v3Agdx77EQsabkJv96YAuS", - "ed25519:WCst3Th2VX12DVz6KTYa1tjrGyH7xkks4BQtrrGfsZC12KV56vA9QhYtZiHhvgi25rX2wePJ8Y65wN45mvm2Siw", - "ed25519:3N95DirEpPE3YiwbYVy7s1g2rMKFNZTiWFfeC16i5dTeBtA6QwTB5uAudSViT2d7UtMjjL4UMiKuoutQuVVA4uUD", - "ed25519:ZYzjG74yTyGWpEqJSnLZdbA5ke37faAgiesRCfWZN9gz4GDmUFHxfPmS84J6cqhPng9VQgpufJDFJMQcneJYpCX", - "ed25519:G7Kqq2gZRHKL4eQGgCehAA1ZwEktZAo7XbcMdxnvF6QVDNWzGYkiZoyMErFh9dn9AKZXVxEiuVSHci1TjhiMTmx", - null, - "ed25519:3DcT7dHWyNzv5VTAMFuybxVbTKwpoYgLTvEq8mw422pHWg5wdWLo39yHRyuCgE6pjuK7HutCgcH4hXajAqAuGi3T", - "ed25519:3xBqYdR93xDUBqGciGvDbxsZ5tr2hURCsTgKEQAUEA3f49yX7iH8nT6oqxssBJZ8VCivmsTgX43smT1yuHqpP9eh", - null, - "ed25519:U1YGdZtFDm8BHE92m9baWUDt1oFGGTDwzRVd98K93GtafYUnF4UfJ97rkS56PZCuhYC3T9UgcDYo4LGnSU3QaER" - ], - "block_merkle_root": "399L6ovAtXNsNQwdziohUb4u9LJcCCSgUNjG3dFgghfD", - "block_ordinal": 76633914, - "challenges_result": [], - "challenges_root": "11111111111111111111111111111111", - "chunk_headers_root": "CnGLihV6kcFiv3sh9HEPG7HmVbF4F18iAuewFXzCuai2", - "chunk_mask": [ - true, - true, - true, - true - ], - "chunk_receipts_root": "8ac3b7gAbK2R1ZxKEJUd1JnrdHU3jQqALb9AmR1XDC4b", - "chunk_tx_root": "BkA7s42AmLGQwGxq286d5r2SH3Qt9arXxQhK7PeVqJ5M", - "chunks_included": 4, - "epoch_id": "FhmQexFCMWUBxNCWKgEKwvPbSWA4ccGMqJ7S5uTAdYYp", - "epoch_sync_data_hash": null, - "gas_price": "100000000", - "hash": "Doy7Y7aVMgN8YhdAseGBMHNmYoqzWsXszqJ7MFLNMcQ7", - "height": 86673092, - "last_ds_final_block": "64Ho8BgxGx7UuDsjXNbzLVt4kvVkxzt1bThCJb6e9qaq", - "last_final_block": "7xxCpbHg44N1jDw25MBqR5JuLCPBzzPenJS18jFmfyFd", - "latest_protocol_version": 58, - "next_bp_hash": "GjQ77x2L8jPUFa3Gfr5ASMrQ8d9jvQAQtmz4nSjxEibC", - "next_epoch_id": "5h3PDeeRRQjgyNvzbKepLcBJT3jWJdhu662LzfJGC8ub", - "outcome_root": "FWTgtobyEuNjujYoC1NPSLsBqHi9iZCVhvFefZrTbw6c", - "prev_hash": "64Ho8BgxGx7UuDsjXNbzLVt4kvVkxzt1bThCJb6e9qaq", - "prev_height": 86673091, - "prev_state_root": "E2zn3eDHtVWNjzjSLiitA4RTeL9qdyhDNxbqMVH2thJa", - "random_value": "4wDPEBNbGTg8hH2nGpZyTH7EBRN4KquqxGgNS919qMmr", - "rent_paid": "0", - "signature": "ed25519:2FVbjWHr6mSFUpRVF9o7T5WAyGdN634FnTjRmptHCN8MprqgkiVY1PZHjNUjUakDNzxTw7jGPHHsYHxZa21uMUmX", - "timestamp": 1678091177281053676, - "timestamp_nanosec": "1678091177281053676", - "total_supply": "1123870259775456041476524242454102", - "validator_proposals": [], - "validator_reward": "0" -} \ No newline at end of file diff --git a/fixtures/current_epoch.json b/fixtures/current_epoch.json deleted file mode 100644 index 20ecc1d..0000000 --- a/fixtures/current_epoch.json +++ /dev/null @@ -1,721 +0,0 @@ -{ - "approvals_after_next": [ - "ed25519:2VhGGz8cojutZkdWbZ3bUUc4fqVdM6oo3zBtadCfa2HpUw8revjxpbbs4upmF7JFEWgwgfnX8nnDregKLvEjgc7m", - null, - "ed25519:49KmyiPyt5q51xdtDkcQ3ETtyPsUq8ddUWPttNLrnGNKhCwpykaPy8zNhXiFYPQEaZ21SAB5Euo3k7U2kb7mFJcC", - "ed25519:2xvJ1PY4cbZ7DnVoQhX24Bi47ef6z23FByTjK5sbtZYer2W639KUaKSeEVQAs5Jz4jWbCpBGjDNRRgLNUBh8ZUfi", - "ed25519:49dng3dQytReroebX6po1S7y7JmewstX5JdbW2yK5tqzfdAbzyizozfYb3jS7FWpqcbVCU8j7hTep3rAX3xeWRDu", - "ed25519:4Xa1VPFo9WjcFKAFjRmvB4uAGcQVkrVMrgo7vX3MBYr6cDaXCRrKjk4UFzYqGJtD4jvkZrN7CH2LYmKm7QiE9U8s", - "ed25519:5i9irHTS7p1W1tHmi7ANfWfr4Epcn9VHFeNs3Uvq39CknfCW5xf3HnZXfcKMJXW9DX1qCmMU9eTBaYygZ5BZa8tR", - null, - null, - null, - null, - "ed25519:2wnBH5A73zCforWmtYQX2jmjF3DAo8Z3XcxvjFMiGjemYy1KbxLqhCjwfpeN2xB7ZCREEuBE6yriutFvtAvDWZdv", - "ed25519:2B7PqahnewnRz296wDYxpUCeSobM9w2sLYviGubk2h38sEvUWbgBi5Jxvbck9ADMPNEyiYEbetr95Zfv57tjm4fR", - "ed25519:5AWEsgjcn4QstDAdVYCJTTnjEyvCZ25Cp4h6canRJhFDFcUShkRSTBR38XoCKo9Amn7C1JWqVxkgk4wpogXSHcjD", - "ed25519:49efUuXm3BM5XY3HSFSPjtv47w5JuRtg1AGH5ojFtzBTvVsqgEVXpKXi6ZupDxMT26d9g3jyFWqzvis4PTHMD4Jg", - "ed25519:ePPSYDSAK4R1wmQc9HwbCuZd2FYgqRNknkFwREJSaA32sHHPykNoAJza8T1a8GVzHoTJFaaXNF1H5Apvg8ysqFo", - null, - "ed25519:3CqKXCuBtYkvwk5xsRwRCoYFwQeEScCUbJGuZZzn8H1hJkb7eSZAtvouUxVVMaRxyPGZciyFaLhpoX6X6veGbjqa", - "ed25519:4xfsJpdJApuRveVRsdMpuK7mDdx1MP3uL3U3Cnib5J5sQPbUS33MzegaFLr8LcYeUTLsSCT6ycMi4k7eeC4cx2uy", - "ed25519:4HnubxkveyE15tMZNcEDLq5DxxLyFT17XpsMD2jsw5BGUb6qCnTZuG5E8KQuvvbLMNcqnA9vrnhWbd2LxqtghaUs", - null, - "ed25519:562BGk9m5WwT2CruNiKTYJnquQjFadeURRYA97xZ6e4R6Gu19QAYkcryjCePZyS4kEKm2xjefDqpTaSgf2Kaf2VH", - null, - "ed25519:SvdETeddpFKbtHDCrvTnJKnu6SvE2mu1evahcPrf2RmqZK6Cz8dzAMykjvE2fVcxP46M3opovaFZxzc7o7Wt8cP", - "ed25519:2xPkMJbmdTbiXDhZ3R7QNaVL7Gh9qVaSXbon9LaKUg9aVtJZTxTVHXGDLC9rdU5Xkq35UGmzPyqVjULLUawZuGnV", - "ed25519:2oDV64kdMt4a2VuRiTeAoVu8Fpdz5RMs2twSFKYi7D6chBGjHxNrYGtLxhxFAScqDVmxDjUoRK1Dnvdytvtgd2n1", - "ed25519:4gVh6trN6irVVsTQMyQFdE1z2GJcfDuVbwCLz76CRP6UJ1LAB8Lk11TfXeckKy39qrExZjgpUxpfJidXYN7xYGYR", - "ed25519:PDxVou7E2mrxojsX42mL9zv73stcp8TdDAjb1UDT2F4MN8yd4YR7yYpsrK1NRxL2W7osAHyLnE1peWHdqBvzkLs", - "ed25519:4Cah1td6h1zgswNwSNosVicXWbQ38WUjEM782Zm556WWSsSYgjGezYy3vsvkABQuCPorBSHxngPgTYohcSzwo5j7", - null, - "ed25519:2Pm6xG7LvKD9fMEvtSkvMRizPFPP5qBrh29YqDvkCKmoYMJBZSoQJP7kSECWSdJannn1hJkzg8AUFE87FRvCh8E8", - "ed25519:2TNsyhbGWnJfN9e8Yaaggfbf3Yu7w7JpGAQnUe7LkzBKfruLF9yDxaAo4yc5CVJiVqX13NnQfPLcVPpaD1wgMFfV", - "ed25519:41CHKZLBr3pM2eE5wXjgaXrBM7ugTiBBn2JSfar2tHhoAtSKNimfyfws9DemJDs7LB8CBNc85WtqdwGgCsB1nWfP", - null, - null, - "ed25519:3ePYVb2Vnq2x8hm7sgoZWNVC3Hbx8RVXs37AVCpo1eLLLeReRocMDnDUsTss7kBHqMwi5QpZ8ZBUEocYFFX4MYhD", - "ed25519:h3YGEEUj628izdmDR4eBmqYhtFcMfQM14gpL8cmHzE1eCpLmVWE18xQFcdbGLAoW8RGsVPaYdBHbrkGznNA6rT3", - "ed25519:52wySwA9PdQNbrcJnw5oeaK86UGjKP1z8QcWPZZmi68indUqyHgo8x355AkH5hw61DoxGfZ2SCTMGSV9u2b5n8FU", - "ed25519:4ecMCbGYYkBFU8Udth8uozYMnvkQqNde41ZyzBfzABFSoxxv9rK7Tc1BfCeedtUJvmqGUWpwQ9wcWHgKT8BYqNf5", - "ed25519:23SyCVTm5KWjHHkAs4GFCZTvzZhB3G4QtpJNeSz8JgZdT6A77dabePnUqWpMMENF7rKF1dr8bri9doJR37PZB4bU", - null, - "ed25519:4saccLgvU75D4nBJWSPzd71mqtRGHhv2Kx5CtmGSGLxGG1Sd2BmZtrL9rHksQGjRVKxmHswv9RRDdj7JRKqCVJJx", - "ed25519:3CqKXCuBtYkvwk5xsRwRCoYFwQeEScCUbJGuZZzn8H1hJkb7eSZAtvouUxVVMaRxyPGZciyFaLhpoX6X6veGbjqa", - null, - "ed25519:5XmffM6JMYCQQum9764cGxRA7xDGYMUpY3T5Jaiv89f2XHNniA4ZHUN6LkWnnZbdbj97cJYbstvTgCspbWQvVdfH", - "ed25519:4J5LPAdP7Cbe4foYg3qQdTQyxLDVbZk79BR1xJEY1TQJrtJq9JyJPqHXxYibCqeAPVqXhWXJzMzn7BGjYuff8znN", - null, - "ed25519:47Hydvzd8rUcaWF7bkV1Vap7yPvFK7PeMSGMvhjRzNdfqjvEBiJoR4t9ktYVphx9BCQSzDQYdxjysR7yAMykq9rb", - "ed25519:4894KtUJZ6Fp1eoMWnUo3gPZLnMS8q2CMMGRYjXxTiEfM8oRDjzUKhg4x1QLUwCWoq593UpcyroqhcAUkufLXkgD", - null, - "ed25519:5wvk8hNhNzUefu2ig3eyPcx9FHQAqTa9ScornNdGQ7X5VFECzDtXKZh49VDs3SiSAyC8iuB8FgJdxmUq1b39Xoxk", - null, - "ed25519:21KSxZzZtDkLLH5RuJ1auP73qkuL4WXyRLtdvq1XSRrH8Yk1AyqhsJ54YbRbbXmetpRuXuHKENwN1hQsNd37vQZd", - "ed25519:4NcmdYz5VjHKmSRboX8NYsZLRGtGe6bPMcpCcWQdQfTXezDY6EtYL8awXWd6Y3kxaaZkJJ69FuFBazjtTTWADivu", - "ed25519:34sdiKBSp2jkjTySbM14ivoXseRBxpYus7jAfsBNnaa4KPxhpLXVW32proR1YCt732AErg2KnyC7xkJc3Y6CVJ8V", - null, - "ed25519:4aijMmx4KWhS4XmxBfxVCxnJ4s8Yz3iRrFBLYXywb5v13CtKxW9VKSNqwAXJw6jndVaPTo7rz53CsSWNG8CEujgz", - "ed25519:52MtGXV8G1Tq6jWWZZXxBVGVQQK8Egz2yt4TRMqEe4YPDgo9PmCwoNbpzPTSdBQXi4hwFDHpSP5aU1DdjnFLkrFA", - null, - "ed25519:5xBStwognhUYGVzX4dDyVTvJ5HpT5wqFnLcAbNVK9XAJXdivcZqX5MjFBLiwyPHUpPKvx25UEztbtpQVyTqjaorq", - null, - "ed25519:2GhyEXY4wR9iqWshGEF1tQ5Fwb6M6ZGUeXUwQjHed5eUQs71YwuYUyACgSH5VoMiJwGhPhitrjwBVqV9eLHbmDzv", - "ed25519:31wQipuDcL6FwTDd3NCwaqiUDyi7cZUcr7qUF54sU1akdrkQmdHmx1wvoYXf9CU6jrAnF8qrvhridMdgVtZPZvx1", - "ed25519:4DqZuCJx1pW7zYqqU1rU5K6Qf7TjP5LnVU89PfNkmnwfRcQeHaunkky5JC9qYNZLgpQ1nufb583DsakHD25fDNvJ", - "ed25519:5EoXqxQa1TcMsjh6DfzQqbkMJe6Gc2VeyJaFCNhaHuMgN9AEa394cpaQrceS8h9mowNDHGJU6KGHSUCbPrPXv3et", - "ed25519:59hxAGF8dSHwLaepMQKPHxqvFGHszQJfLhLjtjoXKYbidPfEPr1ZAF84X2npHoQ7SHwf7Ev47zEY2RCNUjvY4TuA", - "ed25519:2rKQJBW1LKRvh3Z134e8oNravs9q84Gr72NdrZTbHu8eepp7SgUoAPexCRgCh4f3ubeG5wE6yMdHRB1WTZ8RrCgd", - null, - "ed25519:46TMbMumBmNEP6cLDtS2LshuznVHoFdxzmqYunkqeQm5S761Q6LfgxHkLXx424NFjyebAhmWk6z5bVYHCtyczxJN", - "ed25519:2gWgD8Kyobc9XXGJ4346BVA4rB6wKMXjZyN6GsQPLNCsZEgR8cTk6gxhwgxHxUPDGkob8bsFmqU5hh8Xbochkb3s", - null, - "ed25519:61hGSWPcfZ6YxYW41WG69jhr9c5UrA2XrE2KZEEPHJkDHV4dJBFWvhtt8hXNz4cmPai2uwCy2DZSUgBYSR9sjaYn", - "ed25519:5MZU8UxnychBdGxzNH5k3fa37zRV7hgiauZRuPNXks5J4EgBS8UQxZU1JUnD4j4JhEQRAUmfJ1J5S6VPfKbQHSbX", - "ed25519:5EXH5GeSKE5T85XCuTbF5cMQbUPYG3nzXyKYM9eQL87v83v2U2dHaENa5AjgfY6NmXdfJjC7wNQuo2inASWvYFTi", - null, - null, - null, - "ed25519:5a38NPqoMHpXDqTthFZPFjKnv3cS7pyrrT5ziGNCwGBfaGk1VVyqrtDawmhKMBs8xhUmktXeXP9Wv2PQGdVkxh3", - "ed25519:5mG8yAgauHMZMyFMrPvQw8qGQ7D2xiksE4vekVPWH4bEbxUuwJtdHr5cQgqY87KfSqqbkgrcxozKGRi3CFVapm9g", - "ed25519:4BjQpErboUNcF28gzdxdKQWvRDb7SVZjx65knyCSqseHkZBRT25AfAJkdy8Ra6rPx43xK3YPxu38hbZmKG9nxFkn", - null, - "ed25519:3Uoo5KSZKfPGACtJLiH3KhFBs9N8iohXy5iUPK4BG3EFGHsPcUKLVboWnPevNRx7hcpmKsyxQbcRdndetDMVTWvi", - "ed25519:5uTYvfbViRcsmox5UPkfkzHmEQ9Z5uxdeZ6NvmtTwsyidqEYN1evryH1USrpmZR4t2gswDSLitoSywEFftZ6GmGB", - "ed25519:2B3V7Ms1ZPKcZ5NqJXW9MgRDgHW21gJV1kCu8nKASK451MdVUEdBTd4cyuAqduv5RZQd7F16XytdG7PDXam9BQcA", - "ed25519:AJZ6918C6QkmnS9CA6ZUAAgqPhCaq7Sqb2ZFPWVE84cRsubN9EAR1zK2dBRxX9ZtQhheyzAHy6RwCN8EDRJUHTM", - "ed25519:5VvRCFWLATSRSdEE85NQV3wNhRMnvmeXiV4oSHKyGwi8nowdVmnwmAT4kb7ro6Z1A74hYDqsRQjW4PC4Cxarcxq8", - null, - "ed25519:4PEddhHi6rrKjULmA5J4Sq5djmZ447CGuDQwUEhe2HNCxmLNWQ9njV7kxihmD4M5oidfvLvmdF7z9aDFfkzZBYfW", - "ed25519:5HVs2UR3Ba5ELFjHUmMVfww8M21K4K9wodqBHhXntuRk53GBZnLx8V8eqA5KVbSCJeZZktoeTyqMT9Pa5jMaCKHW", - "ed25519:31RMTcGQ546gn4MXUyytA6ugo1pKXVMa77cVMWtzMLHb6kQF4cPw4gdVE5B69waSaL1GzBtN7Ra7PMDgsMWoN8D6", - null, - "ed25519:vCcvHzko2DqtAtgPeodUzQ3ctemmZKwva5N6xroMcdxYW4CYiG4cgjseq4C72kGuoo1fmt8AQV1HSaG6wd7xeLA", - "ed25519:4Gpvq9SWy6ARfNKHMw6gEC6AmF1EMqXUbdkKW1tGGpw8ySrrPw1ZqFfqAVCyVueteZBgQLp7MSsiBp2v97Z3M4DV", - "ed25519:3Wn5NkmKk9RA5moGFTr5oW5QvHyF3fCnMVjDXDPi8WhwsgHQ9oEHpGpiFkpKKuJj1hTgeP4Yo76w1Nyv2Ya53XFt", - "ed25519:5nGyhoz9wwJJwaDMGnBN3fpxaMVNzSeBrTx2F1v6R6nTRS3Fd16vpGCezCr2r8BSzCMZDrTAqqXb62HeyXZGZbpj", - "ed25519:2WGZQemboLuyCrqoBKAD4GEGkWXCAo5SoN8z5oNzrNHJewesycHwrvoSuw8mmMSPBUQutqnowMtMxsPbgmJnxTpx", - "ed25519:5EzFyykbaPjWrkPRgE5CWkLSkKrA2PGkfPucSJDB4Tzw5VETAS6TuusEAD9TVH9zpHmWvQ6qcxHMgD5ycUKWXsuu", - "ed25519:4Qrtz6NqwegmRV3KWMKVXPiPQ2xJGKyVLwTQZ5gRipHUVaU6ovtoCh2Knk5rLr3BthZumWXYzbQiumS3Adq2GZWA", - null, - "ed25519:5sMjvdios6LjjCGiU2MMo7fjjkchJuxTwXroKWGD8jkzqFqGjyb1tEiD24sbHtuGdW1DTKLFLGzvLqKrexmf3vU8", - null - ], - "inner_lite": { - "block_merkle_root": "ExTQ1q1HvfPZy7BehiR8JmgwUd9j3DTzHrTPmr6r9scd", - "epoch_id": "5h3PDeeRRQjgyNvzbKepLcBJT3jWJdhu662LzfJGC8ub", - "height": 86716292, - "next_bp_hash": "ALsAx1zoiwiCvcJoSrNuGbtTk3XcUcXdMBGaZAW9C36m", - "next_epoch_id": "BCC27fXZwLaqs3MmuhvVfiSHtHjSw2y4zQfP6RTCT2QS", - "outcome_root": "EwkVmmLtfMwR29qGPUDVAEVPJZFPWjqTGBGpYDxLSja3", - "prev_state_root": "8NnmP9ZsBesVgrLwWbLTNVGp9T8NK2oRcBLAsL7eZsCp", - "timestamp": 1678142413035318546, - "timestamp_nanosec": "1678142413035318546" - }, - "inner_rest_hash": "49Jsd8ULPst4hPqn9gLV42pncN2B73Xgab18S4BRARMt", - "next_block_inner_hash": "381NRbYEm7wo1miWJhCvyGFC7WuMyhTJkDP62rrPmm79", - "next_bps": [ - { - "account_id": "figment.poolv1.near", - "public_key": "ed25519:7RjyY1bRKDqkshbKZtgpQdwsdxou8j9my8g1hPKZ9ngM", - "stake": "39206129243863608141066930499972", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "staked.poolv1.near", - "public_key": "ed25519:3JBVXqenru2ErAM1kHQ8qfd29dCkURLd6JKrFgtmcDTZ", - "stake": "33419809779120392920269809612199", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "astro-stakers.poolv1.near", - "public_key": "ed25519:2nPSBCzjqikgwrqUMcuEVReJhmkC91eqJGPGqH9sZc28", - "stake": "27294688224403596819807905373855", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "bzam6yjpnfnxsdmjf6pw.poolv1.near", - "public_key": "ed25519:2ZJqaaCAisK4u8E2i611zFfvNmrvevovnU3M7SpGHkLY", - "stake": "23416062305792484840940844551487", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "zavodil.poolv1.near", - "public_key": "ed25519:HHARoU1hANWF9hu7YRstDDvgyigBhUeUuqecRVr8dpUz", - "stake": "17630216582180625016114945099933", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "binancenode1.poolv1.near", - "public_key": "ed25519:Bb7uPEocbsiQwRfPmsiiiM88DodtuYnBDi6dKZ4JZo2N", - "stake": "14048896105546755595738737008478", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "yes_protocol1.poolv1.near", - "public_key": "ed25519:4bnrmHSMYkvsgjbQSaCY3AFwrfS1w17ACEUQdn7aC4iT", - "stake": "13632840600753345981723601120095", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "staking_yes_protocol1.poolv1.near", - "public_key": "ed25519:CVVcLtfAWj6k1DqKJwhYBQwjMQFmXzFY2NBdMxp1RqL1", - "stake": "13548114501459907012425142831555", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "epic.poolv1.near", - "public_key": "ed25519:68HExKDtw1CjGzopZ8fMAMhMSZRVKRhwLzLQmGKtFNzT", - "stake": "13361490946637633806027080459531", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "electric.poolv1.near", - "public_key": "ed25519:GpSr5KAZMZ1Cb4dHMRUVhmp95y2fmWtm4dEjAr8iAva5", - "stake": "13094194582706200726499022124313", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "aurora.pool.near", - "public_key": "ed25519:FZKXoWHFCXMrKiXjAKFdHo5g9PDom4bWMRFERBfufi2Y", - "stake": "12455530195608719577803023115066", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "stake1.poolv1.near", - "public_key": "ed25519:7EiVt9i7SmULDKEnAXBFSMzwUmZdxUYDFkP73MZuCH1h", - "stake": "11723004342951596666411372180029", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "sweat_validator.poolv1.near", - "public_key": "ed25519:677kArWPFPRDgWEBHqHj6BCmEdTVBsAcjQAc75Gtyq2j", - "stake": "11061535470684271849484334918122", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "dqw9k3e4422cxt92masmy.poolv1.near", - "public_key": "ed25519:EPNc2bHqRCz6TKLstNiusv9qZCRBL63zViwUAcgoZJZj", - "stake": "10479308296906700818189011839258", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "future_is_near.poolv1.near", - "public_key": "ed25519:F3vEGwYYGisaXwKJWrYgorB95DfArDby8bK5wydxD5fp", - "stake": "10309322520727981661721876402207", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "rekt.poolv1.near", - "public_key": "ed25519:FoAaUdVKEHtVokG1aVmJNou61YcfQhXmaZ5Hnfsz4fHC", - "stake": "10079667782041637158777028934416", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "kiln.poolv1.near", - "public_key": "ed25519:GAekByYrSuo3seuaGQx7V1ZTC3gWZY8JxZJ4aWW76LiT", - "stake": "7980652394651037069871965079140", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "nearcrowd.poolv1.near", - "public_key": "ed25519:He7QeRuwizNEhBioYG3u4DZ8jWXyETiyNzFD3MkTjDMf", - "stake": "7002893129834998728551934925199", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "finoa.poolv1.near", - "public_key": "ed25519:62gxgzoie7FiK9dnWuiwM1bbuvhpceYDavK7SgdfEMJc", - "stake": "6862544459467539008922458111228", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "d1.poolv1.near", - "public_key": "ed25519:7ZhMRwnSHGJtWjGBZiRhhSi6XyqKeNHtnEXsVTNdrsk6", - "stake": "6522886931909028877795116092724", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "continue.poolv1.near", - "public_key": "ed25519:9rDZywYL3tnvzj6hnePw3MaPFPfSeSCLxBp1niTGbMaK", - "stake": "6418629997062742180813621956876", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "anonymous.poolv1.near", - "public_key": "ed25519:Hoj7LbPwNwAkLFhf8z2aDF1BG6NDSrq1BfkdaKqPfbXx", - "stake": "6271712752150531999559361269851", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "hashquark.poolv1.near", - "public_key": "ed25519:3YDdmN1vhF7yAWnYxGMHY46jcLE9h11HvEeF6Kntugeq", - "stake": "6176316778768669484263610930775", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "foundry.poolv1.near", - "public_key": "ed25519:5Qx8Fq3SK4Vu1sRRpf2HsNGLAqdNqgkKEebHMniLWhkW", - "stake": "5925879216899098565250728067432", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "near-fans.poolv1.near", - "public_key": "ed25519:AgV97ssnHm7qN8JhYZjwyDtuaT6Ms3Fgbw3WeAC8M3iF", - "stake": "5646665045313893189005647236282", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "stakin.poolv1.near", - "public_key": "ed25519:85UGfKdVoxX9u86JsBMxmVHBguYonnM3vTR2WoD5GkEg", - "stake": "5583623315375786166458286896325", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "neardevgov.poolv1.near", - "public_key": "ed25519:FsZH8qQGfHRxFUbrK5pCEDgN758ZmqUtcUtYRWWGCcAG", - "stake": "5554866332371942354526927649509", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "hb436_pool.poolv1.near", - "public_key": "ed25519:7oU4C3vWqkeup7aMfjyV1ojt7yKX7ShLfvNCahBRy1eW", - "stake": "5396966930657509205043842792722", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "chorusone.poolv1.near", - "public_key": "ed25519:AZwJAgu2qRxHwdpj8ioZEFGcc2jbaZGN7ZvUe7CuXtM7", - "stake": "5287147598217926353386779299664", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "08investinwomen_runbybisontrails.poolv1.near", - "public_key": "ed25519:C6yqxQ3suwjmm8ufG5e3BsHiwxUs9h839FCneF41V7TM", - "stake": "4857774634147130373813689246471", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "p2p-org.poolv1.near", - "public_key": "ed25519:J441YAvvYvjWs3aVzjc5KLLWRzmhQTEMaymPyWFkMGeG", - "stake": "4723790666044236105496108137009", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "northernlights.poolv1.near", - "public_key": "ed25519:7HXh6iS9Rh92Uj1c5T9fPjQXPLnti4Rr2cJQcJEYpdGV", - "stake": "4712387224906733281947973541174", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "nearfans.poolv1.near", - "public_key": "ed25519:GM8vWM4TqTt7jh3sXYCAs2KPyn4vEmAceteBGEFYhyku", - "stake": "4710423887240747307183606599570", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "everstake.poolv1.near", - "public_key": "ed25519:4JLvwa1r2eAxHLyKeDJnpqMG5f2Z9rr49rwuTwb9g8u2", - "stake": "4623315567330451805820491717070", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "openshards.poolv1.near", - "public_key": "ed25519:4Xm73PiAGMZu3mZg4gF7j96iTAFHGbPvqzxBaTgKP4ub", - "stake": "4611959073339809590025288736983", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "dokiacapital.poolv1.near", - "public_key": "ed25519:FGcJJeWMyx1xDbfkcPM2oMeUeGaADJuPmeqx5rjsHn7t", - "stake": "4332759036466228308554905977698", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "accomplice.poolv1.near", - "public_key": "ed25519:5ck255MtkoGQxh9LfjNtdb4M7WHkUmjU7SBJCEkZP2B7", - "stake": "4266120587684739122299552723543", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "cryptium.poolv1.near", - "public_key": "ed25519:5Y9hW8cKBb5RnsJBqttHHC5ujz5zcZZ5xnrJPwkCWmGQ", - "stake": "4227791919561939934282903484058", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "blockdaemon.poolv1.near", - "public_key": "ed25519:3GNFSJiFQQ1rnR68T4eZRff2omPhg1CTewUHBJpQAdyc", - "stake": "4197683971126897677552917113311", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "pandora.poolv1.near", - "public_key": "ed25519:53N7KBhSkEP6tLuQmxZV9fAK16D1C2kWnuzes8KNyS7P", - "stake": "4146080022605167207664031127947", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "bisontrails.poolv1.near", - "public_key": "ed25519:Emk6wQJtpQZRJCvvPmmwP9GD2Pk37xxRpmb5uRvJpX62", - "stake": "4038512909923817748075892748374", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "smart-stake.poolv1.near", - "public_key": "ed25519:A6wpkLQiYqPZ1rbd9s5S1Bg3LxccVsQqiCRDUXwzJ6Hx", - "stake": "4003234307493046391337326649739", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "nc2.poolv1.near", - "public_key": "ed25519:He7QeRuwizNEhBioYG3u4DZ8jWXyETiyNzFD3MkTjDMf", - "stake": "3869238705002385060975735647681", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "ideocolabventures.poolv1.near", - "public_key": "ed25519:6NFuvrmnJiokXibR9Z7TUHjB4NJnD1rJAHhBu9JWmBdh", - "stake": "3771051905041496783453388460098", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "stakesabai.poolv1.near", - "public_key": "ed25519:6abauNvvWnEkagjVpWRy2tZJdzPkmqurUjteMTKk5KQF", - "stake": "3535334314397193862153015712370", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "buildlinks.poolv1.near", - "public_key": "ed25519:Hd3irGt4zEqRPAzcFszX3oTkVWRFFxdecDvShCJSS1Wg", - "stake": "3526372164342614084796298814676", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "sharpdarts.poolv1.near", - "public_key": "ed25519:9XMHXqv7rM3QQxzjUu7dfKD7GhMkq8CEceaPdkhiBQUX", - "stake": "3434848476944224053624702383467", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "consensus_finoa_01.poolv1.near", - "public_key": "ed25519:3LqCGkM3uLjQjPmd3yVyaEnceinEL4cBfUm9vp5hJRTJ", - "stake": "3210187970648326218235433796250", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "nodeasy.poolv1.near", - "public_key": "ed25519:8mjespqqUePSYSsxYxPqCUsZUuMxVJr1vjBRwFeCke5K", - "stake": "3175117754588187183467391312105", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "consensus_finoa_00.poolv1.near", - "public_key": "ed25519:62c41nzrrZAspLnPBC2A112PXBhJuj1cGkVE3ANwbzat", - "stake": "3137487132332056735962851894070", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "dsrvlabs.poolv1.near", - "public_key": "ed25519:9SACdsDDgXA2WZLfJvpkKbu22Exxtc4CMbeHmVnN2P4a", - "stake": "3068789867106978388439487819348", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "lux.poolv1.near", - "public_key": "ed25519:HzTGTDfTz63QGvvUdMGozFeaENFGyYAoSrqYJb23qZFN", - "stake": "3028423991046584165619348124538", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "lunanova.poolv1.near", - "public_key": "ed25519:qkfP4NsSuHybdLhdvvYQ2Y9xWPsd249thEvrzbJBKNc", - "stake": "2870316617608351013129493882339", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "brea.poolv1.near", - "public_key": "ed25519:8dce49J5G28yMGRcSiDnYNFh7GBSma8TmYaw5mGTSH1Z", - "stake": "2761858870237463180720625792343", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "zkv_staketosupportprivacy.poolv1.near", - "public_key": "ed25519:2kAo86DW8mDaLDg37rFhQY8UYSZVq1CtegUHBEDvpSMA", - "stake": "2689727012142129963731924151456", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "baziliknear.poolv1.near", - "public_key": "ed25519:E4LAWdgLifBEoaWvhRNy5vpdAnUc3GsUHePeiAurZY5v", - "stake": "2688388636772692288448305121899", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "erm.poolv1.near", - "public_key": "ed25519:88nnN6LAuCbJaj9wucd1WUMfTtdv2s3njpvozHft8oQ5", - "stake": "2535798066743341414045251252289", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "fish.poolv1.near", - "public_key": "ed25519:27KegJd17HeXHk9h5MqkT35QAuvYvo5GFgPTpSVU4kPN", - "stake": "2359349916980152012597982756209", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "01node.poolv1.near", - "public_key": "ed25519:5xz7EbcnPqabwoFezdJBxieK8S7XLsdHHuLwM4vLLhFt", - "stake": "2330998910140068045131278690848", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "stardust.poolv1.near", - "public_key": "ed25519:6rxCJpTnrT6NFuGg6d5Dj3FEUz1ScNU9u35ywB3dYhrX", - "stake": "2179193523704935865995375845863", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "republic.poolv1.near", - "public_key": "ed25519:5sT6xtwxvLARW6y3KURYmyFd5SokJFhiK4jyqbamzzZ6", - "stake": "2124651577543740701890267481063", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "moonlet.poolv1.near", - "public_key": "ed25519:GkDwzPckMfhkdYgyFG69Uph8RJ12BcV9xNeZW2q93ZJD", - "stake": "2060503312099452529479997679460", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "allnodes.poolv1.near", - "public_key": "ed25519:AGEeyukQdMtg8EttsU39YLgryhao8yQeVwQTut5bbWdL", - "stake": "2041189719996971478342261526212", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "masternode24.poolv1.near", - "public_key": "ed25519:5ZyaXsGCya4Sch5bqUfohvo7iRFYB9ancRouggWRsiDU", - "stake": "2013012692631849510294424733258", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "legends.poolv1.near", - "public_key": "ed25519:DNK46DeHKeJPF9YetmNxZnqtpkeLjdUb9ezSRCue3TpB", - "stake": "1968963206127000985432877551650", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "fresh.poolv1.near", - "public_key": "ed25519:6YHLXhohY8kMnkp5Jw4HrJ52xtdyt1rcP6AaWkKzh3ED", - "stake": "1908553262368274972364412463603", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "nearkoreahub.poolv1.near", - "public_key": "ed25519:HUKmMJ59Hht8rcGG6uZ9M4qWsfbTCDtBgyV93YZnPXGE", - "stake": "1811363932350908894826349268172", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "inotel.poolv1.near", - "public_key": "ed25519:DmEDRntb9NwfbfdvDf6wzjsw1vxzQcJAAhFL2J75iLwr", - "stake": "1783140530783276198612825703651", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "appload.poolv1.near", - "public_key": "ed25519:6LbMVL6otkvZbpuC9sN3z7EXSMo3PT9noPeBdBZTFneM", - "stake": "1777016586059857984166086383996", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "qbit.poolv1.near", - "public_key": "ed25519:5DqZLnDu6PMEyhJzc5NhiMsoWeYMWG1bC4AULyafoXMv", - "stake": "1652745895856216988922137332983", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "jazza.poolv1.near", - "public_key": "ed25519:EW66Fkv7XcE9FiybuYtVURjHhYeEgwWWpzF685Vi7foY", - "stake": "1600810581770426565414413340826", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "avado.poolv1.near", - "public_key": "ed25519:FdLWsf42e3Sc7bdKMtxJMgWRP21ysZDSXFnS2vTwTaaA", - "stake": "1505671712920196582626546247266", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "satori.poolv1.near", - "public_key": "ed25519:9r8HYmw8mbys2Ng9BaKeQqZnaQTGCcBUbMatV5NeeWJj", - "stake": "1505563874806956005096650532342", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "ledgerbyfigment.poolv1.near", - "public_key": "ed25519:4JJTNeMaSb8W3NELh2rkkrDCqG1VpM3gdJ1hc9HFTBmN", - "stake": "1378902973337960064375143109943", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "atomic-nodes.poolv1.near", - "public_key": "ed25519:CpVAHE3JpfDoEPqjBDgYEjgG8JhM5BFKbjUD2N1EuvAL", - "stake": "1320330340013835475473012378960", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "pandateam.poolv1.near", - "public_key": "ed25519:Cu83NRziNLiT6HLu9kJ8svFoftZQ9wVmjScxjqCybppt", - "stake": "1319203644166316104758512034128", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "staking_sp2.poolv1.near", - "public_key": "ed25519:CS4uHAipvtxGz9irnoCX7SxT6d8zKpDj8Y3Fyf2zVgBp", - "stake": "1189875320275820429094732822094", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "nonli-near.poolv1.near", - "public_key": "ed25519:91jusDFxjY32h51tfq2HoKhoPbGs66s88t1v2oZPBSxC", - "stake": "1185432705606468385332754514200", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "bridgetower_v1.poolv1.near", - "public_key": "ed25519:AHgnnt8yhNBpoZChBiHXfjaH6X2zMZaDDXmmSWHvDcWL", - "stake": "1035663254387646835799962119440", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "stakely_io.poolv1.near", - "public_key": "ed25519:HWp9E3gP91s25ddMS9xUWuzbJUpVGiPoitu5bT6hqMHs", - "stake": "1021258364486646824071027357415", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "calimero.pool.near", - "public_key": "ed25519:7A9aFJtr9yWh5eyAUUUSdXMoxzi1qBjshiVCjsDWWa1J", - "stake": "1015874783766921089538649131256", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "staking_opp_disc.poolv1.near", - "public_key": "ed25519:8XbCfLQVSwtwaBajvByG87CxPPbaFdryz5qEkde1fSGv", - "stake": "945252783112950401552190350991", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "galactic.poolv1.near", - "public_key": "ed25519:GFK83N32DbERtFg8rkpfNBsKtkFpmNQzyKFM9kJvPCMG", - "stake": "831246120998540891354298874477", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "cryptogarik.poolv1.near", - "public_key": "ed25519:45zFAC8pLgwn1d5pSBpBHesWbzngfRgd92zaom7K8m8j", - "stake": "828004032171300648370990744344", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "optimusvalidatornetwork.poolv1.near", - "public_key": "ed25519:C3CJMKaWdEzkqyNCKwnKud6wDNnzs7Ura63k16zm4LUU", - "stake": "801755793868841694119971272782", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "pathrocknetwork.poolv1.near", - "public_key": "ed25519:2iJQLVXubWafG7K1NzGVvjP54UJCgVg3cuPMktw8r7uQ", - "stake": "798288406254751164539305822812", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "dexagon.poolv1.near", - "public_key": "ed25519:AQHwptR3Ho348BpFXJDjkxpWMW5ZwN7xWM3XWAWSEEgs", - "stake": "781119997524930787753273551265", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "staking-power.poolv1.near", - "public_key": "ed25519:42ikqyV1BYmSnhHJ9EsLLy9kgeAg1mC3qqU1AJGaTEaW", - "stake": "739158259862982574010823948092", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "infiniteloop.poolv1.near", - "public_key": "ed25519:9BUwtDegzwKcmJBjLgUDLHc3pePgPKcWJXYGcZb33Nyr", - "stake": "694945966749165983829361965202", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "prophet.poolv1.near", - "public_key": "ed25519:BV5b4DpgCUy1TEitE4TVPhpTY7uDNpHc8DBPyH6cYCBq", - "stake": "671635020628939237380029587432", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "bitcoinsuisse.poolv1.near", - "public_key": "ed25519:Cy2sboVqjDk6d3d2A2AJZBdFvokjk7sjZpYATLjcQSCj", - "stake": "664239734198440103401629427218", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "cryptoblossom.poolv1.near", - "public_key": "ed25519:5opTNJEkCBYuyMgAghY2Sxp4bBtXYQtbEvZ3Wc5Awohb", - "stake": "657665183791735436571718632241", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "kosmos_and_p2p.poolv1.near", - "public_key": "ed25519:41GWxdQHe4Y2fuisvz5k5G2NwDFEavRkisoZkB5tfJuC", - "stake": "636577548907797834502568994402", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "readylayerone_staking.poolv1.near", - "public_key": "ed25519:6AuBsxxSCYHkuJW9Rhf7HK2qYKErtThZUrN5HFDnQ9eg", - "stake": "627738918419591761430004629136", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "n0ok.poolv1.near", - "public_key": "ed25519:EC1p3w9hd4XkYoUiAKc8PSQGVFGiUXTDJvqkurRdAFz5", - "stake": "603091766828423031754951292758", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "dragonfly.poolv1.near", - "public_key": "ed25519:6Gj8MRp9KqfdiXa35LJcZnqeBNNEZoYk6ysvpzHaruvq", - "stake": "573145205007582852162929757548", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "pangdao.poolv1.near", - "public_key": "ed25519:C35kAQVW6MHoWtUZ599WHXamRXVZnrHMVD1q85FERiem", - "stake": "536104952358448307683904244716", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "nearua.poolv1.near", - "public_key": "ed25519:6YRLTm4coawMYrchYs1ex5BLY7xtnPrnvGWgk6NJAQvy", - "stake": "471397693642001593493614085881", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "galaxydigital.poolv1.near", - "public_key": "ed25519:8ZD8CcSzSfVsYo7XyABHJsYcrpBE3EL5MwukoEfrNYMR", - "stake": "448811822469059379056147844225", - "validator_stake_struct_version": "V1" - }, - { - "account_id": "grassets.poolv1.near", - "public_key": "ed25519:GS8uhr7mhsBWB5c1JgvsJzpwZDGrcnB9Xnw7YRyMSQP5", - "stake": "418986205174954907945983151920", - "validator_stake_struct_version": "V1" - } - ], - "prev_block_hash": "HrafGqcmmviAysiDHZypHiqj5W6Edr7QLUK2rkP6dCRA" -} \ No newline at end of file diff --git a/fixtures/e2e_bps.json b/fixtures/e2e_bps.json new file mode 100644 index 0000000..9b1db62 --- /dev/null +++ b/fixtures/e2e_bps.json @@ -0,0 +1,86 @@ +[ + { + "validator_stake_struct_version": "V1", + "account_id": "01node.pool.f863973.m0", + "public_key": "ed25519:3iNqnvBgxJPXCxu6hNdvJso1PEAc1miAD35KQMBCA3aL", + "stake": "11170441638409425668975791338168" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "aurora.pool.f863973.m0", + "public_key": "ed25519:9c7mczZpNzJz98V1sDeGybfD4gMybP4JKHotH8RrrHTm", + "stake": "17889966138083499342131296757169" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "bee1stake.pool.f863973.m0", + "public_key": "ed25519:B7Mwy3sCCJ6GZzEojsKFXMjLQfVXPDC4Q1LjuHoZcyM6", + "stake": "951628760573009933043158953323" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "bisontrails.pool.f863973.m0", + "public_key": "ed25519:8g4P5EXyp2b2pfVMHY1QLfkRcY59hjPfWrFCKUWX3RmR", + "stake": "784322861597508336390510885838" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "everstake.pool.f863973.m0", + "public_key": "ed25519:4LDN8tZUTRRc4siGmYCPA67tRyxStACDchdGDZYKdFsw", + "stake": "3424542870162917789465110810613" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "forked.pool.f863973.m0", + "public_key": "ed25519:5CTpVEzEdmn5wK4y5e7DsqtRvQs3bM1ypUNU2RGj3mtL", + "stake": "19553588599682112903267112637" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "kiln.pool.f863973.m0", + "public_key": "ed25519:Bq8fe1eUgDRexX2CYDMhMMQBiN13j8vTAVFyTNhEfh1W", + "stake": "7466078259126542726635504903558" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "lavenderfive.pool.f863973.m0", + "public_key": "ed25519:AzwAiLDqprZKpDjhsH7dfyvFdfSasmPTjuJUAHfX1Pg4", + "stake": "30215218325260022435961435186" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "ni.pool.f863973.m0", + "public_key": "ed25519:GfCfFkLk2twbAWdsS3tr7C2eaiHN3znSfbshS5e8NqBS", + "stake": "3102526369640411151678859285501" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "p2p-org.pool.f863973.m0", + "public_key": "ed25519:5qyxefArHQfABdNv9ELuEiWcEo7DTzABM9LrMAKTCY3Z", + "stake": "100198001398444504508422270154" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "pathrocknetwork.pool.f863973.m0", + "public_key": "ed25519:CGzLGZEMb84nRSRZ7Au1ETAoQyN7SQXQi55fYafXq736", + "stake": "1716080041801977779897178399888" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "stakely_v2.pool.f863973.m0", + "public_key": "ed25519:7BanKZKGvFjK5Yy83gfJ71vPhqRwsDDyVHrV2FMJCUWr", + "stake": "5536803168134829098864689871766" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "stakesstone.pool.f863973.m0", + "public_key": "ed25519:3aAdsKUuzZbjW9hHnmLWFRKwXjmcxsnLNLfNL4gP1wJ8", + "stake": "1884761660283483727605426573806" + }, + { + "validator_stake_struct_version": "V1", + "account_id": "wolfedge-capital-testnet.pool.f863973.m0", + "public_key": "ed25519:CQEMcPQz6sqhAgoBm9ka9UeVcXj5NpNpRtDYYGkPggvg", + "stake": "4110455987307868059339044490" + } +] \ No newline at end of file diff --git a/fixtures/e2e_header.json b/fixtures/e2e_header.json new file mode 100644 index 0000000..7613b96 --- /dev/null +++ b/fixtures/e2e_header.json @@ -0,0 +1,15 @@ +{ + "prev_block_hash": "5dbt6rh82Xx6nNG1PuKoQj96g4jnWw6cyb8HNWPPkVJE", + "inner_rest_hash": "DZT9p28adyuiTSbUV5bsuPRxX9K7R1bag1AeUEMhm4bh", + "inner_lite": { + "height": 154654776, + "epoch_id": "FsJbcG3yvQQC81FVLgAsaHZrMBFbrPM22kgqfGcCdrFb", + "next_epoch_id": "Fjn8T3phCCSCXSdjtQ4DqHGV86yeS2MQ92qcufCEpwbf", + "prev_state_root": "F2NNVhJJJdC7oWMbjpaJL3HVNK9RxcCWuTXjrM32ShuP", + "outcome_root": "7SYchEDbwawjP2MVfZ2GinP8bBQU1hKFRz34b2ZzG3A8", + "timestamp": 1705334624027402581, + "timestamp_nanosec": "1705334624027402581", + "next_bp_hash": "AcNatyPz9nmg2e5dMKQAbNLjFfkLgBN7AbR31vcpVJ7z", + "block_merkle_root": "3huzCnEQhgDDMWyVNR9kNbQFJ7qJGy1J4MBrCJAWndW9" + } +} \ No newline at end of file diff --git a/fixtures/ids.json b/fixtures/ids.json new file mode 100644 index 0000000..48d2a33 --- /dev/null +++ b/fixtures/ids.json @@ -0,0 +1 @@ +[{"type":"receipt","receipt_id":"Bcj5ipQD9e4dw2rZYEKq9UEcXWRaaCJswziFT6EDMSdq","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"AUE2x5y4s8sZDRfaTMznW2Kx9uTgicQG9fzebvBgqq9","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"3UzHjFP8hVR2P6JJHwWchhcXPUV3vuPCDhtdWK7JmTy9","receiver_id":"zavodil.testnet"},{"type":"receipt","receipt_id":"hQ4NQefXahZR8LcsTKWQPKi81zCFKfCJsyMewoxmg9F","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"9cVuYLKYF26QevZ315RLb9ArU3gbcgPc4LDRJfZQyZHo","receiver_id":"priceoracle.testnet"},{"type":"receipt","receipt_id":"4JkyYYCCFjbMpbLmRWYHEEXkpKeV6AzVfhJck7rGKudn","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"9Zp41hsK5NEfkjiv3PhtqpgbRiHqsvpFcwe6CHrQ2kh2","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"3z2zqitrXNYQs19z5tK5a4bZSxdx7baqzGFUyGAkW9Mz","sender_id":"zavodil.testnet"},{"type":"transaction","transaction_hash":"6qTggNtcCeks9pscLxmFHSzDe6bnfy4sX8WBQj6MYU3X","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"3gSQ6tZE7M5tkRSoNbMERTRR45QErXiAGEYjodzWcGTL","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"8N91Gtum3vSHSe66f1atCPAztTi2y3zXUNFZYf7qXoE8","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"9ZuwWLYnYUGvTeMMBU5KubP4xMGbfMJ8gt3r1AeRHus2","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"CjaBC9EJE2eYg1vAy6sjJWpzgAroMv7tbFkhyz5Nhk3h","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"yZmQCtrnz7CauPqAjYVFNLokzgWm8QrdP7mNm6Y1nBU","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"26YmnfTUCCL77VxjARA8jnCzupTAQnD7JQLvGDhEA4h8","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"BgPrJhYfC6gNh4pYMQ3BnPWPMgBDphLH3H8RNnW27tAc","receiver_id":"asset-manager.orderly.testnet"},{"type":"transaction","transaction_hash":"3V1qYGZe9NBc4EQjg5RzM5CrDiRgxqbQsYaRvMTyU4UR","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"4VvKfzUzQVA6zNSSG1CZRbiTe4QRz5rwAzcZadKi1EST","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"FTLQF8KxwThbfriNk8jNHJsmNk9mteXwQ71Q6hc7JLbg","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"4VqSnHtFPGsgRJ7f4iz75bibCfbEiqYjnyEdentUyvbr","sender_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"57hyHzGLxcYGgDyqeGPTVN6J8Gms4CVsjqFsySA1B9qc","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"AR78eh3QNfyyyy4UV2a9bax9zkudrP9zphCa9nDyeBcv","receiver_id":"ykaju2a8jcfg.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"3sPxpYGTXYfNT6FvsrwUi9M8MMcuoahpAs3powS29XJH","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"7twejH9ZMD4t4zdLtJqANKhG37bckia8RLX5494Fw1SM","receiver_id":"relay.aurora"},{"type":"receipt","receipt_id":"DgRM8CNGkMokkhqcYFLUL39AcQ89a3AsNQrs4DynVohm","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"CQno9p4ea2A8TyYddGRJTr7Xh9ZSq6uP123QqR2r9nM1","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"AAoyzc41aoKjua4k9fJLEA5nGXFa9LMWWHtGKanJzscj","receiver_id":"aurora"},{"type":"transaction","transaction_hash":"FcQx6PWhDpHLyQJWd4HhfZ2xrkUcBfa3h57zsEtxwV4g","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"DsjV3URFPGbVcFbWrpR9zT5BrrhzAZFG4n2qh8zSe7jX","sender_id":"relay.aurora"},{"type":"receipt","receipt_id":"E3uAZcoK3z2Vwmngg7epGy6LyHMvC5fJQDHjwwjgb5E5","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"B4LoLw8na3PEtzo1ngh7iXcpWUR4Kv2SbwERrtRxCHip","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"7Pk6Lov1rqkYeAJgnT82EySuokoVPyN8w4aMEQdPVudr","receiver_id":"oracle-2.testnet"},{"type":"receipt","receipt_id":"3xxbDeKJQS6EmbtTELWuUJ3Zou4LTF27LzZbcLXCEHbU","receiver_id":"priceoracle.testnet"},{"type":"transaction","transaction_hash":"9AvZKNAmK94x8hqwcshNDmmRu3dMUQv7eNZXR2WuE6nt","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"FsdqZDxLcaSWoopSCAXPpNUkA4nr1kUkuzxBukkNqTv2","sender_id":"oracle-2.testnet"},{"type":"receipt","receipt_id":"dBsQDEoSDijFTtZPdYHEkGUB5sWZg1XAvbRhxa8Jmpi","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"E4kHaTr5DroFkKXJUrzfXKtPRjyR68YAqGyb3dSnKGuD","receiver_id":"lwjdvlvzfo79.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"5FJCmPzb9Kfxesf1kbNnoJ3ZxbPQ4yj4EZhbsKjcCoqr","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"CokutTqGaabTnrKSi13bAUzeECdwByMRnj99BwRG7fRu","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"BvnUudsAkCaKvVvJ74prZFXds8PdpE925p8xZmRjYJ2C","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"GikmFvGMVn2UeJEcnDjN3BMEL5YmgCUypQDMBXLvW5g9","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"5ypE9P9j9ASjmunm6kSLrTtuJ5HByR6Hf3cCKrqffRS4","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"68yQ89pQowx5DKFgNpgL4zcwrKgEaN96xGXmZZ8jBMzL","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"EfAZduDmKxNoMSYDqHEpD2nuBXJhyaCyeWtDhRnri9d1","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"8mUxUveBaHz7fi3ZS9kN1Ss6fkeBqvuR1pSeYWdunMXS","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"AYUaHUAxBUYKt1ThDttNatx7XV5FKH9bFMWmmrhWWU7y","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"BxkNFzGUUBafcn8PY9X4vgDT9KgZNhUkbU7dsCXd7hNz","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"5gg7aEBjbuKKvYogcbLRjB69AXfDXkGeSsd3P1qMhB77","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"2awfPH5inWJgnDKToFrbm516MofkvJG5A1NR8b3ky65p","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"8WC45pj89X8RXaSXV13yKh3gmpVMaChBDskxYBisFg8g","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"EQqdHTCe4ZYc6NKGeCbE89SV9Ft86wWpVyXVjACM38UP","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"GCaGAJ9yBJtg3RJxafAwT8M7jQgUcWcADg1ujHEii194","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"4jEzH53nTjHjWDu8BiJaFQZPBP3T57XM5q971vQjB8kN","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"DcvY1wVUk5YsTL1s6G4K74gEACyrpeXAW8XUC11yib35","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"3Z6Ki6NtKAPqYjGbkUTnNQ4fc7bPPDVFvcvfoM5CsvnC","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"EMpoVsh6yt2xYghBDVC8HscXzUeWHJrZEwW1Kk6MXydq","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"E47awk7rt6vrFewuYdDM2N6qN6TbFKKm3jZbQUHb53fb","receiver_id":"73uvy8y6kxr8.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"HwhMdANKVFq6dPLuADeS5KZ67Rde2gUutZ8S2gXuL72Y","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"5eX8FWckCEiaRL19BbFHM1N9TbzdFZZWj1mN7dXr6ogv","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"C7NiDYZbbuQLGDnvB62tadnb8kWguYVVEWqaB1QStjba","receiver_id":"oracle-2.testnet"},{"type":"receipt","receipt_id":"Cgm82SB7JNWPTDh5dbyzFLvE7kvp3A87Aqz5RqeXT71g","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"86bhXNvcUjTz1dLVdNLWBxo1A6AUBso5wSHuordGHCxR","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"6WRoqR8Zq87YSEop8xsBG7QyRxGJ4dH3w95v1NcQvyDm","receiver_id":"priceoracle.testnet"},{"type":"transaction","transaction_hash":"D2jCP5FAYbuAjyMWV1Fv3HqgDMKCdeAQMC98aWZN8TGr","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"FfDx9vhagyqLCxRBoxa6ZXqVgczhHaPuRpBY61ktpM19","sender_id":"oracle-2.testnet"},{"type":"receipt","receipt_id":"DheV2jZJEuq9RSAopQuDXgFsfwB5BsKE3yV18jCfVjbM","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"53vz1by3LYYKzDZcJskcUm7Smv297wWFKPSvwD7pLJPd","receiver_id":"dtazz1s6wte2.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"Hcy5vxQWYvGdrmevVaz6248Tg1k3QZtHQu1hUUsvoxkD","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"7MbcKn6ajP7EC34tEFj575rZBwDLPmJqQ5eDySkPeKAx","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"DYuZi3qLKAEGWFKBMCp2xA5HyH8oS6EWuzzeQuxQEXda","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"AZ18KJ6W3nJ1JScJVdAxm8j4cqHnc4XTGFpSCitQadTf","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"AsZ8b8QYtK5Fs8XUDEmEx1A2at9bWr8r1aS8VnLcEtd3","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"CAvm9Arji4Kpdvcp9xk9qc9p83i2P2CfRMm9jyo2DFfi","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"7jrdAT6NRQjDnpDu8QmUAbZ6oyLjEgMwzPLZsXpRPQVC","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"DR4FE9zXS1cQaAGU7f7y78p9yn4akVQHFEskSH2PD3Vh","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"HcsL2SBdF8LtjJsFos6NkqpueMn1s1toYD77SdB5szy4","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"9LXG1JNhvuPfdo9fGZvBacxXe9NAASSPZmsW4mpCn1f4","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"C9TSpXgbu7YRJ5Jm1dMuj8KfMLH7eJHxk2jENteGJzCP","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"9RBAJxHTEeE5v9QQAeZANNq9ydTTc87jvuGyrtCdo63P","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"AkmPwHhqviQSNv3Ee1TGFg4EuHK62fPMyTrykJXfJGom","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"GMDVAQhmhe9TEhpsY74FgJeL5QU1aMwqQz54BsSQ885T","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"FnLggXc5oiEjiEgeQYQV6BQsYKnPtramMMMiU2ZedANe","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"8gpNzBHQBH9ZWrw7cA8BAqw5ZRyNWbg1pDPoK8U6JTud","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"GGRLsLh79FFtCDfDMSwt15k2DTiho39WXRPqMd4SANRK","receiver_id":"zavodil.testnet"},{"type":"transaction","transaction_hash":"6eqiiQjc2N5HGMbQMzwuBtniQFtpWhetc1aq3yEuWJsA","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"F6R3jvNT91MnjQwYEJ53kzak2EN49UPd1EHBWB9vi9Vo","receiver_id":"12fbh1glcgat.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8s2tqX1x8TJqS7enoMU1gsxp4hPExUkc8zg7nND4Pfj1","receiver_id":"priceoracle.testnet"},{"type":"transaction","transaction_hash":"9qjjnRnuiJhgFAZonH9zfVcw7P437DdMMsa3aXQxqkRA","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"DF7N8Add65ksvhLofgN9W898jK7DWxhZhe6F51HLohBg","sender_id":"zavodil.testnet"},{"type":"receipt","receipt_id":"nYio38Xrm5wY8WmJSdQ9tEo9Re7wSF2A8mT8rRSxFa6","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"BYBGZKDmuUwaFs5c26i4UXM3Kv2KYZFQkb92J3YHrCoV","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"4H2tHD5PQ4NxFiJRZq7jos5Df4jQgM5ig2jaX1NQMTrY","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"FB4bRfgozXaHu44zTCgq12FUoZbJt1Vv96KQGbzjTJJz","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"CvozzbMChCeAKg6jm7UgJuqrA8KkpWPsL5mcnbLcbiqk","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"GoRr9hrxMarjxNAcwwREeRbSBT1RYstPeNQaVajJurff","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"27dU68Bf5EVKv931qQGzpAEuKFrXYcrdKg11jdwRin6S","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"4sZCtWBxQUFXR1YtYhFn7Fn786fNtGMhqfbPw2wEr5Wg","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"uUomhhuxwhUkrj6dCddfHdbbY1paygejSAeJyuwkBZH","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"GHe3crwmPJZ4fU9yQieVKsS5BYLbrAMbxgPbvpaTmqFt","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"97x4tdZRgSWHsDFAfZbNFyHzAWRBoNmaBum4Uw92m1bL","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"5dYTWJ4sUsQXgNYbZLYnFJYEBGnxFxfrcNzhZcouWT5j","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"GccuQBBSBtknXJyWwXuNdgiGi4QGvYeyKhPvcuwR2Xii","receiver_id":"68frdria49vm.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"GjDGzTvKHX3syTJXNwV53Vx7FYnUkPojrfcaN9Q6DpYx","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"AU5NoxAG5a8GKxWSNncH915uDaCUSQnVRNrZnQ6vwia3","receiver_id":"s-lam1.testnet"},{"type":"receipt","receipt_id":"3cWJrJmaewhX93UnduHRU2M8sW8F8qwEoD1xJsBTaJSs","receiver_id":"price-oracle-v1.nearlend-official.testnet"},{"type":"transaction","transaction_hash":"8N8K3idQm4yFT6jn9wwTh7jTj9XiG564T6T67yqyVWqe","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"9sc3pjhPHAsGJnH9ui68kht4bhNCzBPgYatpR79Cspm5","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"9FCCaaeYwSHgaYfGquGAWheCHpKwNPfWHnWBi78vFR5F","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"D7mcCM26QXUxvMbPTfmw1jeZRYTLQdBTZDpDXqdYQMEW","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"AdyN4mXDa5UoLCf9XQTQ7HvQbQ2g24VcATDVGWhy46zq","sender_id":"s-lam1.testnet"},{"type":"receipt","receipt_id":"HezCULqMkxpwQkbxSCtuhHac9deHyLPZ6L9D8QMEEFHq","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"DCvFdk3n5cWvD8NVQ7hgBVVrYcKB29A6RewxXPLMwKP","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8ztnGoe1e2mVN6giAzhopE27CUBbJKHzictagWFv6eUf","receiver_id":"relay.aurora"},{"type":"receipt","receipt_id":"4KHMyieDVBVgw7H4jB7GFsgc5WVkkkkcuWjHUWhoxQ9m","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8MVX9Yjj3uzUZXYvL2VCfyrGASbij6ghR2zQMpDtf1s7","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"AAVFCoFRqVdjurTEGMZL4jSp2oZtFqtTcAGb31KNxtyk","receiver_id":"testnet"},{"type":"receipt","receipt_id":"Eo5fKR6YaSBzKW9vJUtVADEmoiAqqCSVutVYpvNm27Ry","receiver_id":"testnet"},{"type":"receipt","receipt_id":"9Dv2dZx3Fe6RffSRN8eTML6Ad4NwwWMbMVDbUMrXoF5W","receiver_id":"aurora"},{"type":"transaction","transaction_hash":"HM18RA6nrZYjdXz8q4HbWaqxteae64K5WoXv1rnfe2Uf","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"CQNbeL8ggXuZhKHEDzsi3rNi26Tza8eHFXCY3M46U1JW","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"8TGttUnnyfpVvxjjqXjy8vkKwb8uNwBkwgpnXizVaco3","receiver_id":"dev-1705307954732-23212261612584"},{"type":"receipt","receipt_id":"F69bauLbRkLHU5z8Rpwtj5oRyqiFr4XLhKKt5JMaB3b8","receiver_id":"dev-1705307954716-26005621820061"},{"type":"transaction","transaction_hash":"CqVVswF3dEMQ8uJciL2RC19txKwsKm1CiJU1YDNxnJEV","sender_id":"relay.aurora"},{"type":"transaction","transaction_hash":"Bkc69B8zVNfwoukDZptpcG76rhgE1ekvp21roCLa3k4b","sender_id":"testnet"},{"type":"transaction","transaction_hash":"4LW882GsjTojrXSqLEcLYRD4Dfns2bbTaizpfEWDXeAR","sender_id":"testnet"},{"type":"receipt","receipt_id":"8c6ePJ4xvUKB24z9146bjRXdCfX2Rqx7zxYPVG127M4K","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"3AqgqHdwYWWwFC3qWU443bDNS3vxRSTdj6dMUpzxvKoi","receiver_id":"vvtjqhhfnrl2.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"4zzAH9GA3LfzcKuH5eRzM7ywF8PLADuCsFNb6fva6f42","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"HdxzgzSZJjcBxYpWNMK6UpdEpoTKzpr4SrEvWVtdF97s","receiver_id":"testnet"},{"type":"receipt","receipt_id":"J4wZi1ydzgjhuJgwL6UYTN5TkHYha9S8zRoGvoCNft6w","receiver_id":"testnet"},{"type":"receipt","receipt_id":"ECiFmZbnGkp58AknPRNJdZM7VjQ6NxRRsFsJ2Q1pJDzy","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"7RuTSrDAZhAkXLqxYKoPqZv9mHKvWJdT4BxAtq6SKVEq","receiver_id":"dev-1705307951157-46295630099921"},{"type":"receipt","receipt_id":"84Tscq1mQuNq6rtp1YVcBGwZcv7nnmFY58ekQ5ZpN2xj","receiver_id":"dev-1705307951144-39784510361521"},{"type":"receipt","receipt_id":"699GLHexZMhH7HKdkNBQMktTMDr3AvdHpb5Pdu8CeLkC","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"acAXEvqvNxYbJXDa34ApA8XHdXFtdZLUmDWz7s6cvM9","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"7z5Zc7jojgmPz8HkF1KkNDSAy2FTMtXbhwTwGhfxjBw4","sender_id":"testnet"},{"type":"transaction","transaction_hash":"64ViGfWopTMWyTgdDqvZU5wigx6m4ysfQFAeH8bKP8JX","sender_id":"testnet"},{"type":"transaction","transaction_hash":"HDXxhUfEnooUb3B4Earft18ibBvWdTs3Bk9SDKv6Nd9W","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"G9i4dZgzDZzgBrgBEtooLm9cVVBJGfaqBtjFm4cdnVPa","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"AjhoYqQrYhq6mAz1LP47YLxfssDCK9V1jZ3gKDMMAM9B","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"GVHMrJZY6VGaKhY5Ay2uihGHK5wtjB4qBBdrRsXLaFLr","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"4rGJ7mSkt8V4tgYHjoNLc3s4BxaqkQTszxrftDtJLFAQ","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"2iTTQdUQCwGDCVVYWKdCxrznMgP2tHnpjsnq27SVxJte","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"A4nZmcuzmchT1QDiWs8yeBZ134bovwBWibuFScFork7f","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"D9aMyFpgBQk1CpPTrhEqgdKEAcPF3NexeWBXmf8d4B2c","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"Gfgs99YvvGae9q6z5WDMpdhVkAHmwFjZ7yk8p7Jsbit","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"GSiDVPdWYQFJ8WrJrXbQa7az7qAFzfR4WYK2snNDxWJv","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"qnLPZdSybWhkUQEwG8vHGtFMcHuKtUoWX2oHYnxVfCC","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"Gqn6vq2QNL8NbhgW9sDKgbCij2TwUTtuGDWr9gybfsbk","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"4X8euaFjsFZP98A1bCfkgDMFashgtSxHns4mU1ReZWPY","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"AcAenoXYdKTu3AvLGScBnXsPG4vedWs1hcysRnksB1RB","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"E4sgW7Ucyjp9YHFiJZTdoGtUAvdGAFYSNKCht1BJijN9","receiver_id":"y1rifte3q9bd.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"BZekNMxiCSkanDBWc1ayTE67uFra3gsXvvA8ZNeyaNS8","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"68QsmAVyaVft3WWJ8FhitTuVGosnQL5MJMNZD4SNpN4f","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"8grJwgNZjCX2358axxFnCMr8T9mvK9choDYtcG5juBWc","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"BX4d2vHY1EYVAAkBQhHsJZQbumaaDHjBTejGNiYwMaZV","receiver_id":"testnet"},{"type":"receipt","receipt_id":"2Fzou4H3regnvi3BmwhxzuebvqGscqrJXNouqrLLiNYJ","receiver_id":"testnet"},{"type":"receipt","receipt_id":"3anHYE6zuA7J9Tid2U3WosdSUaZkDMNUozg5qvh1oMNr","receiver_id":"dev-1705307935659-11845443462054"},{"type":"receipt","receipt_id":"C5bdGmjQY7GqmwwJf9yUZMZ6CkSDFmYHSNEGQCGskByc","receiver_id":"dev-1705307935640-33745202086023"},{"type":"receipt","receipt_id":"BvkNQa76y6nCDvn8Yw6KRHuvF3yvHd7a1Ce1qacVa2DB","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"HNU4FP3FUbor7AAsnUSYmmM9teL5km3hQNSJEeLdHguN","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"Cqn2FgbLvt3dApw2DdY8NBHLmhdk5ALBrYCNWRLnNsA4","sender_id":"testnet"},{"type":"transaction","transaction_hash":"ETG5NiqhbrqbhUVRbKMyEXcLX3Bus6ZhoR6rGraUVuVx","sender_id":"testnet"},{"type":"transaction","transaction_hash":"6XvR3i2zvweL91DPj22DB6ocqw3VCewcaTJ8dDCvu7xQ","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"4KqpmX1QL1dTCZFmYx7nKeEVZEXysjG8jdGrnoCZ1u2h","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"CGJ8FKxudQhrskhj8tBAgyYEhyz7kH3VowRVycfYnEBb","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"9tSG4wHi3pMrJz8wcj2ugaFNfgjokCkNh313kj2mAZsh","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"2EmQBak3VUFpU8LkSvB2qodqY6u8xehoeN19TekNRjh9","receiver_id":"c1c4pchrv82x.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"Fkp93fAsqEabGsXrP2spXwjeTjZ1NRoarugAgmdke2ex","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"UgpM3HsF8R5x24qoYYkqo2tY9Ha5VGDovbXCa7Qo1DF","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"EsXjsen7ofj7cYDu6wcR7kdFUFK1yVWwKU8JGzPGbUcW","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"2PefNKhfkQfkY8UuHtXDDq2zgM6pyBt9or9ToTtCWs7K","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"E9NijeLA4QshKLWJzVDy9La8LPAbiYyYA9R4qxnC1FnK","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"EKm17Ay3rcXAnJiK18fQhRCKG2rE8e6nn4bQvpRGYxWV","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"BVmRaPbPeE15LjacNnu7cA4Ga3mBQnA5VoGAeyHMuAia","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"CXoi3YEf8NZDnUBufEXY3wGWwHb8ZnG6XZ63gvhnXCbb","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"GhQRQfBsyJceeiU5Jtd1HP2YGkNMohbsARRo8t9vCc8n","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"EeyfPx8Kp6XqFYj6F78Jet19RjAJwW1XQi8zQ79Akq9a","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"ANTjxVGXXdERtH52Q6CUV6KUfkSqP1gpQQsubMk48w7e","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"4JFfdWzCWz1vu28TxUeGQdTUoQmDMtvYpYRVpNH2AVXn","sender_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"9Ufq1ofQkCoGMwutrxm4iLMS4pKR6GTzp3YQzFhRvb3L","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"DoojfJrNoovzoJSnLP1jHwFgZT41DKA4ruBx9jobHhpK","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"BAqhtD62ezehhGUMXZhhUWLeAC3efZMEToPZephtwD4i","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"rMCNpYUtzjnfcnkwtUF3VERMezq8yVpsVgse6DyAnGF","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"4Bxxfd9nDMBJhJWTP1Rem6K8zZoe7PU8DZmiHrkQYicj","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"6HwrBUmZyCmzP3EQNKsf3Kt6PMJW4RMYT79smyyjCnTo","receiver_id":"cjf9jw75emqs.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"7BRVmMb2gJTwex8eY18Xp9N1xUz876b1BtcffjFRj4PF","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"Bcj4bZdat8Crs3wPcL5vcyTQJgsQf4mjCM1BgkpQ8FcJ","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"Cxp89bX52LDTWganpMUv8Qqw36jmnp4UgpmvyW1qNQf7","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"BNntaXTfaN7GF134qEQARdNpeVSFmX6FxNNeijq3JHZy","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"GaSy31UJvqWC8mMmjEeF3qfzm6DqMLtL1oT9CRVCvuUW","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"66R4sNtB27tbGk5VUxzeuczVVBNXkD4gZANZdE28SVbr","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"4XJQg9N2PKDCxYJ5hftSNwGkBdGf8TZAP4i5PGV7to4V","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"7ALubTZubmVpYHPMqjqr39isPBcMB2rVgzJ9bTunANU7","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"BEm6cv8nhb5duZjfYj4avo9r5kFTEQg6qVQ5wwcv6Q9G","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"3moyEexyEdLjpshaMRxzTVASS6WWnifunT9m3oaBPdME","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"3P9sYM7vQMVuv4arcqE1nj3Gf5iRpdXoV22geJNK5by8","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"DHFa1o8Zo6V2TZ9BQzYxBB6Wuuj5NWmrVYdcvbCsw7RZ","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"AAMLmTEDmxu2J39982G3eeyBhcSCFxXqA6HwVLZ4Pzjm","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"GiYZ5AbHkgKnq9k88HqrB7Unp9BMcukUVraG7UqJU8KY","receiver_id":"pgqqae3lbkkm.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8wR6f4uGWHTdHTfTbt4w38Emeo7hB6CQ1e9J4mLEggiH","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"ZDTRHH5q5GipARy6ab5gXmiJ2hnjwmmdfM3ryDQV6pz","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"3YGSU9Ke48Hv9r2946RjUg17qPMq9yw3JU6aVfD6PyWW","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"HLDEMJsKFwJT4D1sami9LHKpT1kiz6Lts8wQjWHgxKd1","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"81Paj9Lh6ZLbbrRWFwj6YtUoEoqRUnySrP7RXErtYUmz","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"E4hj5EpuuBuRoMLJVBjyyNrUfw9x6gJ3Hq1NmxfRL8uu","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"3eoN7KGVf1p3rZe4Y6gx3RfSQYK2DbTFx7gGLvWauKRB","receiver_id":"137cf7bd5cc55e0bd42456532b513a7fcc9047093df608fcc5f84ffe585b6066"},{"type":"receipt","receipt_id":"Y3kGVBqybHnQYEP3FWyHZHHhHvwRNWozKgetgzyTskV","receiver_id":"testnet"},{"type":"receipt","receipt_id":"KJGhxbTxkxzRHquAM7Tg2BeKtkacWHgVGRAygaVurNB","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"Cg1WuH5NWNPY225WdTvNztWFedcVgbSSbq8wr4AkELsZ","receiver_id":"bulls_acct.testnet"},{"type":"receipt","receipt_id":"4raiaa9bfejJPKxhPm2wgJ6iXyKV76KSBGerrEHoS3kX","receiver_id":"testnet"},{"type":"receipt","receipt_id":"rxtVaiHjtKpK57hFtu4rhaoPPy1aCaTzsGkjK8wyWSp","receiver_id":"dev-1705307926477-27596965257070"},{"type":"receipt","receipt_id":"9zuMFMFNLCVsMSqb6wpv3s39URXioqfcUqRrBBt8aTj8","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"AJXvDMKP2nLLuCWbYbT8oynZbkn3qzQ6VwpzLQSARFT4","receiver_id":"relay.aurora"},{"type":"receipt","receipt_id":"Ar5nyeWUw8LrAAzQYz8FytVux6R1wihaD7pVZKwKPhTj","receiver_id":"dev-1705307926431-91453828422938"},{"type":"receipt","receipt_id":"Feq2jEYjY3VpNukMsSa7QmPYNamPBXkjLy8zkmzQ16y6","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"37cV9JUmdi11czrUe66xz3gPJCitqMvyECRZeW9iJzyG","sender_id":"137cf7bd5cc55e0bd42456532b513a7fcc9047093df608fcc5f84ffe585b6066"},{"type":"transaction","transaction_hash":"EKXDX4RJzcnz5HuW1CErcqGcK114YsKFNotU6boXRuDZ","sender_id":"testnet"},{"type":"transaction","transaction_hash":"4wMCZ8bdfexTpKDQBshQmukEnpcjYJa76PVtwZgGJ4dV","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"AV36SJ2hUUi5BAD3RbgvaTERFwEbF5hvaRFibhWtVh3x","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8Tx9DeDk7TK4XquQTsS5FdsHpW7eENYBQVNqf1UoxduP","receiver_id":"aurora"},{"type":"transaction","transaction_hash":"ETZp8SjKfSrUujvAMs4pdtgC5xScZopepkWpB3Uk4qV","sender_id":"testnet"},{"type":"transaction","transaction_hash":"EvPZftJRJ4iMAAfsRQ4J1jFHSNQnGbwsSGE7qjSrgx1n","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"8z2uWsLxQTZBmGWbGNZ58CNqHGPiqkTiPR19raz4YbsY","sender_id":"relay.aurora"},{"type":"receipt","receipt_id":"GASozGFtYVJXniCe5RYm6yTyMCFfDv9A6cieoich96dJ","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"9ewramutTHiEZWooFv12JkpWritgVHo6uDFpzEtBCZd1","receiver_id":"9l94qo4u79w0.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"9cafH6D9aDp8ucujqAxUB9mWByL3368sVdH98AWmYwU3","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"DxWjTkvaxms5Zr6GCHPw4BxfQAoUs8JqRWK7bDKLTH8i","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"EDSTB6DfGgJ5DqQUbqkD6gqkrJ9SFB4Tyd4ECzyJSegX","receiver_id":"testnet"},{"type":"receipt","receipt_id":"EJfVvpwMsHz1NHGbkS6LGqVXN2qneGYsbkYjKajRoGo1","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"C7h71p7NVSHpcsQAYiV7WB63yj9SMMdc3jqMoHF2A3iz","receiver_id":"testnet"},{"type":"receipt","receipt_id":"51d6aKfsbSgM22CgyqERJctboPpp2NaByfqtFnZQMa78","receiver_id":"dev-1705307919672-34015732945741"},{"type":"receipt","receipt_id":"Hdc4eCrm6AmD2ywGiJafvWWM61KDjSRr3dnQELv1RdWp","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"9QR9rrioFSeEVkxQvj7RpbTcwdpU6NjVchStn7QLz5R4","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"QyjCHQrBN143vftm2MEKVQJqqvXUeFjzo2HP71J5xV6","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"H98tSMrFViq5ZtBLdgJiyRhGB3PitwMu4vnetSznXv2Y","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"6zDqK9xdiceuNN2kgejgBVXFGTNqWyuJrNVbZQMvhDkc","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"85HrksDfB4Pt6CJaHQkJdVn2nqQcEdZyYcRrEk7CqMpz","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"AoRcE1QxgFYQcu3nS8mkFmDmLUZd6Nfxhcdcuq3krjH1","receiver_id":"dev-1705307919784-37188855122138"},{"type":"receipt","receipt_id":"9ZLkBrAf4HjncCUw6ZykUshmArYfKneXthdzUQfREVri","receiver_id":"oracle-2.testnet"},{"type":"transaction","transaction_hash":"HDGqo5cUMMweBQcn31cHtTVm1BaQr6nnL93fv2nwjx9K","sender_id":"testnet"},{"type":"receipt","receipt_id":"9S2UPDykbH4qZJ96bKJhiATVVKc9Ta1rkPdnC8MJe5ut","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"ErKaA4gCMu6pDos3svw2RBzPectbanV7un4rtWHcwWv6","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"BUGPwqY17BYfzU8BjX3EtDkMGwkbkm5ay9KpNb5zgZrG","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"6Kg7TUugwUWBVHgkS3z1LKjgoKeKYz9b5gpExRijer1Z","receiver_id":"priceoracle.testnet"},{"type":"transaction","transaction_hash":"3eVHwtVhUnJEYAQHrVgAeVEDWenXFze6N1y6PJtBJ6AH","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"CdSLnmYeppgPz7WwcjkhKFo4b6bgiMWwFE8tC5yvZG5P","sender_id":"testnet"},{"type":"transaction","transaction_hash":"5D3jekGJpArngn4w2mNbHESLCvGZYwYGJkLZcAsxKXTe","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"FgMHm6aV99iJ9PsMzwUMn1nVPti4Emr25Uburc35SPof","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"5r7r8kgHrMXXCDkXFkvKdViaZoes39UeZo79zvVqJPKT","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"4fsVpL3nksKRYaW7MGisU1MxEXABiAjWKsbLENaeG4Zn","sender_id":"oracle-2.testnet"},{"type":"receipt","receipt_id":"4VkBk5bkzDfyzkue4hgUZ7QY2rTLaSK93CkKB52VByr3","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"G6wm8f6fKGxnvh62g4o61zLCvmqEYVRfPQJwxqQdDKH2","receiver_id":"ramptest.testnet"},{"type":"receipt","receipt_id":"4T936LUHhkJWUPNAQmiBRaLcfWmwCkjVnbiNdDacTNty","receiver_id":"kll8a7p5mh4d.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8fzjF1nwehiYVjJHAqZgPC1LQeijHJRpexdAzQgdLPcy","receiver_id":"0e88a35855325f20d9cbd614755797220af4afba15c037c8d6a290a89cdc8b8f"},{"type":"receipt","receipt_id":"55MWqWf3y6ZJRCE2TwGntXDuy8mvDEY3n1SJvj447212","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"2iz4fapepNdGMSTZADDpA3DK2ashTtUiZpzHmea8pAQP","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"4jpCpTTV7y4VvpwHoWvjWLeu1zUvmA1orNL2ZPwDcmwd","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"FG1TzuSaTNoZEW796SputEymKWKYbDYvgLGsn3fVeH8j","sender_id":"ramptest.testnet"},{"type":"transaction","transaction_hash":"ErDTkCmrtK6ext4WHSw3FgLgeqFFRNZ4ZWJTURMTrL4P","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"4RTejskoh7Wb2KdNH6UkE492wM79AtqDFmy44YVyTGNh","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"AXgiZXHy7kMs6mMLkSF1bQHJumdMTjaVztyHodHFaVq1","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"3TPWtP3UCZTKwzXphAprtZqh8QtQtJ8Mn4LbM36uhYXm","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"632Cy5ZX2tjEFE1DSf5DXNQVKUxbCLZb92nVDDZCHzgn","sender_id":"bhc15.testnet"},{"type":"receipt","receipt_id":"2wgtsApxzGvaacLNCzEde75Nwofe3VhHBK32TcXSB7WJ","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"2ZDerPY6zwPceZHH7rMDTbKbdJkVsFpx2gWkJ1sMWsdR","receiver_id":"0q34eghn01vv.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8Uo3arAX2ZwLeXuWvWPn241YAV4vXxyksqSozARoRAq9","receiver_id":"testnet"},{"type":"receipt","receipt_id":"2yy5VJCjvNXiRBsAQH4oFmD71RXcbPK6RCQypoByrkST","receiver_id":"testnet"},{"type":"receipt","receipt_id":"C3GrEKzkaBoU7NfZ8P2HVtnaxXTSYAD3DR42i6LAJQo","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"FU7PmA5AUQxfUSmeY8TrZTEhDjPJXsqe18cv7G1vzAv1","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"46LqbXPA6gQjHyWVdmbCWapPHUknXiBswozueZWJQEAF","receiver_id":"dev-1705307910944-61831820799278"},{"type":"receipt","receipt_id":"AachQMGn3CzQ5MJXZAhzfvZGXA4ja2oEL2LvbyAqtBrb","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"88T25wvh8k3SXPN3Zv35PgwkBHQt8jcZn5Fws8gPTBZQ","receiver_id":"dev-1705307910940-63645215141528"},{"type":"receipt","receipt_id":"APjUhHPiLmmUcGKXLPJkisMA4RnA3XehxShHktrxAFjS","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"CQiPGrmbyzb3rZvS2uPELY9gwacxpuso5gU37J8AqHqZ","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"Em48RmHvsyPRpEF3NU3izqMV2GdY5UQkN1v5UARNU3Jz","sender_id":"testnet"},{"type":"transaction","transaction_hash":"3Wa2TD8TXXesB8P3xN3zg4rvJyHngp71PHaNNjcvwbgT","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"7hk88yT21FuVHcrMyZCaTU5Q53iJzBWPt18hQUXSyqx8","sender_id":"testnet"},{"type":"receipt","receipt_id":"23jmNcxbs3QquTYLX1eNcQWbBE3RAUu27CMFC5pTpewT","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"4ZDVp1sz3wp7RwyHAGzgc7w52VedUmHCxC5J2wHfugq5","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"9LqgJqe8ewcnA1nwD57MKy3MVuLWRbA4GVSxKh3qAkM9","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"HrnxtphU4f61rdakx5Hs3YWwFhdNTUEnxD5jnmCCboo","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"Ayb4aPGDk4YaQv8jTD5kEqMSjD9nUmMGRG94hr1H4wPp","receiver_id":"zavodil.testnet"},{"type":"receipt","receipt_id":"6XrLiZa9NNEUYUXZhWjEftYsXnUkdcPBmXqABy6pM2f8","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"EystZsb29ZCHua6howqB4rW4uoHiLmmqp1wdvggVH4Sh","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"4PfQuQCRbEwBrdHvSKYJBzVk1uMooPpwg57hLeUcaFhH","receiver_id":"priceoracle.testnet"},{"type":"transaction","transaction_hash":"AdBx5TxbU6B8oMTt5ERdaEvMjQHkez4qskux4fARHJKm","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"7Ap7oR2KciE6fgrgpvv8aYsmps7F3Uehdw8KKtjxGQJ7","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"7FZxHdMxz2kyiGoFuFwL4AcEUM6X2ZgFRoxmaJ4qcTHB","receiver_id":"testnet"},{"type":"receipt","receipt_id":"HJUpQMwNHrJJZUmynMfjhbBCmLrtehtBKdjpaXkaMAa7","receiver_id":"testnet"},{"type":"transaction","transaction_hash":"9J1ogtDDMdnpswejteNHcdVeAUbqyJfjevLQ7pTfWpxe","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"EGhfVcoKQKyiqcxaGFbfmgC8G9qZPMuGFbJkg5hnsmyt","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"3E1aJHc9djkQJNWicMZggR6YPbZkPJL7VfDQ68fKL7Ya","sender_id":"zavodil.testnet"},{"type":"receipt","receipt_id":"BfPn3CFLjy4A1G57Q31SgdmehFR1A9vfMa9CNksqdqjH","receiver_id":"dev-1705307898433-26034121630686"},{"type":"receipt","receipt_id":"BmGXFE61s3BerQpccgAZREhvTsKXfMbXqpHfuvixkHqz","receiver_id":"dev-1705307898466-81907073670185"},{"type":"receipt","receipt_id":"12YXBaXQD1pMicv2XAy8NpvHRbnE2KQQTMd2RQhhxTya","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"DrhDG7sJbYipxR1BWntNjqt6RD3nrw1nGQpV97sDpbcm","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"6xnmoEYq4cE6DBLJDHfokrSw13rEHDzNTdqGV6XcWTsg","sender_id":"testnet"},{"type":"transaction","transaction_hash":"3cwMmToPyLVgc658k2J7Lzu7gbxZuo8MPNT9PjMkn1qu","sender_id":"testnet"},{"type":"receipt","receipt_id":"3PyK3NKvdmZAR4DsYeCuQrcAMjoQU12tC6DzQ8abVt4Y","receiver_id":"j21jwivujppq.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"C6MEJkm3Fgd5pAeGj8kcxYRvewXoMVbGeaxRXQSXj8Ak","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"38j7iZDr9RhXYgGumBYn4cUx8d3THbT2EuoK9ey6h6cZ","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"3B9gsr6aepyFnWFU5NgrbgnkPJjorTZgLEduHn7jhLxK","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"5hno1hpABWKfhZrnQNQrNeftbiXeUE2nkyV1ve8AJWd7","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"Fs1snRARpfMPzGdd3WHALSF8pNGkPGYEVjRJTZLSexfW","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"4c2qJ6koBSoAQAJmM7uyukcCdQmcvrWmFHNeoFuvevee","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"AYoR6onupvM6Gv2XSyhSyydkhzYBuwHi3TKpggeCs5Bw","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"CMDT8PFrAuBYN1BzYDMWkyYvpkS6wZwMCjG16KwYSmdz","sender_id":"bhc13.testnet"},{"type":"receipt","receipt_id":"7REkFmUqJ1kk9mAnrRknd5hheGWvszKvBx8qwvZuwVpR","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"Hcd7g9nFSKrUyPTLrYDd1cxATvL6DUHnftS5RGUtQ3jt","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"FTKmyfNjPapcKmTmRgHRsmaL6mDtuvpLEANLJNSQNYox","receiver_id":"4wppo22o4q7d.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"7Mt1fobGjafwC6W1oti7D8iYxKnJwgDierLfVSzU7KLM","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"5gCAZ8Njeobxrg5NsjY327361NHYh1XGgfJtkwRxK8op","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"5puFb1DPWk7vnEhBCJjoxSZvVaRyfMCSQSzo9HRhzkGf","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"BzVZd89LT4UsT8EdsHMj7W6B9HXhvURFYTzZyvsA5kC1","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"GEyK6YvY33af3QpTh9xgB6qSGMbH1gXSE6vhmd3p4k2r","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"2yU3wbMaADVa5yNQwrteJuMtpZ11Upw8nC81KBxVMiHb","receiver_id":"testnet"},{"type":"receipt","receipt_id":"3Ef1FpTfwu5w9pZq2dMFZKXjERM5NvPyd5fqF4EcYyeP","receiver_id":"testnet"},{"type":"receipt","receipt_id":"C7wxqZ9JeFJT9dEb2L9GMiE21SQB7e85efuP7jVLJmeS","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"9fhVYpxUvRtofxxXi92pV26tQjwqem2GDs8JY2kHCEkE","receiver_id":"dev-1705307898829-35355796779017"},{"type":"receipt","receipt_id":"C11VQHuw2P6QhqWTvdukh21qxxJgMG22LTHsrEpp5FcZ","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"39beQnAfJbds2QhYK6mwRADR3n57Fv7z9aLd75siUj5K","receiver_id":"dev-1705307898858-90397935745110"},{"type":"receipt","receipt_id":"6s5MYdhZF1Kw62uijZ7Ym8qC2JwvyMVdXXmYSUXs3k3u","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"8BrMtq6jpMLHRxxjKxo2aSGtg7xWzX9gD7K53mVbZDnr","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"E2NZbSxTfZJ2pBw8WeZHsag2619wAmemgC3HBmmWMzdC","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"6X8EK3HoCFCbcoRR7RNSqqRrDT3uCg1mRXwkVZGCZLU8","sender_id":"testnet"},{"type":"transaction","transaction_hash":"4NkCDrdjY3Jd2dJbt4X59hkHbG5co3SxYTUNAALqDmRx","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"HrifTYWLyW5ABrizokCsUB9ucpNqYmAnwYNzBLL3Cjyi","sender_id":"testnet"},{"type":"transaction","transaction_hash":"8ngd9uVW5T5Q2NG7jcHh3sYz2P3jqXkdWQ1AaYmCpDfC","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"EyFFfe3HKSGCwcHuJMJTxpZUwgWr1Utre8h9pJzXgK3o","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"5u53aFNKuAvBcACxNFGx3h6WfYdpkvLQcrSzSJsx46nd","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"H4HywdHZoibZyMkHcVjEvNhpHPycSc2c89btgqBSPpgc","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"E6SY7Mb5zM9bAX5RjfAos1LTkrLgcYbHwn9Y9SghP7PE","receiver_id":"5-manager.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"68XYxPEmndTstRXLrUT4LxRNzMoP4ZTF7yWauaXRBQNy","receiver_id":"relay.aurora"},{"type":"receipt","receipt_id":"2rXmHAbk8YZN2YGnKw8QfeGJUsJArLBhMpFxvh5s7WSv","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"4zy6PwvZF9LR1L4wMnZPpfJ9q1htHPxdrS1wLy8vFXrz","receiver_id":"5-ft.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"8nWPwYgXN22NNDctRoXbWPayRADqzBBD6o5sArxBBuRB","receiver_id":"testnet"},{"type":"receipt","receipt_id":"AiXXDjUzJHg3jVpDhuxuVYh13TKDQqCYKGWHhoUZGYGm","receiver_id":"testnet"},{"type":"receipt","receipt_id":"4cUnbLZyHZ7zaiYW332gEcRS619988fp8qf6Sf5tga5C","receiver_id":"aurora"},{"type":"receipt","receipt_id":"DwYs3r9HGeQZBqhnj2B915MWXTGZ6sStqoLLo5eijvpY","receiver_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"o488CGEfsN6xVGPz4HpnwWJ3pkvizzNbbpLuyr9sqWh","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"Gj4zCiCtJMLBAuLKekBjP8FtapoBdRPXKzVYKcq8fBJw","receiver_id":"zaru71wae3xm.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"4AXsbA6PpSPa58Mpbhq7G8oyyZbUfiGNwTdw4s1ediey","receiver_id":"dev-1705307896734-91056264654871"},{"type":"receipt","receipt_id":"EEMnzGWFkJhjEJrJRbK2xrRUGKk31VURFU6hkWWAshZJ","receiver_id":"dev-1705307896718-65112976037726"},{"type":"transaction","transaction_hash":"8PR3U56NpGFzf6aPCxAjb5krsJPTnuWWXPG1aj5ci3Z6","sender_id":"5-manager.dev-1705192023920-59281357047296"},{"type":"transaction","transaction_hash":"F41htcw4KnAirmtbsuSCFEZq4PEErQj99KnLTjXuNwLn","sender_id":"relay.aurora"},{"type":"transaction","transaction_hash":"AvLUZkMWXMPAsZcbN6msP53qxifQKaEoFVRdajUnzWJF","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"BoTUruNPYK31dn6zmmvqcVD98yWJYdJx6mwUvhm6cxZF","sender_id":"testnet"},{"type":"transaction","transaction_hash":"DEKdqsUKsPXyaL5za8HzGCZJrf5oiBizERQ4A4giEhuu","sender_id":"testnet"},{"type":"receipt","receipt_id":"9MB8qBQTYT7yY4AMwBDDFq21Ui8xjsmf9euFrQpajHpo","receiver_id":"5-manager.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"13tXtnS2uBStKxPhVgqdM4YKm1ZkZEhavkT9ZZJVvggx","receiver_id":"s-lam1.testnet"},{"type":"receipt","receipt_id":"Ffr1anKFzzi1DWdRdzmCVGvd8GZXgK5JhKqaWekBvTB7","receiver_id":"5-manager.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"FtXuCxzWuVyTJPbzuZJvfx39BkGf7dYf2hXg499yNXA1","receiver_id":"5-manager.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"3wveX6eXzBYFv2p4BVnb7DRxQLSLWdPBa868B1dKAcY2","receiver_id":"5-manager.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"6BKKPfy23aLmZhci8AHbUNTcg692FTgfGgwEgSMM6Ehn","receiver_id":"price-oracle-v1.nearlend-official.testnet"},{"type":"receipt","receipt_id":"AbcJusprBecgG9NfV2Pwy2dAEcmmj2Ry8ndWnXHBHjZz","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"FBLH6KwCkLzhQdwcUSxVNUwRDqiPKZw1Smd6o4GX8YSs","receiver_id":"5-manager.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"FqBVYpxRFMJdUC5LNaaQKGHj7NSELfbAa34n3rws36CX","receiver_id":"5-manager.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"GcDAF1ybPVs7uMacth3Ju4dcbzaa68Fv81My7g64BqPs","receiver_id":"5-ft.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"8mh9HkZ33pBtyURijc34vAeiT2rwvff6b1FetQYfaQYA","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"4UMs5gaqkN8KAHxX48d1qdossGhryqSiqEtNBJJxYjTi","sender_id":"s-lam1.testnet"},{"type":"receipt","receipt_id":"83h2M6ee7pdc7tDbo6AxouJU1pztfGi1Xdr4ESqa6bAt","receiver_id":"5-manager.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"5yq7SyHH8Kp7Tvjs2EJ9aWeLdJgbEHnYYcC3ZxhyNTEb","receiver_id":"5-ft.dev-1705192023920-59281357047296"},{"type":"transaction","transaction_hash":"3yLteDqyFqya4CX6ySkjK5WPaBxTjKJAG6sov4P89NWM","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"GhZzj2NptNY9YTWYLxjqu8qHx7Ki1YBtpy2356AVLxNV","receiver_id":"ray.5-manager.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"CFaqYyetKq4Vyh27zyVGCKWFo2DuK59qRXqx1S5tkJDy","receiver_id":"5-ft.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"gwQDmw8R3up9k6KHzFcxAgZuagGak3zHaNDqxwqxYtg","receiver_id":"5-ft.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"CUcGzRfv4H1ASVLirzWnXXrCa7GiB5a1xBtRQmmNN8Bk","receiver_id":"5-manager.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"HxFPHfv6ipvGz6aQoZDZ1MSF9NyU1cvumTHfo7TuDqei","receiver_id":"5-manager.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"CJeA4nu83Mri2TSqjA1ggNAjFR3USZVXna8FZXkZTzZ","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"DfhX7fwxPG6wrZJHu3quL3JH9wpgsRVvRegy6fuJwMaX","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"GJQACSipp1fuRphvb2Fu7qPNQtMNrihJdwsCPi3mxx9C","receiver_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"vtzV6vE4j9R9tZsuie8PuTaXdvnXgegb4ojskLkC53k","sender_id":"5-manager.dev-1705192023920-59281357047296"},{"type":"receipt","receipt_id":"AB9SKoVPvhcM8rKAp5nh7XLRCmDxb8EUKW18ui35DV1A","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"BafDCd9LSjRnZwFWhXKWmavV7j9ombwwxr2vwVdSA1RX","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"42KKwyRV3mTYMka9RtuVEkFYPZgLjPi1pVN7sa5M1ydC","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"CtcUqSTSkHLP5L4htPUkKSLbUN4He824ymuEwXNdH9Hy","receiver_id":"8tcxyh4eaepg.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"A7z2fzjRoAM1pqertM46F2mPoiDoZMtCRTNt5AJRimij","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"5TJ16YvPQCuM6uauFcTrPcUgGfcLZVw9oryACUBSUbry","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"HtL9Vd6UtJzXnN6VYuKx8S8J8JCAeJzi34ZQSorxzzpF","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"267ataDuMW3r4kp1JeM4MtUbbvP9dyNrjAGEXbEo2KUy","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"BMGboW7FQH7miwnU74GN2ktntu7sm98SshNsai3j28ec","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"Ed8YULdQXHPSZ4LF5thA8e28koou5YKPYTeFXHnJqged","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"J7EhMakp5kGHkJwCRJr7YNiX8bNZLkSY96bNi4yuknWA","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"9aoJTjvWzcvNNFVgTVfA3d6242eZ3Br6JMm9sthEQTrh","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"GXu7Mee4Xt1mXT7tGTTRQVx4yTJQKgPsVpo9foCdT5ec","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"HaMd5RGQ4sKWQy4Sv5Ti55J98o9yjd97bNKoJ6gVbUM5","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"DCoVFX5qDp28ff4xXhwJUJfSL69kZWqZcZLrNtNo4P77","receiver_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"35N8UqhoxemuFMVNKQvcRpKaCm3Sb6VQhb2RE5JKN5Xg","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"FBQDL1Md8DfrrYCQuNsUJoZ3omPu2pGcFf1a5SU29R3Q","receiver_id":"1vf8lat3eupe.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"2ke2B2grA4UNgLZdLzPLNNWzq9YhYc5c8RtKDjkzm5UK","receiver_id":"testnet"},{"type":"receipt","receipt_id":"2n5FExgNXjGUdKXT7JWy2uy3osMxk5kqGNR114Efc5eL","receiver_id":"testnet"},{"type":"transaction","transaction_hash":"8QNg73mgKNLsmkmSru5zcoYCMJzVQ1irVsDNCXyBrXhm","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"6vSCV1u1vYCs1c6dRGSY8Hw9ZYddhscFcrbontJBJh45","receiver_id":"dev-1705307878625-77546670858145"},{"type":"receipt","receipt_id":"DzN1ZqtLtbifhDtvYbiQErKdmiYEivSKFeTfLUjoFnmp","receiver_id":"dev-1705307878607-95984362744421"},{"type":"transaction","transaction_hash":"6Hw6PdzzM4B3w9sv2MVSrUAidqXsMbKXEKTr4ni1R5eP","sender_id":"testnet"},{"type":"transaction","transaction_hash":"AvSHRnF1JY1mfvuCnorFMaaSzB2eehia5wP8aXrPVqNm","sender_id":"testnet"},{"type":"receipt","receipt_id":"Sf2A5AxxYj3hv1MquBXHAqtxua6oiwpKf86Fy6CG2zp","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"Ds8pzP4gKC29Y13uqLSkuHL91oqgqEiUwba58BGER8NM","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"DZ1BazQkJY215TtDwnSwASGW2ZMPuDabNw2aY89iEcaC","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"5wfj3ZYEHpbo1NWnjdqJtjY2JV428py2U2qo9vn7pAMx","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"CeaeXCcAbeSGauY73SPi8u8nLgfXv5FSvbVYEwPsMN2g","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"BwWV2oQ7HzRS6yKnN8jEYy7siiuWCAAMwNEeYPR38RJq","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"26i1mbzFQcMBN4iCfrDFTZUEVb13L16TPGrnnHTZSxBA","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"7P7Fbrr7CMAMnn2r8psQSRK8HvAkKnvHhpJmJuArhHuH","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"4BizbdPg8YLUwG6SybYhJdUsKdEuAPfkFMzMpRPDVaAq","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"Eqp97EsTs1RBWUkJpbW62HFfATZKqHTRu1jaT5P4XxxJ","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"3exN6XrXZzNMZvPHSjYsuZwqkJZTJR6jyywjSGXHjHt8","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"8mHPa5oRECdDm29fL9wRqp2NQ5PxVGqnzGQYWRcN7qNQ","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"3Dudq7DB5HGUu8yR9cSvo7fAQRGmyTFrWLfhEDGh69gi","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"GUutW5WSA1RnajtQ13SAYb3joHZmfYpb3s2ko1J9ZqZE","receiver_id":"amca4m99b1u8.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"BsEU9eEjSQ1mqmEthvB5CkuDEQsCWUovN1AEwHbsLttF","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"CqeF4iuk9LzCf1pWJvgbsAERzFJ7PaLpLryuJ2bE68hh","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"EhuKzKnLKoknG8bk325Lqp7dc6wLqWYXVBvmBBv2LTyh","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"6Rd37YNfmpSSkREmrF6doC2pcehrJsw4FFuE6t46416D","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"6pz1zC4MyEAPnBmkjpnKKzCVdDW4aYNP5ek3JxeiZUsi","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"FkQjBGFCw9UsMLwqqydEyyfeP36rdcWYyQdkhxoV6EGB","receiver_id":"testnet"},{"type":"receipt","receipt_id":"EuzSjBDMP3TfMdXZLbmKz8mJUqfHhciEptV3H74Sz8Kv","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"4JLRSK6ppBniqv2dS8g8DV6yqnQ7pw5otNJwYPfitc3c","receiver_id":"testnet"},{"type":"receipt","receipt_id":"GKsPr1kVBCGbepGEw8mzq91DJfP4gG5NMh9JmZWShCm","receiver_id":"dev-1705307874862-35306783139366"},{"type":"receipt","receipt_id":"GP1K1ndb9fSRGrF6RUSjvAw6m139EoWWWCRSY7frW8HA","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"3FB28U76MD2syh4jzjXFkxymDPp9HYZTnot53aBFT4Xg","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"A49XD6VGqMVymQv3ZbDyZ7eCZjvg5THs7tQaGXZ3Cke9","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"6vEEcNPm5P37q5LSFU4kYrVPGxKpvx6g4NjfkGVWTs8p","receiver_id":"dev-1705307874874-37652742511081"},{"type":"transaction","transaction_hash":"6viJ2PGP5pP7BF6PLBu9V5dJrMnChP8NuNyPy8i8qpYm","sender_id":"testnet"},{"type":"transaction","transaction_hash":"DxG6fA6fkrymd9snoiy7dxpMTHVFMPhR8hXSNAoTaaAY","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"EnNjTWXD3nQFhMctPbZHwGw2fQM9VHtBLi9tvBAN8fqm","sender_id":"testnet"},{"type":"receipt","receipt_id":"6EF1aWsz3m5cBxzjt3G3z21ppxFQK6SRZfKewYbutKDR","receiver_id":"testnet"},{"type":"receipt","receipt_id":"GUN23uhWrZshq9x8kFM67jtdXkw3nCmPb8AkUR1QkC7z","receiver_id":"testnet"},{"type":"receipt","receipt_id":"7LmEfPZaJaUS6zHnpqoTpupNYDKK6CFrtGBju1B74XFY","receiver_id":"dev-1705307872205-99213567112810"},{"type":"receipt","receipt_id":"3FZug3PSDbSwgN7KV8FwaioPACpDnFRAwXtKJ94vg64p","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"AFueZUywagapg3zzSQzZrVNL7S9rJci5H4vqXFqrZWxY","receiver_id":"rrbqctvnufrc.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"4JZzXjVqBsnYmmEDeHd37pc3VtS3caDPUx6kwF5joKpJ","receiver_id":"dev-1705307872188-88884159947877"},{"type":"transaction","transaction_hash":"EkFx8AUJJVTduPWUSJp84vbZYaS3JbweTuQ921yPaWJK","sender_id":"testnet"},{"type":"transaction","transaction_hash":"EP79Q5dbvF6yaYBqRRdfWGxoVbJTcEPmf1xTRYu9csXF","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"DJYbqnB1sfaQUTo4MMwRnnCnVhyLqtyx9tQvfCtXxXzL","sender_id":"testnet"},{"type":"receipt","receipt_id":"8hw27x4nErnoAxb5dSsvCJZMvbEBGU2uZ3GB879LpeKu","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"CKUjpSErCByppV418o9o3NYMm7TNtgm43pPduAn9X5s8","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"8uZt6DQsw2sq3xrFt3RJNieS6LKDhH25qoUyG4Cj6pC4","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"CuwcRofqQBPpoKzAUpa3ksANv6Te8cXoWpK9Qoc6tzEC","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"GH2NVDouBgGcwcMcxfd2QaXTVeu8uuFxfFDMW6WF4hwz","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"Fsk5TnJ6eywZqxTZiLrysALurQ1oQh9c6FiFre3U25es","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"9jhcCd3FLM13E2LEk9n3Dn3t16RofCDPMXhphuCznphn","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"9BTMpPUWiMjLrh1aVxiW8shc93rgwiLQmuqdTay2MLXB","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"2GTdLdYM5qF8zTMeqxuuqPQFBq9H2K9KRyiZvhrcGGen","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"GdbxinJkfMtzdofWC5wd3QPkKh4wvzdCmXkbQyBjDoht","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"2iWKHQA9vc391e8t4DKCQt35fBYgQfyypTrG5ateEvnV","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"H54N6mtrYANytHTbqnMPWPQV3qiie9C74b4vnq58QKT8","receiver_id":"zavodil.testnet"},{"type":"transaction","transaction_hash":"5qaSDBKCJsPqofHiLcP9QzXfMBTmvBmno9kaGi9hUHZK","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"Dye9o49RwotXeyc9iAUEjiGF6LQT3YXADCNqC8faKt9V","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"eYKK4wxVWsqSPoN4Y5qWuwbEjDSi8NojNDzpkoUwoPR","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"GZdRoPNAprgnuZJvD6MP6YiTNJNvKipXdLBeAQ12FFuQ","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"FEhmoRM2Moy3SXif3xR23Ux3LESX5trg2MjxQwckxTe3","receiver_id":"priceoracle.testnet"},{"type":"transaction","transaction_hash":"AicFkvxgPAGStRGCdzWMcgV4J1jYbzmH9gpZcGrihEh7","sender_id":"zavodil.testnet"},{"type":"receipt","receipt_id":"DX91kPfQPho6GLr98Dv2iuVb4ae1dNXNmuaA7qXm2R8P","receiver_id":"oracle-2.testnet"},{"type":"receipt","receipt_id":"B8iNpBjtxsWTn6843y2z1Z5LbNwYxkeyBuFjnwmnjBmx","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"B3Fgnxc16h1z1mRSVxj2u1717rhmA1vVVxzxvHA8SNjN","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"94KT7n6zxKnWXe7sGgStvwfxSNCRMU5sBUuJFrC76Wi9","receiver_id":"yoshiko.testnet"},{"type":"receipt","receipt_id":"xgdoW6E7BNTtbJezgtNnxRv37UZeRwPwFTXp3UQSCnZ","receiver_id":"yoshiko.testnet"},{"type":"receipt","receipt_id":"8AKbJYPs3sKY2BCiaiwztHRbZTAkTGYw4ZBunoWYBdGp","receiver_id":"relay.aurora"},{"type":"receipt","receipt_id":"4RB8d44ipPuLPgy2mL55iMKGHZ1vDMnkix3N4T31BfT7","receiver_id":"priceoracle.testnet"},{"type":"receipt","receipt_id":"HqjbxjyYt3RXb7tiCP9CgVWyERFYwA3XjwnwMAC1JGe3","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"7aRcVbT1DEzQFgG3snoyoxBtGLZsX2yWPA6EJiYqrHAK","receiver_id":"u20d2otgkumg.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"4cGiFWPqYdE2uBCVNRsKphG6iXMKJEziUDVM546uwPCm","receiver_id":"aurora"},{"type":"receipt","receipt_id":"7veqnMBDeJsGnJJeKh5HWGWtLgkcT7p1f5hEDX3Pwjui","receiver_id":"athlete.promotional.basketball.playible.testnet"},{"type":"transaction","transaction_hash":"3bVfoDA6ikR2WpCRTrSXtZQ9MTBHTonr3qNky3bcX73T","sender_id":"oracle-2.testnet"},{"type":"transaction","transaction_hash":"DsWufLkBqKUjfcM22MFgJDZuqcHVuFtdtspVZVzZ36Hk","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"Hjd2BVMJbcwqeXUQKNVwn89u6TKh6MUcFb3Juyk9fAWk","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"FwatXJbHzbiabtHhonkkHu8sjvKMat5cBNa3fFk4tFBz","sender_id":"relay.aurora"},{"type":"transaction","transaction_hash":"66fQKS6Bmpmi6Y3gX3yrzhLwGTedrrX6T4eT6LRLnLAr","sender_id":"yoshiko.testnet"},{"type":"receipt","receipt_id":"5DYpU8wsUBWnskoK1xBJeXvH22RAEwGDjt2SQkbugAhd","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"FjBpFiCo8kFxikSV6frSSq5vDZL2RGHiBRykoQf3X4YG","receiver_id":"dev-1699209171769-38068923418802"},{"type":"receipt","receipt_id":"BrfheXfYfgXNMSxapyd7MBZ133MZhw9baDKDMhHyMCag","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"BaNYzySwPn2yALxKPHhzf5taPi7yikUPuRVJ1AcGCXDY","receiver_id":"pebbledev.testnet"},{"type":"transaction","transaction_hash":"3HvvgPffbvzciZLRkBNg1C9vMG6n2y9BpKKWZfgpvkZi","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"7fKad7uM7qTzJ5kA85t7pYtzskb5FM8RUfCj9PmHnckK","sender_id":"dev-1699209171769-38068923418802"},{"type":"transaction","transaction_hash":"8zx2aBEeZL2GDG8UxwQt5b3U2vDxLtFy9VYEFjuV8KBn","sender_id":"pebbledev.testnet"},{"type":"receipt","receipt_id":"DBdf76FsVWhECc4qD4SbCz2bGxuCiCtguWgxXCBnifMt","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"Bop4PowkKx2sRca8BYKQYcob1HqzQiVgDnzqNqN3skpS","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"BRYW4mie5t6NHx2NVE996GRDKRwSmotbugpVRA79bhR3","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"5xiBH6w7w7Yiaqy87D363KxMQffFTaeM6xTWa4wn1Ut9","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"AZ4XbqnwQYPRRcNUtBp4v6MT4zcLDG3qq1hGt29sH4ER","receiver_id":"dev-1699209171769-38068923418802"},{"type":"receipt","receipt_id":"AX4Gct61w12k6iR3P8ad3b4sETHhSuLp38QWF4J7G7oz","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"FnTY4wcFRPiFcR5qyPv593dneKchT8BfbrjWGUFGdNBS","receiver_id":"pebbledev.testnet"},{"type":"receipt","receipt_id":"26AAaEsjthHfsaWDfgHDm3pGXQTmR1uKvzeug6BRT5w4","receiver_id":"pcjs4axc5e7y.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"6aH14X5u4jx2JRph1iArg58dEMvkW2ye6DgQ8sRycXhk","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"8h6PpD2f9q3wXroKNJGyAVUBMQWaswAS1HEW6qjoUZNp","sender_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"Bj13ZD8febthbJ3XooWU6hYS6nAxbxV4LP2jr4yTURuv","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"HW4ewYRR9AGNA6uGySQeCVYYu9yGUTCM3XJo8ho8cf4c","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"MkA3UXdjojDFaVrrMhhriDdGHEt6pNfWcPPyzUanqA7","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"8ALt92vR52CXpQPudMed2dduD8Ay3qiB2cBbuYmVEHuu","sender_id":"dev-1699209171769-38068923418802"},{"type":"transaction","transaction_hash":"6hLCLJHNiAg6SWL2f78GfGGDS4EdgMfXi34NV7yDRy1X","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"FsiiL1PfH5Y73eLjDVgzvAA1LWCJ9HVnxaTnwWwjeus2","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"HmSbYrTghMZ1ePiy7g1js5xS1G46tTHjoakZt9dQ3DtK","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"HNdJb95k99monmSWJ7HGSGauiaMyJ9GKWebgPFiYf3BK","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"32A9mYNig9ard1L4uRgqv64SFdj75yGjBzUtnbbYqkkx","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"9aA4VauEdpksMxe396pVpiGUgjQ9p1CTN4ft48Ji3xZ9","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"6m5FG2ncuVc8hKB1g3w9z6MfNnaJzLJ94voegicf6mzm","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"7Af1Cfuy1PcwfpQ925HuodF8PYW9WrMrTZatV9nF6j7m","receiver_id":"testnet"},{"type":"receipt","receipt_id":"EeHPSMWkoFt8hRrBH8WvjAfdCzXedoTUMmc6kvXk7brL","receiver_id":"testnet"},{"type":"receipt","receipt_id":"FGm6ZWhXqe6KvLgBeyzcEphvqxoZXi7JX2FF6gDJzdtL","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"98Tmqkonc3AunTETcZsCp8ZyjFmGCaQZnkdAvMVkxxiN","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"2bJwBXVfVDvJveWz19Np4DkuQ1fWCWfXrEjDSyeYv35h","receiver_id":"dev-1705307857554-98615941249117"},{"type":"receipt","receipt_id":"FP4khnYzze9s46xfEoxyT5cJrSPgQArsfASVzTsP3ZEk","receiver_id":"dev-1705307857650-69966122322948"},{"type":"receipt","receipt_id":"36weAPLP4X9LW4YtE6P8GmhbMNwQWyHsux4Nw92wiBJW","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"6BXZE2hpZu6hHsFE3TAx6qvvjpufwZDK5UcPohC4z7gd","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"EQsSLytLFxCRLzsj6TRTtpX7xt7u1sh2Lvs7Zy2saABU","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"CKrtimMN4zdxgQTYRjZkVkHCMw5vEmhExREKvVYjLrgQ","sender_id":"testnet"},{"type":"transaction","transaction_hash":"3iqKVMszUHGjkqrvkGHMChn9mVGjNqx4VbpkzzxufNqv","sender_id":"testnet"},{"type":"transaction","transaction_hash":"EGbWgiMUeA7qGFJCfsvKDWMgDGBm4pLNzeQfkMvsSso2","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"Djnvd3g7hSsAyBEfK7fwE19CdHoxFfKrFN8eJ3HYxyiG","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"G83mfiKjyqUhaKDppeN739GNvKT41GMiRNBXZCVxz97p","receiver_id":"0vubdoy5ife1.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"DsyXG5Kvv3kKKNCFDa8wenpZ8gZW2GzHj35tGbH227he","sender_id":"pebbledev.testnet"},{"type":"transaction","transaction_hash":"GD2cubVLx9xAYenvdiiZgWi2NL4bfStssNBCshxxDVhy","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"F9XbwX4eDjdvZ2ZB6FdTVYSFch4GocgcZ76NRD8jt5N3","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"AduydF4DkqTkZ4xWStEUT2WBHkK7dQL4vU4Edf5CZeen","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"9seTCerCF3L3LvvMRLooXZiJHma8EBCY5WUXUyrZNfEV","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"4hXtg4Cu9DFNdpVtaRwPvD3TEExpJamwGuXyxFapp5WB","receiver_id":"zavodil.testnet"},{"type":"receipt","receipt_id":"Xtr54tEmpo7UC9RD97kn7toLbpZzL5sCQi59jWsRevY","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"2FVfgNw8bqLis9oNzbZVRAB6ruwPbikvF5KiPBxysrBo","receiver_id":"priceoracle.testnet"},{"type":"transaction","transaction_hash":"FihZNBc8vHvCbLTuNwXGdfFNDFtjZgC4jzcbYZak4RUR","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"2EeMx4ZUffRZQ9MVm1EgSdHsa9Fh24sCzVG6h5C7sDtK","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"9W6NJGDTsGUCQzQGN8nh8RccRaKBggAbvFRKKp7t3gvU","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"nZasMKuRg8XsbBzqWeJ55yJx89rpaPghei6NHg6p9Ue","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"3CPBhUtz1NQiqfH6kh7Mq2wit8CwocGUhCvbEu5nquuu","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"3JrmWoRsD2ms1qbKNFGk7HdJ41yAuwgmuSmgqacsUH6D","sender_id":"zavodil.testnet"},{"type":"receipt","receipt_id":"5ssHDEa5etgKoaH4aNLsh5i31E8t1r29xPRLJ1VGJKaP","receiver_id":"testnet"},{"type":"receipt","receipt_id":"8goQYKZbxZD93UHt95WscftoMyJdkPbf1bvuTd5Bk32F","receiver_id":"testnet"},{"type":"receipt","receipt_id":"6WRG8jq4QPhExbdfEAc3357U79Tj3CtWmgckQKpfaTC4","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"DJ3sHW6ZxNNV3zgWUUcrYk1CJcTGH7D2uKiLAoRE94j6","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"GmhiQ4WKLB543g6ZBvApWCCohA26PChfBb7qo7vThptA","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"EAJWhSxsj66bGHGpCmtThNHEhTs5b2Dz3yY8HfcMb3Px","receiver_id":"dev-1705307847872-52609250766362"},{"type":"receipt","receipt_id":"EKQgm4uD18Rk3xuMwGNJEXRCUjsm4Fv4pNtz1ySabDsL","receiver_id":"dev-1705307847895-22300198841507"},{"type":"transaction","transaction_hash":"BKL91qhzPjAMgqH3UFSAPm7nUhG1SHENFJUZzgspSfjD","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"AW2tWQZ8xUBh7KhTzHYWX6S3jrogiHqiacJ4GsgtPdhF","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"57ty8LXfDyWrgsqm6wPRJtxtzGZbqUAZEDduRhVjhzAE","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"8qwymcUEU9KtfE78HBj9FPTBMctZAqJCnJVP7H7Z1taA","receiver_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"7MSD1GUBqRPanWAFqdbxmzbHE9GcLcTEpX7tFnFhNeeK","sender_id":"testnet"},{"type":"transaction","transaction_hash":"4J6KXc5EcDKHTV7x8BM8tKCeim85Q8HFnqJwj9jaHB1W","sender_id":"testnet"},{"type":"receipt","receipt_id":"BytpP7PmyTZuSyA7hH3MBcyoLYUdZnFwW6EQfqqw2ZZZ","receiver_id":"8luca09ft80h.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"DxBJW2G3CQCnRkiggEfaipKZgmDNBkDubSMiEKzsJht8","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"oLcrH7wywbKGXXdvYHweiuxP7UNcU38HHx1L1112bjJ","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"HtV35UYqT87Pug9Yc11FE2LVu2GN2pvy1g8s83ZuxuSb","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"BKfVC3KSxcj7BU7MidRQh18Q1SiaubnHrW3PoMGexe9c","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"6U4Xcatm88u7eWCTndCCBLzDgZKPTtofknsL4eV47R1T","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"Cs71f5WLGj5GQVHbmgS4aHGCNxKgQVfbARqnN6xLJkEZ","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"Bxvw5EkPMYgZ5V4ngM1AAnTGvaX6E3Vw8KoUfpnaJQfS","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"EN1dUzkQi2CaiinNp4yqHoFAbye1XVjwX9qQSnMTfjVU","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"7zZ1wNcrZkbNEP5ZF5BSmQHt1w4BdvPughqR1NHvYgiU","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"956rcc2qq21cjSnQmgpZ9du5C6gztiR1m4AYGphZ9tU8","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"XbkhFpPBpYS7YXEJrefV4ocyEKH9mdfiYhrZ2Cr7SVz","receiver_id":"5hxn883xxege.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"Azjbzezau7KFtbCEhE4gcmNShzsussV4JMDA5PrVTSqR","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"3Gw4qLojge7zC68dzU1cAKeUs5ibXUvoovqoucR3uLxQ","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"HP95raWT3ek1R6fvL6e1fnT2A5efcm9Ch9PDwNocqyDs","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"ExKut7Mf4Mbqv2bxAJDeyabDEXLPsYyjc26in8B1HbqN","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"Axd5NJNev4mGC5V87nHQQffW13zR8CsNbxhxJJdMW8CT","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"DEz48Sg3o1sK3NsSdkKhQBXsicQCgarzM3tZrmVArqq5","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"F3d4rEghtdn1D2fn6qCi9D2vnX5FYuZxr4sVjeXgVmCY","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"2R8rLziQXf6jrjg6ZpFgxCRH37xG9HECtEJMJKvtXJXL","receiver_id":"asset-manager.orderly.testnet"},{"type":"transaction","transaction_hash":"52jw8BSDocthzi8CEDNkjjKHy4et7vuuGoFNHY9eTW92","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"BtpUxmo3WB7SBZQfVzy9myNejK1Gi2EWyEf4ZYt4PcJS","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"D7PpPHXKYci9KF72TLnW49xcxPHWsCQm7PFnXkRkmu1M","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"G4PhhKq7WDgfWzWHJhZY5x9ZS3eqh8wo9cjWXs2FT4ua","sender_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"FmAibdKQPQg5C3wjFVN4oNDhCf31d7Z5bm9sydmv1tBt","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"46Tkb1uqqVXDqnQCwKgvAGQPbNFaoxB9LaFGs72jFNh1","receiver_id":"testnet"},{"type":"receipt","receipt_id":"AhrgBBgUjHabEizJV2ahW3i6aHsXkQYQoJ8P4wua9zK","receiver_id":"testnet"},{"type":"receipt","receipt_id":"ELCBuF6E4RkYsuAkkqQZuQWtsVUSiZ7AKyRBguQsFCTL","receiver_id":"testnet"},{"type":"receipt","receipt_id":"7nAXEpWiuzshXR87sBXdduWvM6Ua8wjFURbhbixP3Cym","receiver_id":"dev-1705307837661-46681505814982"},{"type":"receipt","receipt_id":"DSQcPFszkmqYGn16gTUze4jzazHgwVLC86YgE33fF93t","receiver_id":"dev-1705307837671-19734995528860"},{"type":"receipt","receipt_id":"EkZV5QCYYqjq9GhtGedR645xBQtLWQrUAEe4rrugddVa","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"Cz7dR1CtwuKmgmwNEHsdhqJYkYUu5y4pKXvDpzwk1g1Z","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"CEfSpje7uRfebQtFeGfH9NAXp5J8P2Fp44uBEBa9rNFq","receiver_id":"relay.aurora"},{"type":"receipt","receipt_id":"5MQMoTbfrv4dzoZ7L7bUgZwFRVauJN7EHojyC7gXHWiB","receiver_id":"testnet"},{"type":"receipt","receipt_id":"7niRGhjABrG1qU2E3NG8s6mDFG3DUZ4MJH8Pxy84yiFu","receiver_id":"dev-1705307818231-78108509900081"},{"type":"receipt","receipt_id":"DpjyXVGUmzhRge14qZqGhg4BEmEwxo9MqdtMknu1pdYV","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"MdmXmF8fYvad8CChVn5stEKuJqYbJGKpB8RQ6A45u48","sender_id":"testnet"},{"type":"transaction","transaction_hash":"GAp8HFwWHMe6AYmzsruHCTEGs9rRCgdWYSBRHY6ePMme","sender_id":"testnet"},{"type":"receipt","receipt_id":"Ahmhv1HgeRYjJjEtqxnEqogTrtGxvc2X8Yk584RXeTuo","receiver_id":"dev-1705307818215-85371038755866"},{"type":"receipt","receipt_id":"9kCb95S8zh4N5KjV33QDriKPsuamRBjmzPvQncCbmXMV","receiver_id":"aurora"},{"type":"transaction","transaction_hash":"F1yqYqHv3fi1nD4x2Qer46v4yAwXt8nV7xQtENJgdk9R","sender_id":"testnet"},{"type":"transaction","transaction_hash":"8GWoCFCRQBsT3Ufk2hpDWW5yoHAmMjuA5jkEnHT5MsJT","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"2AGSwbFAjzPuhGzgFsUvCB1kpMbquAcTQBuieVHCU1mf","receiver_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"47sd586RJFziwHgVqGREAnEdYbacXcKkTJeKFLAmysW9","sender_id":"testnet"},{"type":"transaction","transaction_hash":"Fg8KZxzh8am1C5ReMn83Psm91qbnGSvzVKVmj2hxXpQC","sender_id":"relay.aurora"},{"type":"receipt","receipt_id":"EPMMuW6PBj4ZSB4yjj26YeLC2P8XgxD79qaHbZEo5qxU","receiver_id":"ys2rm4iswpa7.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"6BRveb46fL5Lum9cz1c4jTqSxJDFpg2jZy9fi9XSErpM","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8sQ2TkrZyVRzs4b9Sw5yFZ8rLEsZC4HMR2rfbx4G7AUz","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"F9nqrTARSoRTHGBL68UKMVfJMVRGmFt3rqGdebRiUXiW","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"5RsfPZwA4bZ5DrNYU3SeonmF1BxqjLeFbbLMMhnB6zy9","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"2pCtjcn1FvFgXh5TxVBod7qbTxuRYtbGJzMor2FgKvm5","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"2SWsPeazuntYAxG5DLa2HKomMYhpRhQ63A5PvAug6PMc","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"GQfDL3zu4b2GYhch49W92saBqSqDkPRz4Ejj4gw95LaK","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"8i9cMiFvDJbNQuRZw4e4t9E4tHZrHsTmg7mtChC4oL9b","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"7W4NgQPJEUPyJz87kXWgEdogHsRMKZBwQ1dP9wibcvfs","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"Eh3DTgTSJMgXzrsM6EmthkjJq8AWtxpV9p8nDm7GobHH","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"C25aD4p4UoiAmPJ82tsc3rx2hpNdqfq5q9TiDiYaQ4yM","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"2Sg3tGc8JDhVE379LwBpYQBGonYuqcRneRQttVBGNweD","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"DHB58dWfhPR2PiH6CzMJTeetk5jhwA2zgXhYQQSD1mfg","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"7zYvuVG1KtMKi7cubi7BD4paLgf9LmHjUVG1v5ZS1hmH","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"F6crUHkLV4yU4R4RHuzfZxn3xHSsUfKBFicFiHQUnoPz","receiver_id":"e9izgqoggd8y.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"DA3CTCyqhoHRTjKSRJEZ4FGBZTSc2zNE2fHmsjXg6obn","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"84bZ4m3PW2SpSrPdjzTMNEKjeV9aszf5NHqac6w5d3uv","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"284ejVED9Wa6zAEPE128q51N1voZCyMxyFRnuSD5ZiHH","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"GbqxkEiLhCeQaZ56SLC2WfXmD9UxnHHvsWEXtxFNTg6C","receiver_id":"nico111.testnet"},{"type":"transaction","transaction_hash":"6rKqZ4doQHkFB7raNMxqTfsYTJeJomAV1G5hzsGSkGDh","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"CJDtRazTG4hqqjWER8xwrhtSmSHmPfn7YfQnxf9qB58y","receiver_id":"nico111.testnet"},{"type":"receipt","receipt_id":"5AmRgzA27J1v5Y2HKzgNKjuadUfMP6ovQLQ4QBtM6z4H","receiver_id":"exchange.ref-dev.testnet"},{"type":"receipt","receipt_id":"HHJLJrFtVgcfdevr3oJA4X4idXLPzNRsZsmkgR1Xh733","receiver_id":"nico111.testnet"},{"type":"receipt","receipt_id":"GwV5EZguzXuYQPoJkrTroZkCudcNtb2YtLy19mfq3qfN","receiver_id":"nico111.testnet"},{"type":"receipt","receipt_id":"AtPmWjG8KwMyAsGuoBP3zdbASX5bzHQXkUqRSpbQifer","receiver_id":"boostfarm-dev.ref-dev.testnet"},{"type":"receipt","receipt_id":"Fr1KjSrQYaefosE7osZcTH87xX4gZgqT6oxVyUR2ffNA","receiver_id":"exchange.ref-dev.testnet"},{"type":"receipt","receipt_id":"ARsJFDf15wkx6SsWvzaZjtKH9dccCjwHM5yrqHdtvSwt","receiver_id":"nico111.testnet"},{"type":"receipt","receipt_id":"AAkGzQSVcEfD3CoRqgic4qrgnDSfsHEWbbsyww1hB7ks","receiver_id":"exchange.ref-dev.testnet"},{"type":"receipt","receipt_id":"EzZgijeSWqypWvfJRWUA5w1VmxKzdFTEKLfNKn3YpB3z","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"BnD6LtEAnyH7GPdff5gXY6BexjUJjTR6uzJmZVxLXUB2","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"GDBAh3Ys9DCqj4GwbcfiTMdARhtfaidiHjatVi1zLb74","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"CBbTrNUGSKKMpUFGKif9ERSxnow8B3y1JbLLcEWXpGSF","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"BD2m54q7ibL56mM6vC1ACKjURSMCdztyCwQDe5QpTwam","sender_id":"nico111.testnet"},{"type":"transaction","transaction_hash":"37Rs9fWCue4W5SREVNYuFRS4N66ydCVDYqEWE467EEs8","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"HxCALtUuE4ZRG65ZkSGYBfbr8cC3XNCfRoZesfoici1v","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"vCX8rcFoEFz4GzX5N87euvtbM3AT3WVBNnDpBihE6LE","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"GHjeFZcEFNLQa9XvsumUYW2cf5DCKRYjvG7AB3xNk1Kc","receiver_id":"345pclllrzhu.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"6QkcqHFLiiC3MnwKB5xQ3ZwzwqrReMUkRQ2vuCbLs51z","receiver_id":"nico111.testnet"},{"type":"transaction","transaction_hash":"CKjaER62rLqY1ia89ZU2B4n21Rn6rR6DU5xov1aDu9Et","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"GeHp1jtFKWsFoniuZYbB7gjkk5BfLmUnPeiPr6CVsGSV","receiver_id":"boostfarm-dev.ref-dev.testnet"},{"type":"receipt","receipt_id":"p92TBBxTR674PUhviHe3g4fzS8mcD9Sed27uz5FDVEd","receiver_id":"s-lam1.testnet"},{"type":"receipt","receipt_id":"7ds2qKnrHTW8Aju6awf4uLw7RQqYAhjFRrHQSxM9JLV9","receiver_id":"testnet"},{"type":"receipt","receipt_id":"27SNX5DcPjNFJJ45vBx4cj3x9HPddTT2SvU4rwzkWnjn","receiver_id":"testnet"},{"type":"receipt","receipt_id":"8H1xs4pKvfNC2cZNUcNv3pbDeRoDNCK1bueYrRst5saM","receiver_id":"price-oracle-v1.nearlend-official.testnet"},{"type":"receipt","receipt_id":"GbFwqrLJSTUoBkxFquq5JX7CTPgat4ogAqDUWeE3HKSe","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"Hyfrv7GEgZEHJDFYRJPsBXJSWXUToJWAsBLAH3ncnbya","sender_id":"nico111.testnet"},{"type":"receipt","receipt_id":"Bp58HbGSmhpYyqTBZha3x8h4R8kEtNyB3Bibifrv7uk3","receiver_id":"dev-1705307819711-48099469624020"},{"type":"receipt","receipt_id":"gdkmHGJDtqogNx2VDhofzbaYTXt7CKKp8isBYjbSQqx","receiver_id":"dev-1705307819745-10803656075488"},{"type":"receipt","receipt_id":"6D79XgKcecCKhskcDSHXcrPa1Q213iGGx8M7aPmfp4gw","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"C3wWigoVJYBhAFKcwGa2uWcGDdbbNwwUF7J2d2bEUCZr","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"3tcX53vqCyggpvHnZ5z8YxCmyeaGEYJFVX1JmLn9saLF","sender_id":"s-lam1.testnet"},{"type":"receipt","receipt_id":"CFsyZxQMwKuPGm4YMifh2g5aPJm57tBxKPUmaKesRsFu","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"SbkE1svxBpELejfE2GTH37YAXL5gu53PW1baHQtc5W4","sender_id":"testnet"},{"type":"transaction","transaction_hash":"3Uch9NHR7mnn22z8m5BDHDsUy4e9Mk4HXhJtbUvQ4zgf","sender_id":"testnet"},{"type":"transaction","transaction_hash":"5sAJ8Qn94Br88iyPzTXfv3MkJmWiDE414xS4QkDYbX3S","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"J5nXqeDUSnQV5fEgGZ4iKhhk7MohY38KU1ncmfiAFefR","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"FFrQeU4M5BU4QHskn7Te8BGm6b23CQAzr3FQ7TYEMBQY","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"HBXDGpCNEktzjcmPCfQg34xtvc6yViKVcnGhBG8fLHop","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"HLGkf2h4BC6Srg1URuuJPMEHtUTkV5FSjQDZV7V7xN2n","receiver_id":"testnet"},{"type":"receipt","receipt_id":"598R2twzFfaEUPY8uv98cKfwiHasVCCMc6CP3woNC9Ez","receiver_id":"testnet"},{"type":"transaction","transaction_hash":"EVNPe8qmmomLWtyCDS2452iRRQo91ak1SxSXQLQj6XkX","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"A9CaAnLQfidVrd5nksxY5uNPbt7BuhwWZJY7fGwh64s9","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"6nCpQVeeRkkPnScnkwo2vXXejMkQQSCvLnZ7bZLXn8NA","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"DdDtXNbGQbRezY8djR8gxwWsXa9hgdmv1944iJBmAubQ","receiver_id":"dev-1705307819106-47174631681836"},{"type":"receipt","receipt_id":"EuzLNbGzgQ9D8kSNbtVfgov4RMcidv4qn2Wcuq231TY4","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"DqMkLSwtcDoUzAXnWSZzSsFDaLHeCQdNNZvAM5U8hYWe","receiver_id":"dev-1705307819128-59250772899611"},{"type":"receipt","receipt_id":"AVQ2ppbLa2aL4R1MKRjdLccNLJFkenvXUPSqUYJDcru8","receiver_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"CNxbsXJDmAihj57K7TQRjYvTnWASSTtiH58SjpLCM9eg","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"9Tw4px4WjJiUmzaaigCCazsdpWsJwgjD6xZc5vLaAWkU","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"986FvtMCBFKHAVB2eTyEty5PVXn41UU4oY2gHzsvx2Ey","sender_id":"testnet"},{"type":"transaction","transaction_hash":"oCA7UT3eRKLPmo5TKf2EuMnzvzGULS6npo9vqsHBuMJ","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"SnZ8phAZJefoaHW1XzsegCWXDZt6HX8rGArmJkRW4Kd","sender_id":"testnet"},{"type":"receipt","receipt_id":"EepTkM2QN26W5KoU4bN7d7wqDouMVVm3cwpiwpt4sbd9","receiver_id":"49qzzuam1rde.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"92vXrLaBHaYsL8HBqCnRo2UGWJv6R7PX8wFsn5sVWWDp","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"5BFW9fo92pkgWVqTtJ1nmgthFcwoJQX3TTy4JvTzfAhu","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"2pkFMJHXc9koakvkxVXf8hodMDNvgxMkSzHEUZeCxGxm","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"EztUUum7dkfTbBE6XM5CQedgWKqW176YjAK9UwLgic6n","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"564Ahf25aayQBAGVjp19tuVKhGbCNt28aCDwdE8dZMd2","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"6kXiES6ahyF25FVx3VuzkCfk9SWw3aRbCT8B7NpZ4bkc","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8ihpbidzX7EhvUQwU3RG9CQqh6Ljx7iApfVpd2Sbcmr1","receiver_id":"oracle-2.testnet"},{"type":"transaction","transaction_hash":"3AGm6kjAgQLPYnkY2eX5DKeSmqLK8DY1qakikpBonKBD","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"7B8nTRTQaMF9wHSqETnqjcJwVeNLMJMmFPLGbUvAsroW","receiver_id":"priceoracle.testnet"},{"type":"receipt","receipt_id":"4Y3S8EFJT7rTE75jF6ZmgMTgHbBuTsKdWjTUmc3U9mKy","receiver_id":"arkana-buidl-asia.testnet"},{"type":"transaction","transaction_hash":"96q6uSCNgEWJD4xkeXeABDYESMH6YBkeMqccKb2rC35X","sender_id":"oracle-2.testnet"},{"type":"receipt","receipt_id":"E7H9UYJ2H9DMFrfVKU5d5zZXvCSjk3EYdkKjWZR4kLBc","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"CaYPiDMcE1M3sxfnAmVoHgSUburAwhZkUj8e1ABJedNN","receiver_id":"arkana-buidl-asia.testnet"},{"type":"receipt","receipt_id":"HopCmFzcpkx4YU6T4DTEQXKebR5PdfrJ4ykrJPrvqtx5","receiver_id":"wrap.testnet"},{"type":"receipt","receipt_id":"EdYWaJrCc9oKUCPwxdQkv5Y9vwepc2tHrfyjkUEdLmzX","receiver_id":"fzg8m1vhpju6.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8wX57YEkzVB45sr5o24ZEZCA6BnKksoseosZsA48wksr","receiver_id":"dev-1702349001521-56718665013362"},{"type":"receipt","receipt_id":"5bheCkXHfZ5aBxYaH7DoNwJ1yiF5atakWpkdAm248A4G","receiver_id":"wrap.testnet"},{"type":"receipt","receipt_id":"8QMWsRqoHA2Q3Zs8pQTrom9P8iqMTuUhHYcYpxYHtGBn","receiver_id":"arkana-buidl-asia.testnet"},{"type":"receipt","receipt_id":"6ZJyTfd9DMpT31tNYmorkA9w1JidTArP2VhthqwqPJJ7","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"3KViRVMdUyakQJjWfDiRRBiTReCjwyjvqY4R2BnEBvhK","receiver_id":"wrap.testnet"},{"type":"receipt","receipt_id":"7iEYSk1RiCPwLajKY2DF9DsN9DV1KNGKb6J5PbeWjVBr","receiver_id":"arkana-buidl-asia.testnet"},{"type":"receipt","receipt_id":"ESaVAW8EPMaCxEat2XcY7Gz9tg6szaaq3d8fc7Js4aAy","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"HgBjVrZjrQWKvrZFdYaAY2TibTnFwXyhjHSGvCY4kKMw","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"DYp3ViETt8c2hxDdbYNwv75bQou9yHfFj1bQGwFaGtoS","receiver_id":"full-pagebacker2076287.arkana-buidl-asia.testnet"},{"type":"transaction","transaction_hash":"6CoYgGovA9w78EzpkqK4KjFeHz1X8BfGsxDdyADwWTbj","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"3nvsbHVVW5hyyCWdkQqZQbMjWjTGB39yrMCtYoE3bDUR","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"DroDMfXYZBiKECFBWrLvTRCNDYuNsiDFrVTkeb7otRF9","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"Ff4nrX1Evb79rH8TbSH7VXo6fqj9YgB4GiUqrejn8LoH","receiver_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"5C2S32Uy4qWZrCXDxRNWpt7ndS5JkGMjXv9C485c3wFQ","sender_id":"arkana-buidl-asia.testnet"},{"type":"receipt","receipt_id":"4J7zpDxEtDRPdLeM3sge2Q8x6Dpv2B9cibf2somzgVxd","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"CcgGoWVS4zE9yqPZR17PyyZPkaHznjhE63X9XdPVs3tY","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"FpGnkhoeiUAwZYiS34qw1EjVCtBHUbt9XgFWv6xiGbm4","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"H1Khr5zmULB1BfUEzcEPtmkGZXHuSCXG3zs2TpibRjZ1","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"BmgjGZM5DT4kN1tthvu4oFdoULUpPkWsdfrthj7zDwYn","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"G7fqA2LYSgZsz9Vz9RvUjoH2n6c7isRiHDcmb1sMJnuN","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"5ZNLB1LXoEJ6n92mGFQg5WjkAtBMMnPsoTLJWbAv6s3z","sender_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"Ddewf2yopnchebA5JsSKQArKqZH482k23rrZiG8DcPoB","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"Ah74AMdsJRe2b9mmswWSXCdqkApywWXNdD3n4MJMixbN","receiver_id":"bhc8521.testnet"},{"type":"receipt","receipt_id":"BhPLjed2d4pUuVx2Xaeks4WdXbUimeV74CDwW6ZCfdAg","receiver_id":"staking.bhc8521.testnet"},{"type":"transaction","transaction_hash":"31iNM4tXMuUBLqtAN52xTsB2XX4ApGmGVceJAu63J4ns","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8LpPuro1PYRh8T5MUaWivCuMSHrwqZQmQLTvE835Vg3T","receiver_id":"testnet"},{"type":"transaction","transaction_hash":"BZ4rtTLazCRRpwEfg21GwQduCCjvz8hJ63SHpUkHoCGX","sender_id":"bhc8521.testnet"},{"type":"receipt","receipt_id":"AKZtWyTSVwUg8an4bjD5FWkEMCCmdGHGssDsmrHnzLJt","receiver_id":"testnet"},{"type":"receipt","receipt_id":"9UGAYfQw9DPHJDJyhcxMrfjwsFykDfxaNSkmaMBjizXA","receiver_id":"dev-1705307805064-79489375308037"},{"type":"receipt","receipt_id":"9Ce2bDCB6amKY85VTcmvYJtAzxDZWC5tTWXZTfRFk356","receiver_id":"relay.aurora"},{"type":"receipt","receipt_id":"DHoKDshQ6suGxNomNVqoFX9PjeQxUJ8gEs4WdXTu6BX1","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"BLLkf94F4WVJg266Daa6PhjwrowER2W5P6u5fh3jFjc1","receiver_id":"dev-1705307805076-31477167337320"},{"type":"transaction","transaction_hash":"Hq9NuBQAVN6xYFtaTTCPiudKhUxuT9AuPPcCSKZxqf4v","sender_id":"testnet"},{"type":"receipt","receipt_id":"BYsMdrSRva7kBKjvfydt3sTwkNpGThg9NWwVPqmr4iTr","receiver_id":"fr312vodm1sg.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"ECDge6FPWD2Qerr8gCbpg5MN17tsYQ9Y3Bt5y3NuDg3s","receiver_id":"aurora"},{"type":"transaction","transaction_hash":"HTU2ozC56PTXuUfEpqnKc31TdfszC9LxNartTFtRYG95","sender_id":"testnet"},{"type":"transaction","transaction_hash":"E932KryZP8eVgQfrQgBjMVeg1GhWCeEAgpnFkRrksHpH","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"8TdTuvki4Ry3GDr2RJ3XHbvrUQp3YppmMzUsaJrsHfLo","sender_id":"relay.aurora"},{"type":"receipt","receipt_id":"BqdXUrprC1amV6xxk4DDYoDyTSg2UyxCJssxfa7GmDv9","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"44TrM1g8tqryk7Gbs8yz7PBir9DRENpsQPMNGLVfzCMj","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8mzq49akkpBZ5traqvZiGF7XFBvdwZ2nkNarHJnSTcgE","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"DhWvMNKqiS7wkJBFWGVjmExt6KytRh4PnR8msV6oREhL","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"4vHHJsxxyEz7yWDFAnhqEy41r1VaQPkQiCDTrjjJE3Jp","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"8nc3XMMBdgrGMXJizQTiGWTHM8MosFeafCnCFUEBdXT2","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"H2gEMQnXqEroe24vc1eA2oayZdpN1k7txNRQyLDgyuTi","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"6vnhzsfiwirgwwure8wbQuD3hg6RRb9Vi8EmS27D5rVV","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"4MwtErZ3kjrMHujSzdcWWbjmiLRWzJLPESB54vh4Z7cM","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"Bsnf8XhZWBujYXGbwycQydc8QVECSnvafeN74Vapq9h1","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"44RvZxZWpWBuV5GKXbbTSJB2tgSbC7RrSDThPBYGhxt4","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"CnqqHKDNV61tR2h4djp2RBvAG4oYBEZy1Y2UA6yZdfb2","receiver_id":"hyjndcqmxppl.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"62CMjXc1mhEj51ierVCtDjhVdq5wtkQGGNMh1crvSV3","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"2r2gTYDnSY7P7yVPRAx9sMvGWr1NStQHSEzHeMcvvmDo","receiver_id":"asset-manager.orderly.testnet"},{"type":"transaction","transaction_hash":"As8vMm97JkrDRMKk4NX6PdEcFCaR2DZwf5SATw5FadnA","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"38mA1vScktN33RwGrWkANQ7ZgpSCUrRynuEjBzuVcWGw","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"APpphs1A9XHaQ33QAJdvLiAcGjsPvwWj6GbxUCnHRvQd","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"9XbCKkxSXFXVPn2ipc9A92g2DQTsVisS21JZn2WgefJw","sender_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"3L9YAtehP3tHZKhDw7VXjrQ6KppDLNfd8u5WGnFqpwji","receiver_id":"testnet"},{"type":"receipt","receipt_id":"FryEVdwXXTT5rgVu88CgeANf7nPe5vkpZ795ZKh85x37","receiver_id":"testnet"},{"type":"receipt","receipt_id":"2rMpezkwJonFr8XC5aWRpGmaCkY65z1EXGLHLhvs4XzH","receiver_id":"zavodil.testnet"},{"type":"receipt","receipt_id":"HbsaFopRaA5ubsXgJsxo4saA2rFRnhE9uybyyQFvCKkX","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"5VMnAyzmGPYq2ukCP9tpFfe39qK625DameZwqSpk1fDu","receiver_id":"dev-1705307798949-31444104784078"},{"type":"receipt","receipt_id":"36XGDpDzFJKLNRtozmViF4zg85ULjfJcdgYEHUbTMVpJ","receiver_id":"dev-1705307798965-79857125077397"},{"type":"receipt","receipt_id":"CG9aeyULTp1gHYz9q2DRRZxHhejr51cEP55EDqH2M9FS","receiver_id":"priceoracle.testnet"},{"type":"receipt","receipt_id":"FbTwYwoqeihci8FeLNaHwuwFqpuDESz6xfVvarTPgAgu","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"27tFPK2fmxeTeKhu15bM4yJXXNqFZ8msSkT7UQ1pPS5T","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"9NePxdVcTM65MpREEDtBA6gf5TeX4nCrEs3irAQYGifF","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"81LUyKYqEoxi8WnZrE3wwJjeRrfXpsY21mTL583QmoMF","receiver_id":"nico111.testnet"},{"type":"transaction","transaction_hash":"Cv2tnHsn2SyDAZniDYD4N2DHb9NmTvNNwCRAppob558x","sender_id":"testnet"},{"type":"transaction","transaction_hash":"Bo7AyzVpsVtwtdCgwFPpFSYu8uQV15GV1WpuSkUtYCKd","sender_id":"testnet"},{"type":"transaction","transaction_hash":"J4VMwmPXZusEVzHYk5zveTSwnWAj2LiqqPvavfgz3Lrr","sender_id":"zavodil.testnet"},{"type":"transaction","transaction_hash":"HjKbptwP7jB8WEnt734yKiLnpKD1HzcarHgwVQngRpHU","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"ABB5rMfvZEqytWRUtZ3wpp4ikTW8UPHt1sgujcVA6sNn","receiver_id":"nico111.testnet"},{"type":"receipt","receipt_id":"5t2w2eiKweYLomcvHaohoKVjbRojGzBmwHVfQrZpALDk","receiver_id":"nico111.testnet"},{"type":"transaction","transaction_hash":"91NgYQuDLKRkfysKziQuXxu5Br5LDiPaqVd55ne7ZHa3","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"2mK8penEpmZKyij3EY5yQ17tLQbSmSbKKWz5uPeVf6Kb","receiver_id":"exchange.ref-dev.testnet"},{"type":"transaction","transaction_hash":"6aEt9mWx3BmbwRyNGrFT9vLrWEURuRiUq6rGnJteL8We","sender_id":"nico111.testnet"},{"type":"receipt","receipt_id":"EjbxKY5nVaJMp6iR6SNhX2WL1DYGLtHxTGN98tjbASaJ","receiver_id":"applebear.testnet"},{"type":"receipt","receipt_id":"HhhmnbAamoiycfXwemk25cynHNbP2Lsbsutr1arNyBrc","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"J2uSaeh65izgiwMtB9EW8j94bHgWaCcSmPkS81vyPNsy","receiver_id":"rkytkftle0ys.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"6C23bBzSnRSJkVm369H4azZ64DXFwGVQjBdnTsApFcHS","sender_id":"temp-1705307791079.testnet"},{"type":"transaction","transaction_hash":"H97cg3M3JKaScfs74CDcVrU5po2M6jgSRcRzM7sqsphp","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"J2n1Xn7HsL7sxLEJtQjuLduHSmMv6yQi65UobBu9pYSp","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"Ca5zaaV7uNAKK93ydixMEu22UjGNB6Ajph5yc6sTvkK5","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"3S4NnViwPkAg1SjRGbggsqk5vQrSRVUwSH4kRkquZmCw","receiver_id":"nico111.testnet"},{"type":"receipt","receipt_id":"6JZgWaQvZN1FgbgahtCeWtbHu9wv2yUuzfoEym1rXjqr","receiver_id":"testnet"},{"type":"receipt","receipt_id":"2shX5MX3iEVZQ7wkaprw7rd3aAq94Fpf3MhyuZkWLe3f","receiver_id":"nico111.testnet"},{"type":"receipt","receipt_id":"47ZjC98yjzakyGcRJi3qTcwGLiStVGzYAmBx9gm6d2a1","receiver_id":"usdc.fakes.testnet"},{"type":"receipt","receipt_id":"9axUnmMM4nsdPsGt7SSP3ZqLhpR8ssxHzKCuJXTu4kLv","receiver_id":"temp-1705307791079.testnet"},{"type":"receipt","receipt_id":"7mEqPE1MeGy46tYkYNQemMYiFNhGqJrMbvRVewi1NFc6","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"8Bd5EkrT2o5dfD6oDvcytrD4SkeiVFG8R2vZAAr9Bcny","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"2KJmK42QikiY41zVPHfhTnwm2Lxo3XUBcwAuraHxZLya","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"Hug3DKE9jwhqNd1Duys6iQSDvrfcoVBRKiDiLvayLQRp","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"6a3DLhDC2crMngFdkET1C3Ufxg2g8rShU9qEVEoCm91i","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"8x6R36XJBpNc9YN8vdGF4WPjXJv8p6gNXeBEwRyquwNq","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"3R6XUecZqj7iwdKQnVeTfcmyZW3UoNL8ULuGmENm2rDN","receiver_id":"exchange.ref-dev.testnet"},{"type":"receipt","receipt_id":"7UifWEijLb7kcpve2MMxhbZdDcJyocSqxeB7J6H9AxjV","receiver_id":"usdc.fakes.testnet"},{"type":"receipt","receipt_id":"EgMK7mCt2QCsx7qpe42tztSn1re3dwnJAA9Y5dD5fg9h","receiver_id":"nico111.testnet"},{"type":"transaction","transaction_hash":"3KtkAJr1kxgJGY2BoDhzjC8Kzf5uW44RMkhhcgho54BM","sender_id":"testnet"},{"type":"receipt","receipt_id":"5Xk7fBpz6ADAp9U3aeQZZ4N881iAxfwLfJ8NDxzw5TFu","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"6XbaTtrawA7Co3EGnQ4Z8JdWW3QS1SRMSeHA8BWkmbwr","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"B5AJrY9esXaXg7DN9LxBciisifXLsaiSmbtbCA4QyQMo","receiver_id":"usdc.fakes.testnet"},{"type":"receipt","receipt_id":"77risbi2vZCpGvekhmvau767wFHCHBv1zdYmvbvgYU1a","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"8pcFgzSeH4ukNfY4WuS3YpuqbowdikcnFqG9ZPTpHHLZ","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"HfHpwDwh1vsm9jWwWDpecz4Y1ACRJdi2bBeHEpJZgE5D","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"6QFZdL2DhaeujKdvVdsmxLge9UBJekU9ZAB8rtPmiL6w","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"BzqFV34ybLugKYpMrQvKH61qFxgaWAih28CvEwsf9U62","sender_id":"nico111.testnet"},{"type":"transaction","transaction_hash":"DnSs3zfKU5otLyUuEZAUDLtq8RqHno4MZktZbFXZ4N5j","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"CrDxXz1oG8HkS8gYPj9T16HFwNSSsX3eFeY1MNp3gQEP","receiver_id":"applebear.testnet"},{"type":"receipt","receipt_id":"FMNYwCMPiYmhwVqKtj8Xov9dDGvNMGe3tA4dN5KgNtK5","receiver_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"bMtjZage7MXyZCpYjRNcgH8ywMGAsTDCuuLubLUtHtv","sender_id":"temp-1705307785575.testnet"},{"type":"receipt","receipt_id":"AaCgjGwraHxc7PTbXZTi5oNrnzEiFjkTeZY6ZXY5dxJW","receiver_id":"61ms34eq1y42.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"DyD4D5p34KV8XLZnfrcKZhfGVAXTMTBaM2bpBUj4eGK6","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"6VvbXspgFK8aUhzpcotmhhnv3L9ke5W5uREXbx4YjtPn","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"2VvBLPzDseWnSyj98E7CCr7ZE9BZnSLEek4wj6sTH3qx","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"9BjR4jSHw68UT2gDkyyeaUYsijvwRMp5GuZx4132acxb","receiver_id":"testnet"},{"type":"receipt","receipt_id":"HMdanLQPNhXQ8fwRKEEecPd11FrwzccBqYuREwXFbPUk","receiver_id":"serburberibar.testnet"},{"type":"receipt","receipt_id":"E7tog5sHCv7uZU24YaJSxuALmMwfhh5sXWZkbT38ajsz","receiver_id":"temp-1705307785575.testnet"},{"type":"transaction","transaction_hash":"8GqxHMnTT8GWZ7qE8jWnU7NgAQTphvXsgxCGjwfXk4sn","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"HQUgjVjwiT2iiUYb9gs7KLX3GkxMkUgrVbkQHtmNXoBw","receiver_id":"dev-1700181646813-30367561749085"},{"type":"transaction","transaction_hash":"Bj9v56mNwpSA8es6EDvnZHXfiEtsQAwGoJ3azV3N6qvV","sender_id":"testnet"},{"type":"receipt","receipt_id":"FeX7gmMTmdf3YcsjnYNZ8Eoa4Gbot4kME6mzNq2x9FNe","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"66qqnDyFf167i2w3SA7QnhmX5qTmuMxGwcGdWHJBcaec","sender_id":"serburberibar.testnet"},{"type":"receipt","receipt_id":"2fefgiS7JmLqKjtbHctxG1CAVSmhMfwoCwEDgo5SsDDq","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"Gku7G9pfr32zNRg6e3u2WCAjKsWVT8geFQvKHqPafe34","receiver_id":"applebear.testnet"},{"type":"transaction","transaction_hash":"HnUrGDgpDNAxNxcU2gtHKgfereh5o2FSn6wLEHrKL9mm","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"AyMKZyHaGf9bJxn7MmygXkuxKBSHZunR2MqxbjuRUXm","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"D7w1R1NKgPFhRxWz1fGWNKDPLq6EF4oFrzCkKH68Z8ET","sender_id":"temp-1705307779565.testnet"},{"type":"receipt","receipt_id":"CAPZ5XG9yKZ6AG8Xikrzj9Mbp5uHZqahgHAe5QuV4rKg","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"2ix2geQJajQps2f4jXEpJEqQhb3fbvRDLr7K4ti4biK5","receiver_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"3koYJD3zCj7dpfo6ey8oDc2wS4Vky7CDsCwjepAAgKzY","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"DBNrcrxM7s569b5SNAfXSAJ3gCy1e7f7qcj6wTTLzHgh","receiver_id":"l0buc6lh26h2.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8ftt4CXpmbW3bAMqn6iLEQGwtzDqDW1cGU5NUpLTtk4J","receiver_id":"testnet"},{"type":"receipt","receipt_id":"2tqVdmq1hjPKi4ajkkayCVKevX3oE9cywX18ikLTUdUE","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"2tdVkSkKWM5JxWKPzgYrvLApWNw36hHjJNg4A4m2DaKB","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"71DwMyAnsiT1mVgsZH9MptrxqzfT8koiZCNyBtsGJVWr","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"Eh7cMZ7xaso7p5qsFDDCmQGznSGUVPnefLRky21ioNR2","receiver_id":"temp-1705307779565.testnet"},{"type":"transaction","transaction_hash":"9XGvNFPCSyGhCmHn3gU38fy5M5K6SkWe8wFnPSSgJm6","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"7kpFaqoo677FTc2vLCEYMsLqowWWJZA723ojW7wKvYV1","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"2gJ2myK3khzu6MNASoksg5VeuSTNHDexQVQaZwk94886","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"Gg5aKWQYuRWbmND1cfRDvYYBhCABhNzjBXJCuNS5AyPo","receiver_id":"asset-manager.orderly.testnet"},{"type":"transaction","transaction_hash":"9TBgWyzjT18Xkr255GXvvSP5sNDvn8rnsjWrwBZiK3Mv","sender_id":"testnet"},{"type":"transaction","transaction_hash":"GyEdA3Bf9Q4zfuUUDPPhA5WuKxiHKNc7H8VrBQVDmJiH","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"ECh3QyN5s9aJFhaM7CkVAP5PfneQ5KYPkvR1LzL7hotH","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"2XzgM7NpgZLYZXXrqm83uDEQYcBwzJvt1naFpTces6iq","sender_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"Fwg3S36jQgABh11j3NAdHkkfR4rjMLEPwm7GzR1eXe6e","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"EAC1hmzTmy72uZ5NjazWPMLL1VdutXvUQYyf242LkT7W","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"Bk4F1vMqayj9Q2wMVAtNFwL4dFCZnngGkyfaHwHw5epK","receiver_id":"relay.aurora"},{"type":"receipt","receipt_id":"4xijxh7YqCLLDkX357K3PxSFBJyiHEtmxVt6UezEbwWE","receiver_id":"applebear.testnet"},{"type":"receipt","receipt_id":"8ybdiKMhC2HpKVYWUJNSkSng3h6y1Dec6GRcmmmNa9NL","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"39FpHuTjNnQN6NNd93Ez1irwqHC4vFe29GYX9z2M7sd6","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"JBXzeBCYNnqUgyZhcFYG8DhMro7C9hUL99adMRNZpbdt","receiver_id":"aurora"},{"type":"receipt","receipt_id":"AnMRY2nLS851YvPsnJTKGPZBixiGpJwyqHzvF1aP9e9Q","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"9WBwzvC3JgEh4mmYh8BZDoowkzgwL7owiA6jhicLD21t","sender_id":"temp-1705307774087.testnet"},{"type":"transaction","transaction_hash":"9UUSSjSDarZN84b3i5831ETCCSrVxUA3Ub1EJNMsUP1U","sender_id":"relay.aurora"},{"type":"transaction","transaction_hash":"BRs62S8puKmHfCLiDeLcwBW4jKumAcYUDwprNiST2S8t","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"B8DQJfk7rfSQwLzWVFobmJPDRaHbWVd15CtVL7vWqmvk","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"2cDqqMSSAJ7khpGmHJcSikim9XsoGbcBUr5Rw2xLWpfZ","receiver_id":"lqykp8mqr904.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"9TwhFdUfBBtDShmCoeZeW6XMXrmWJMmhqWFgJ7yFivEy","receiver_id":"testnet"},{"type":"receipt","receipt_id":"4De7XSQ4tyJgJ7rMoi4d2FAWQSX2ArQWUqwqJZ8kmQzF","receiver_id":"temp-1705307774087.testnet"},{"type":"transaction","transaction_hash":"DvwWAH7bwhWoHiV5XrV1N9rbtGyCbwyJeNCFNF6Yfhkz","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"HKV5zAoj4ZJXATFXBrAaSiKY8q8AEvuCHh2oMxxKjbyV","sender_id":"testnet"},{"type":"receipt","receipt_id":"823eM34ytTQyR3V1wr8D3fMrmJw8tQ7itnwTtA5egMMu","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"7iqyZTricahutiafpUsVwdNpNGhsq7evVjqDcd3AKG8z","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"AkUdoXJ13wQbLj9NRdNwWhG9LvMxiWJMgpaHfCcB5SvH","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"CM2LqLip8neNbXFtRgjoqvSjETWN3rmn6WFmyjBLcCbQ","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"9TfeQa4g8BPnQiyRgmNbDK6hwXzzpa3Hd2J8sSKRk4JR","receiver_id":"applebear.testnet"},{"type":"transaction","transaction_hash":"68MfAYbrnxMQ51iqHG8p4DLjHVzoFzGsmnZhmGcFuHrN","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"9qpoJPRcBE5Tbnhc7hptS9UDmxwMuxTejvKPPzur5Dud","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"J3XCo7Bxk1NSTg2tjexHZPejbvphYfgzhyAN7mUxZaLW","sender_id":"temp-1705307768570.testnet"},{"type":"receipt","receipt_id":"HQamKUb3Bu9sd4WuRrofE67SAxPniM3waYxMXt2poH5i","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"2fKG7CrYvqHj47SbMCkDVQn1R23Esd3jwiv7ZKAwS31o","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"CDWhWYyAwKCPp7Ese7tqaMw4dUShZSEH6CRBS36ERADr","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"AUBNyyKgpgrBLRJPgMNnQJZPzWauAehijw2JJfUqc86G","receiver_id":"bhc8521.testnet"},{"type":"receipt","receipt_id":"22vQ11NbSXe9LELKSy9jbDWhfD4NyKXvxLBtCFX52tHf","receiver_id":"staking.bhc8521.testnet"},{"type":"receipt","receipt_id":"4g4GFAtdxuQjUT5n8okdRo74wJvQtDyw8nad2cwmwujr","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"2WMKwdnmZEgsHD3sezg5gLazmqpofqUAq5kJ8SqT3Z3a","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"BcEw3zvEGHDVEfG1ewRPe55gMXPXbxQv9SRXpuDwQZTz","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"FGn4ocYtv66X1BPUmdhMyd84FHfCwmZbnuKTUgozs7mN","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"7x27JzEbU22oyMwo3HuWbb9eKwzjSS5VUkZULx5Mu9hq","receiver_id":"ttja473ppgmo.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"Dkp9G8VHMevv7P6M6UrT7AbW9rkcJmiFYXfbfYL7CaeA","receiver_id":"testnet"},{"type":"transaction","transaction_hash":"2YaZCwEuwLZjmM5DHvH6Ej3eh2pWA4vbPfs6CsP6Jruw","sender_id":"bhc8521.testnet"},{"type":"transaction","transaction_hash":"CJnsFX84688D8vuqyFxeoqKUn5899gLq5tQA9LhtnmJA","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"8va8nCmKbAW9zaTmoBJMQzQyaGDsBpiJyYfmZi9xyTvo","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"5sN6Bx6PZP5JKQGY8cKdnx9PxuahvxWTZ33FVpmctYrV","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"79d91Fg2wJrYoadNX78y13TmfLpC4ysFgwjQCGBSAMxd","receiver_id":"temp-1705307768570.testnet"},{"type":"transaction","transaction_hash":"LUWhDHLgTPypdsWQx6ZZWqwqjytgjRv7nMsPdv45uyX","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"7HXaDhcqy6HykFipoJmKajtfFonoBgRCrcDRBgjKPFq2","sender_id":"testnet"},{"type":"receipt","receipt_id":"3umPbf3mwhgyUHNCnACamcKKVUc64nenWGSVDjbbX4yk","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"9sueXbodHKd188y9jwj3TB8pwS8noiJ5rkqrjneDE49c","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"6YhuaCoA6AQre6UqPNZEw4NuCp77VZVZrb5ExWcLwtau","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8RuwEQK9yop4dYoT3kxrjLRCXaLVL2kx81N7C2bEXYTc","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"4GEfvjwsVa3MTogFAc8DXDcct9uscuD5SFMb4aiK4yqY","receiver_id":"applebear.testnet"},{"type":"transaction","transaction_hash":"zzhHC6gTHBFrRfMdPn5CBLtZDeQx5np6qvEn3GpgAfP","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"Bk7rRrnMqaCqvNREfcbdMXb9Dx8FAvumpMXq1Yp2HXwB","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"GSXj5MeUTtc2hNq36UUR7tJWaA83rGiTF22ZJRXvM5dF","sender_id":"temp-1705307763050.testnet"},{"type":"receipt","receipt_id":"7FvemErDZ4rcSR6UyDirs9qsCGFEDnXFEr5fr6Bcadnw","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"jjM7ECquudVPjmuM7adgC8qViJRvqaZ4GF7Vs1Vop4a","receiver_id":"testnet"},{"type":"receipt","receipt_id":"FwyU8uTxFnj68kW8qB8b9juV157Gj5pMQ3qKAXsYz9aQ","receiver_id":"temp-1705307763050.testnet"},{"type":"receipt","receipt_id":"Ahq7kCVUDxz1ZtfBJtEUhdjLy6i2WZ4969BuH3DyjRRa","receiver_id":"4y4e1nt68oji.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"5CL21jNbXXN9DpVzvfnTWkFVZUmoVRwHj9iPUmeL4waa","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"8fDS1fVpS9yT4YgfErqEGyM7CB6gDiaWcTYdC4CwasFe","sender_id":"testnet"},{"type":"transaction","transaction_hash":"GBsZ45z6LTbPQNt4dMaJtk3wM79f3DmY8hgB1L5ycVKh","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"TMbmjNecmrY6H3pFygxXyrAR9NCKQdwzQaKYnixuDqi","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"CJSTAfwG64nmdcfp9oa9o3N8QRKiByVzk1UQRKoTa5qE","receiver_id":"oracle-2.testnet"},{"type":"transaction","transaction_hash":"AumrEfXgM3gJSypJRq4HeCcXk5TKkJhY1rY7JNCTqSLV","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"91L5TBq6ZMFauFpsL9AqLev3wBe3o3nLoJryrn4PECVY","receiver_id":"priceoracle.testnet"},{"type":"receipt","receipt_id":"Gk6ZGirVY8rEDLNm1TsVh5Qj8Bs6HdEojqPfG3Ux9971","receiver_id":"applebear.testnet"},{"type":"receipt","receipt_id":"GMufFqSmDXhTCpYTh9m1bp2podT7tcwBsJQhHwM2z17X","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"DCJMbCJCMByQChr2n4WzyX3h71YGTtdJc4rQmiSA7eS6","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"3DFZwywW1pszEn5YkTW5ivYmk97mACHUR12FDPj8GCZB","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"4RzzPdcfE5o9frXrFCNu9TknRLXmyLAWCFLCXfJcSqYG","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"7wqBw4KjhMF6XHQus149dAJ6UrtGbjpBSKvNYwR9FPdK","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"J14gsFJM2BU6bmK2kd6CjkJT3FgjuP4WTn1ngHBAze6h","sender_id":"oracle-2.testnet"},{"type":"transaction","transaction_hash":"DPxyJvcfZDJRqtDGENaPUEtYP2iFY4tkfXBxkTDkpHEr","sender_id":"temp-1705307757533.testnet"},{"type":"receipt","receipt_id":"7xyytos6GckQz4nM9JGAA83uTT57AZJPPr3ro18BdNJb","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"3XbPeoyTcz8ZghD6L7dRcZV5S6PeDymegD8YNMj7qfzr","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"4FZ8j8H6pQcM25jHtQgpKPRfqFTwawyfRbAjPoMBuvxo","receiver_id":"asset-manager.orderly.testnet"},{"type":"transaction","transaction_hash":"BFbJnwnCtQJbA6SRqB92F6maEaLcfKWcN86HYJtq5dBV","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"7ijuPCvAjBx7zSpRkReEpWoaauR76EfaBsWgKWnw3qJt","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"9McQDTLvhCP35pNgA5awRwAnbK6dFah4ubSZogMtSADz","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"BgNYq8UcLS7VpCMd2L8PyPCVxvBXdxh6JoP48UxF6tzG","sender_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"FAykAPcQGQMQdEYvUEUQvY7u2B5DxeiFm4xDZ4g2suT","receiver_id":"testnet"},{"type":"receipt","receipt_id":"DUGXpzP71UWaS5VFvPWWBNZFogjBUyMEzRebKUqRzcfP","receiver_id":"temp-1705307757533.testnet"},{"type":"receipt","receipt_id":"BXybt7LNBpc7pzd2RVh5AVjiTfqa4cbMhxJZNiXQMz1b","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"4rYskvzQt3MirPphZ2FKSisNqRRUxZYo6FRunYTC6eHh","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"EyQEmNTMj6JhoaRtebH7MH6ZEpkUHnFxYNeqZDDeMPoD","sender_id":"testnet"},{"type":"receipt","receipt_id":"84G35SZcWZcYfWkVskuVwMw97sH6MASMhgJJYyM1zmF5","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"HZPc5jxj6LgHUeahWPnWLcdete3JEDG3WtUNpSSbZie1","receiver_id":"ehzs8rz8ddt8.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"2HXSeyyNBhhKFiGpgkxZpyYY7dkzesLEkturb8Wqgq3j","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"CFi9XtWFgRAxV16ZgX9VZ4NE5pEGTNnefbgNn7qJ2fjY","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"84WyHPKxtQhCrVVZbpNwgNhoV4kn6BmpZWtzXTAerg97","receiver_id":"applebear.testnet"},{"type":"transaction","transaction_hash":"7XDd5j9LvW1Lhxvd9SQjXAo29e2PXyAR53rQQgau773D","sender_id":"staking.bhc8521.testnet"},{"type":"transaction","transaction_hash":"BkBbie5MZLVxuAWm5Vfw6X2kypXjvUQrpNW3PJahpeQj","sender_id":"temp-1705307752525.testnet"},{"type":"receipt","receipt_id":"HqLNFKjFRmV7LccaiheFrckf9aG7ogKT1UGVwinCmGbp","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"B3pj5pT2mDovF7sCodoXzjFejQYdhvrknGGtvrok5yCp","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"GFPFo9vX87TaxDGsV4UrJuuU5F6qHpm2jvfiyYdM8UM1","receiver_id":"testnet"},{"type":"transaction","transaction_hash":"FhmzPxAqr5VHCdvK1K5Kema2uyDhJvMWquvZo6s5NiFy","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"4BguhWZF4i3XtJxyKXBQZbBsikdyicRJPtX7taUHsUhK","receiver_id":"temp-1705307752525.testnet"},{"type":"receipt","receipt_id":"5FZ2PT6Qg3GSM6BqhdU8hTeMuQLSmhpLyoqok9xaMDft","receiver_id":"s-lam1.testnet"},{"type":"receipt","receipt_id":"4o38cT9n6rGAv8yWXKNCQhxQZX5xdkaDEhCKHi8t1Vzk","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"CACWsqoJvJGkeMKsNqahocrLZ4UnUrJ1FX3sc5jJBGv2","receiver_id":"price-oracle-v1.nearlend-official.testnet"},{"type":"receipt","receipt_id":"EXNSBtTy5YjTVqwB1eFvzaKSWKhoekykrzvRjgK2529K","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"B1omhdomvoiSPrr1kMUUtwJVT5BtchRwMwNhiF6ZBTvB","sender_id":"testnet"},{"type":"receipt","receipt_id":"3ekMws3PbFgdHZyiEn6UBgeWNvvwdFKN6C3ugNUC156y","receiver_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"8yyuZDx3tZ23yto4DxjRv5jsh2iYc7qQexRRBi4CgZk1","sender_id":"s-lam1.testnet"},{"type":"transaction","transaction_hash":"Dhd9HvBPRJ8dYoUa1SnojEhRq2AuwY6766vNRVAykSSQ","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"4qRmaR5J686H75dcx2RarEBSZLzU5MFNvUDB5ZyAqEmb","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"EQKzBJSXNuj68F7SNvkcHUjZnkbS4EKJf83RPKQzGtCf","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"62pxMPj2qj3V29EVwuo6HjQf41MxwYmSP4aF1MNTh9tP","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"8zD9JBBWJdk6VuMqL8dsWPhocdv862TQsTw8mRafck7v","receiver_id":"ilvrjq2hv9ns.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"J9d5J3Eb7bY4nZj75vq8WuaGD9C8X9joJSSSi1hpdoug","receiver_id":"zavodil.testnet"},{"type":"receipt","receipt_id":"DvL4SD4mpQUc1Ux9bgZFmpPJhSBBZekCdgV2njnCzH86","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"J2stAKSLdLCiygjLwbGHczXckXdzXs2d7bMJ8btabjAn","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"DnAAVQg1fvqSAub9N7K3SwrAFB6A56iSkwtS9bpejjGB","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"65RxPUKpt9ecsKtcBbrMWyB7cw3Fw7WuGmjYV8c7Njpn","receiver_id":"priceoracle.testnet"},{"type":"receipt","receipt_id":"KxHZ9VD57joHnpcpZMtTwHVdECJPG525Fo6R1nsRjYj","receiver_id":"applebear.testnet"},{"type":"transaction","transaction_hash":"8CrgmdaBKCWfWadEWDJ5xMDBZZyeDraUkmsf39wpcsnu","sender_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"E1GyP8orNiBHTH71Y2HvKT7gbw5NU6PxVnZghMyCCZG1","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"9zNQYPSRYPD6BPcPKwerrsHWHEubEuY8boKKqCyC3tQg","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"HrJ5kKfG1aNb5gJ2pPzXzTVbwWhCYAYodvdyeqgJTs6N","sender_id":"temp-1705307745505.testnet"},{"type":"transaction","transaction_hash":"Go6hT8kDB3qcb2XS6rNtwGHASYp44Jt61vCP7Z2DrFqX","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"AaQTeza1wDJshtzxGCiqGmUFETbDmASB97R4kq5ZCbgS","sender_id":"zavodil.testnet"},{"type":"receipt","receipt_id":"5n1jXPHxLzrRtEcZKGGS2Uiwrjb6omXWxYjUL4NDsuap","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"CWqDmfn8C34wzH2ifjLCCs5G86UEnBxujXVVpL1FUnGb","receiver_id":"s-lam1.testnet"},{"type":"receipt","receipt_id":"4jsiX5ujgWQP4Ak5H9A6SYqPsDW5ZQZvomfgSpMLDn6v","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8aMRTJFUrQs6m5uL8zzgteKnVFrkbZcMEJ14C6X1Gvbn","receiver_id":"price-oracle-v1.nearlend-official.testnet"},{"type":"receipt","receipt_id":"82tVMBBJwF8Q3j2PPjiRJuxmJqDcStLzde8fxXHRMGN6","receiver_id":"relay.aurora"},{"type":"receipt","receipt_id":"3jCcaKswLFLcodHSbrb38twSmmhRFJUAQouUmvhrGsMi","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"5niRYcxG3yMgNmctjFABkrF1yAKwWL794wJSHdnwepme","receiver_id":"testnet"},{"type":"transaction","transaction_hash":"GhRhjvRxaRwJzwi3ak3pMpGs13HWdME1WoHyECja3qtz","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"DcSLpcKcRkQhCi93M6vZXGkDL3bziTWcLohegt7p7tZF","sender_id":"s-lam1.testnet"},{"type":"receipt","receipt_id":"4N853GZ1P8CuLCJ6j5PBuuiNwXzJpxP1bBDtk6AHfKwr","receiver_id":"relay.aurora"},{"type":"receipt","receipt_id":"GKqByK2wAHYEbJenRxkYheMpxwByM4NkvWZdfZerbQn8","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"9kePVBL6LdzFaxAahy5UnS2mxk4SnTKt1stBooe5Rdo","receiver_id":"temp-1705307745505.testnet"},{"type":"receipt","receipt_id":"HRcpQE1tURdkuNQDvbiPGda4AzvhRkrN4t5LNfghMtPA","receiver_id":"aurora"},{"type":"receipt","receipt_id":"AMRxi5sAfv6WTxqciiTpZ4vyqrqjKRfY8KbjcXLUzJub","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"DTQDzMVyFx5W6LU9STz7c8re5W6Nqv1YhsasNAnzAkTN","receiver_id":"aurora"},{"type":"transaction","transaction_hash":"G4Bh5vMco2NjdhWKp49k2FduWcur34hZ6HH2hRaUKCw7","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"xkzuJAMkAVPUi1vwuKovjVADS2KaW8QjHw62oBx6wGH","sender_id":"testnet"},{"type":"transaction","transaction_hash":"GeG2C8LkZFj6Pn4uyGnc3e3ZmbVGC9Cgrp2Yf2U6svyV","sender_id":"relay.aurora"},{"type":"receipt","receipt_id":"7Twnb975W8R6CKVEWegrhi1JGHydR5zmzydR1fP6Pda7","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"transaction","transaction_hash":"CKVfpWPV3QQiJ5wfQdjsNpwchqA3jUtZUG2qDpMvqW4","sender_id":"relay.aurora"},{"type":"receipt","receipt_id":"CRqM5tuz9hcmFhkSpeoT4rn9d68QP7GuQonhhDwH7YJY","receiver_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"HjGHb5iTzWQ2oUqM4UFuRJmija2rxGQYiJGcirDiq5UJ","receiver_id":"bhc8521.testnet"},{"type":"transaction","transaction_hash":"97uTVfZKxPMadP5RWjgKeTja5qDiiWKyyjFuqhyruk9Z","sender_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"EocTbZdsT6mfWJgXHEN3S1BdBzRWmNYPUZaxhtw6cBS9","receiver_id":"staking.bhc8521.testnet"},{"type":"receipt","receipt_id":"8PV12EPHocJg7WtNaUNU8LATDi29bDZpX4gAGWGn3fzb","receiver_id":"wi2zj8a44ww9.users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"GoJ93V2GQRAuGQYW1uKzhQqrz4UKnbTVh7X5UD3k3rJR","sender_id":"bhc8521.testnet"},{"type":"transaction","transaction_hash":"672tcEtJCDdMDvZbH1Gz81piNDQvRwBhmEjjtvHzkoUz","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"2c8Fyu9H7ihjxYaEM78EzC68CeN2TC6euimjRsQBdLD2","receiver_id":"applebear.testnet"},{"type":"receipt","receipt_id":"AUgHY84ypiaA356cQQwJxPdDXJ5nyezYSep6rjCKogRq","receiver_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"C44CMoXmqpKdRZwPbjgzXCBZzfvpPewPi5wAHpxr1v9H","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"7akzoWwP6Kxnk3wCzMaKiYWnFwwoeFATXMYo61DkwWHZ","receiver_id":"comicdeer.testnet"},{"type":"transaction","transaction_hash":"GenuEHkF8LehYoZyYXg4575JxCbDfPVsH376URGWpb54","sender_id":"temp-1705307739983.testnet"},{"type":"receipt","receipt_id":"31UhY8whxQut1jzhbc79M37A1NY7YirNHNnZGMVDXVjF","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"AeaoBWLmbr4qwvRE4V71pEv1gx3Qbip8nqW4fj61Kczv","sender_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"6wCb1fvmR16CyUDE7ehnVh23VGQBkYp16RWfgd2aqgy","sender_id":"temp-1705307739377.testnet"},{"type":"receipt","receipt_id":"HbLpDaQS36oij4YpMWxQTfLbQFH3Cf6oQ5EjLfRnn2Ga","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"DPE2WfQ9MG3Ejr7sppNTTgYzwyqGLEfpgNhJfxS2LjjV","receiver_id":"testnet"},{"type":"transaction","transaction_hash":"Dg8GFhanR27tJA24EC9y7knWuJLmsSLfi615vsKizRQM","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"3UPPVspH68a79hdi9HwbxH3yKrbCTztmLiakSfrwVjAe","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"AziRTxKMqC4E1Wn63B1QdCrCTzddRs173tNZx6pRkSau","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"GPDR68TDMnZ9ufYzBMKoptpozb8gi8E7rASSwb8woZGw","receiver_id":"temp-1705307739983.testnet"},{"type":"receipt","receipt_id":"Dfihs3YB8iUEvMTuRGmzQtN5jM7fTfR7NJRBUG4kbiEg","receiver_id":"testnet"},{"type":"receipt","receipt_id":"EFdUNSmV1izaLZrvZRnsGkJSwAdUXPNi3poxe8pxEZnZ","receiver_id":"temp-1705307739377.testnet"},{"type":"receipt","receipt_id":"H2W49UqNusj5HmacN6zkSHmzM2NRQ4YZZR4NBtYWFpyR","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"43c13ha3WLKq8KY313QS7zFsJrTz1FcNhfo3dauPuPut","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"569ivh78HtkNzMtAwV9nrZcw52KRLavKomeEHf5PFvwP","sender_id":"testnet"},{"type":"receipt","receipt_id":"Ea9uzwJbiVku4iLgttb9jBpDP3h2eu5bLkznRyQRACxG","receiver_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"AGXGwswvaL2j3ZR5EzdKoL9o3vn3zxwu4nvof7ewwW87","sender_id":"testnet"},{"type":"transaction","transaction_hash":"5NuxFavFcXuQBy94VBaQ3hPhuEneeoG7ouEgqwCDrBty","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"GsgohZDa1G7oL4we5NreYcWdaGEPpYsDuKXH4eDPKvGX","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"29misn96KZENH7LiFouVME9xoMdTjEkP3yrTAFwQxsvq","receiver_id":"klbswp0a1vx8.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8xDaH77bash1UYfGnEehC3hJQiL3AXbx8E3HqS9zLbTD","receiver_id":"applebear.testnet"},{"type":"transaction","transaction_hash":"J1UxZyLEqwbdBcbeUUvsC6c1LiqE1XRnnCwi7kh8bNno","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"E6x1wD66F21qfb2cirDrBFCGCuvVBkWdwLBPZGHkXqkk","receiver_id":"comicdeer.testnet"},{"type":"transaction","transaction_hash":"63oedx7DyoC3Go3Moh1GoCtumt8jCjAoegcQu4LiohXh","sender_id":"temp-1705307734894.testnet"},{"type":"transaction","transaction_hash":"8ketL1ZE7JZnxQQk6PHm832kxvo5mYmxvjJeJGqHUJe8","sender_id":"temp-1705307734347.testnet"},{"type":"receipt","receipt_id":"HGnmfz15V5V13V3ggPbfJXFURM2VApYDEDqmrQ7k8dnP","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"7pZGBfeVq3ipGjB2yumpWpg71x87b28tLjHiiQvHkzFb","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"2LzQai317mSFL9WH3RVGpZ3Q6a4aW1N6YzPoGTuPUJNk","receiver_id":"testnet"},{"type":"receipt","receipt_id":"DQxrJdHSKMMp7SggYX8NboHZAoLfzpZWz1hRvcwDD5UB","receiver_id":"temp-1705307734894.testnet"},{"type":"receipt","receipt_id":"ET94UwU3piYVZiEjEJndj5bod9fzm2AVuMBzCbWSWMLZ","receiver_id":"testnet"},{"type":"transaction","transaction_hash":"75jRwwtXiHqEBJryDjsnmPJ4sYQdNS5TPHU9WVxgNTgf","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"EGjCXPSdKCgPZsWw9A5CshcgQHJk7jaYFGaTAEEbnoqs","receiver_id":"temp-1705307734347.testnet"},{"type":"transaction","transaction_hash":"7fRTLkNAefQmBEMsQ6HnGhHNA1YkCmduDb7R7SP2kT3g","sender_id":"testnet"},{"type":"receipt","receipt_id":"FJ3cDdxosiZegJ4WNYjBhXZ7BfYdMaLpPAXzJjajrZv6","receiver_id":"users.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"H9aX55Tqm1CW36QARgLte3YZ9Wdf3fhm4tjLygYFqFbN","sender_id":"testnet"},{"type":"receipt","receipt_id":"CnCvsHRvKzAuzXPw43ZXtRLu5ZH2ww58XQGUUgWYjNBe","receiver_id":"0pqglttllt1f.users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"HDknH3enjr78hRcC3wR5rKiKMG5GERfLi9soAPoW2hR8","receiver_id":"applebear.testnet"},{"type":"receipt","receipt_id":"AALcw5BdUqPGracwTjMxpocG8tWiLrTWHEC4gAk5ZDoq","receiver_id":"perp.spin-fi.testnet"},{"type":"transaction","transaction_hash":"6NTTnsdahx26Jzubk6bvynCz4ZViUoGQjQQyPaXgirNT","sender_id":"users.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"8wbnwD6b1knr2YhZom11Ldgujahi4M4ZsfumbC9zo8uj","receiver_id":"v2_1.perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"2iCRM8o3uEwKKEoKc3UrWi3S8Ge5gwgd7mVqpYss99od","receiver_id":"comicdeer.testnet"},{"type":"transaction","transaction_hash":"8qoHBsjGtwQcjM9W8yM2L98EokAU4hMZpVnD9x3JCEv1","sender_id":"temp-1705307729372.testnet"},{"type":"transaction","transaction_hash":"9EMfeSscicikVrDv6mHJ73wi3K8HAwcRH3buAQfE93R5","sender_id":"temp-1705307728821.testnet"},{"type":"transaction","transaction_hash":"3tkpFoRZdWP5dEPpAZhXX1GWyzNhgg8orkYL2oCMQPkh","sender_id":"perp.spin-fi.testnet"},{"type":"receipt","receipt_id":"GBLCtHewjdxSrk8f1ttRSGSRAqR7CvPMWGHM8bi1P1WT","receiver_id":"operator-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"4qpF4SRRVmHq155FrhK1RCDbZNnxMtmLXfccL97AMKqS","receiver_id":"operator_manager.orderly.testnet"},{"type":"receipt","receipt_id":"S9PXMk58XgSTom9eJWC3szry2QK4ggRLnjnpv6QXNw1","receiver_id":"operator-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"7Uhb1LojjwC9pVrryc53kAEwkY1z7B3VWf2DueD5HCdz","receiver_id":"hotwallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"79UG9E86GX1CHeePXMgEQgxWfzsnPSfwYnBMiafAK6NB","receiver_id":"wallet.dev-kaiching.testnet"},{"type":"receipt","receipt_id":"4VRxmA79eB7qL4PqJK4QX2ayYpLJZ3W3dJBb8q1euAD7","receiver_id":"asset-manager.orderly-qa.testnet"},{"type":"receipt","receipt_id":"Fk4iDHJrtKZr6ow8c4R9TyixvTz3QHUMHWA3zqNZizni","receiver_id":"asset-manager.orderly.testnet"},{"type":"receipt","receipt_id":"ATocjDbjKLXyBayuoxXtsTKpAiYmZsBhRtYCwzGVh1hi","receiver_id":"asset-manager.orderly-dev.testnet"},{"type":"receipt","receipt_id":"99xzZxX5W4oAFjEwYX9C3bcApsr7J5tiWacwGbnb5sKb","receiver_id":"testnet"},{"type":"receipt","receipt_id":"AkvWzeUbwUcw76LQvBV1XVmHMZh26nbMSkQvbBfnfXQu","receiver_id":"temp-1705307729372.testnet"},{"type":"receipt","receipt_id":"9A3JPegdSynaeEM2EWVFysUBDv3S3kcCrsXwvAae7JtT","receiver_id":"testnet"},{"type":"transaction","transaction_hash":"CtfpEjzFM41fkfduXwoyM41Fxc52uKpeV2tmWMDenrz","sender_id":"hotwallet.dev-kaiching.testnet"},{"type":"transaction","transaction_hash":"5UhNLf3A8wjYZSZa3YGfLgaU7g4t8uUEX898u2r5NgPK","sender_id":"operator-manager.orderly-qa.testnet"},{"type":"transaction","transaction_hash":"Aw29U5ccvJx7NSe1258YjBjG4YJPpDjP4WBNZB2cFQBH","sender_id":"operator_manager.orderly.testnet"},{"type":"transaction","transaction_hash":"6t9v25pvgVJYtCSiyjt73ngLwFnUJV7YqyKf49WDqKLD","sender_id":"operator-manager.orderly-dev.testnet"}] \ No newline at end of file diff --git a/fixtures/1.json b/fixtures/main_0.json similarity index 99% rename from fixtures/1.json rename to fixtures/main_0.json index 538b2ed..f8c0993 100644 --- a/fixtures/1.json +++ b/fixtures/main_0.json @@ -1,4 +1,6 @@ { + "last_block_hash": "G2zUHxU5d5mbXXCAgQdKtK3c9epb1mjqg3QYhzYSN7pZ", + "body": { "approvals_after_next": [ null, null, @@ -717,4 +719,5 @@ } ], "prev_block_hash": "B7dCe8xYAY8b379K626jDq7UiLqHDGSaN99YWZvixVAo" -} \ No newline at end of file +} +} diff --git a/fixtures/2.json b/fixtures/main_1.json similarity index 99% rename from fixtures/2.json rename to fixtures/main_1.json index b5b8fcf..9027d4e 100644 --- a/fixtures/2.json +++ b/fixtures/main_1.json @@ -1,4 +1,6 @@ { + "last_block_hash": "B35Jn6mLXACRcsf6PATMixqgzqJZd71JaNh1LScJjFuJ", + "body": { "approvals_after_next": [ "ed25519:5vvbBTHSa1zmqDRPLSSNZXCQQWuEpT3rvhWZTUyCHULHemVnGZU6asN9m9z7ArurmQYZKWKJhRXfWMipBQAHxRjf", null, @@ -717,4 +719,5 @@ } ], "prev_block_hash": "64Ho8BgxGx7UuDsjXNbzLVt4kvVkxzt1bThCJb6e9qaq" -} \ No newline at end of file +} +} diff --git a/fixtures/main_2.json b/fixtures/main_2.json new file mode 100644 index 0000000..8e906e0 --- /dev/null +++ b/fixtures/main_2.json @@ -0,0 +1,724 @@ +{ + "last_block_hash": "Doy7Y7aVMgN8YhdAseGBMHNmYoqzWsXszqJ7MFLNMcQ7", + "body": { + "approvals_after_next": [ + "ed25519:2VhGGz8cojutZkdWbZ3bUUc4fqVdM6oo3zBtadCfa2HpUw8revjxpbbs4upmF7JFEWgwgfnX8nnDregKLvEjgc7m", + null, + "ed25519:49KmyiPyt5q51xdtDkcQ3ETtyPsUq8ddUWPttNLrnGNKhCwpykaPy8zNhXiFYPQEaZ21SAB5Euo3k7U2kb7mFJcC", + "ed25519:2xvJ1PY4cbZ7DnVoQhX24Bi47ef6z23FByTjK5sbtZYer2W639KUaKSeEVQAs5Jz4jWbCpBGjDNRRgLNUBh8ZUfi", + "ed25519:49dng3dQytReroebX6po1S7y7JmewstX5JdbW2yK5tqzfdAbzyizozfYb3jS7FWpqcbVCU8j7hTep3rAX3xeWRDu", + "ed25519:4Xa1VPFo9WjcFKAFjRmvB4uAGcQVkrVMrgo7vX3MBYr6cDaXCRrKjk4UFzYqGJtD4jvkZrN7CH2LYmKm7QiE9U8s", + "ed25519:5i9irHTS7p1W1tHmi7ANfWfr4Epcn9VHFeNs3Uvq39CknfCW5xf3HnZXfcKMJXW9DX1qCmMU9eTBaYygZ5BZa8tR", + null, + null, + null, + null, + "ed25519:2wnBH5A73zCforWmtYQX2jmjF3DAo8Z3XcxvjFMiGjemYy1KbxLqhCjwfpeN2xB7ZCREEuBE6yriutFvtAvDWZdv", + "ed25519:2B7PqahnewnRz296wDYxpUCeSobM9w2sLYviGubk2h38sEvUWbgBi5Jxvbck9ADMPNEyiYEbetr95Zfv57tjm4fR", + "ed25519:5AWEsgjcn4QstDAdVYCJTTnjEyvCZ25Cp4h6canRJhFDFcUShkRSTBR38XoCKo9Amn7C1JWqVxkgk4wpogXSHcjD", + "ed25519:49efUuXm3BM5XY3HSFSPjtv47w5JuRtg1AGH5ojFtzBTvVsqgEVXpKXi6ZupDxMT26d9g3jyFWqzvis4PTHMD4Jg", + "ed25519:ePPSYDSAK4R1wmQc9HwbCuZd2FYgqRNknkFwREJSaA32sHHPykNoAJza8T1a8GVzHoTJFaaXNF1H5Apvg8ysqFo", + null, + "ed25519:3CqKXCuBtYkvwk5xsRwRCoYFwQeEScCUbJGuZZzn8H1hJkb7eSZAtvouUxVVMaRxyPGZciyFaLhpoX6X6veGbjqa", + "ed25519:4xfsJpdJApuRveVRsdMpuK7mDdx1MP3uL3U3Cnib5J5sQPbUS33MzegaFLr8LcYeUTLsSCT6ycMi4k7eeC4cx2uy", + "ed25519:4HnubxkveyE15tMZNcEDLq5DxxLyFT17XpsMD2jsw5BGUb6qCnTZuG5E8KQuvvbLMNcqnA9vrnhWbd2LxqtghaUs", + null, + "ed25519:562BGk9m5WwT2CruNiKTYJnquQjFadeURRYA97xZ6e4R6Gu19QAYkcryjCePZyS4kEKm2xjefDqpTaSgf2Kaf2VH", + null, + "ed25519:SvdETeddpFKbtHDCrvTnJKnu6SvE2mu1evahcPrf2RmqZK6Cz8dzAMykjvE2fVcxP46M3opovaFZxzc7o7Wt8cP", + "ed25519:2xPkMJbmdTbiXDhZ3R7QNaVL7Gh9qVaSXbon9LaKUg9aVtJZTxTVHXGDLC9rdU5Xkq35UGmzPyqVjULLUawZuGnV", + "ed25519:2oDV64kdMt4a2VuRiTeAoVu8Fpdz5RMs2twSFKYi7D6chBGjHxNrYGtLxhxFAScqDVmxDjUoRK1Dnvdytvtgd2n1", + "ed25519:4gVh6trN6irVVsTQMyQFdE1z2GJcfDuVbwCLz76CRP6UJ1LAB8Lk11TfXeckKy39qrExZjgpUxpfJidXYN7xYGYR", + "ed25519:PDxVou7E2mrxojsX42mL9zv73stcp8TdDAjb1UDT2F4MN8yd4YR7yYpsrK1NRxL2W7osAHyLnE1peWHdqBvzkLs", + "ed25519:4Cah1td6h1zgswNwSNosVicXWbQ38WUjEM782Zm556WWSsSYgjGezYy3vsvkABQuCPorBSHxngPgTYohcSzwo5j7", + null, + "ed25519:2Pm6xG7LvKD9fMEvtSkvMRizPFPP5qBrh29YqDvkCKmoYMJBZSoQJP7kSECWSdJannn1hJkzg8AUFE87FRvCh8E8", + "ed25519:2TNsyhbGWnJfN9e8Yaaggfbf3Yu7w7JpGAQnUe7LkzBKfruLF9yDxaAo4yc5CVJiVqX13NnQfPLcVPpaD1wgMFfV", + "ed25519:41CHKZLBr3pM2eE5wXjgaXrBM7ugTiBBn2JSfar2tHhoAtSKNimfyfws9DemJDs7LB8CBNc85WtqdwGgCsB1nWfP", + null, + null, + "ed25519:3ePYVb2Vnq2x8hm7sgoZWNVC3Hbx8RVXs37AVCpo1eLLLeReRocMDnDUsTss7kBHqMwi5QpZ8ZBUEocYFFX4MYhD", + "ed25519:h3YGEEUj628izdmDR4eBmqYhtFcMfQM14gpL8cmHzE1eCpLmVWE18xQFcdbGLAoW8RGsVPaYdBHbrkGznNA6rT3", + "ed25519:52wySwA9PdQNbrcJnw5oeaK86UGjKP1z8QcWPZZmi68indUqyHgo8x355AkH5hw61DoxGfZ2SCTMGSV9u2b5n8FU", + "ed25519:4ecMCbGYYkBFU8Udth8uozYMnvkQqNde41ZyzBfzABFSoxxv9rK7Tc1BfCeedtUJvmqGUWpwQ9wcWHgKT8BYqNf5", + "ed25519:23SyCVTm5KWjHHkAs4GFCZTvzZhB3G4QtpJNeSz8JgZdT6A77dabePnUqWpMMENF7rKF1dr8bri9doJR37PZB4bU", + null, + "ed25519:4saccLgvU75D4nBJWSPzd71mqtRGHhv2Kx5CtmGSGLxGG1Sd2BmZtrL9rHksQGjRVKxmHswv9RRDdj7JRKqCVJJx", + "ed25519:3CqKXCuBtYkvwk5xsRwRCoYFwQeEScCUbJGuZZzn8H1hJkb7eSZAtvouUxVVMaRxyPGZciyFaLhpoX6X6veGbjqa", + null, + "ed25519:5XmffM6JMYCQQum9764cGxRA7xDGYMUpY3T5Jaiv89f2XHNniA4ZHUN6LkWnnZbdbj97cJYbstvTgCspbWQvVdfH", + "ed25519:4J5LPAdP7Cbe4foYg3qQdTQyxLDVbZk79BR1xJEY1TQJrtJq9JyJPqHXxYibCqeAPVqXhWXJzMzn7BGjYuff8znN", + null, + "ed25519:47Hydvzd8rUcaWF7bkV1Vap7yPvFK7PeMSGMvhjRzNdfqjvEBiJoR4t9ktYVphx9BCQSzDQYdxjysR7yAMykq9rb", + "ed25519:4894KtUJZ6Fp1eoMWnUo3gPZLnMS8q2CMMGRYjXxTiEfM8oRDjzUKhg4x1QLUwCWoq593UpcyroqhcAUkufLXkgD", + null, + "ed25519:5wvk8hNhNzUefu2ig3eyPcx9FHQAqTa9ScornNdGQ7X5VFECzDtXKZh49VDs3SiSAyC8iuB8FgJdxmUq1b39Xoxk", + null, + "ed25519:21KSxZzZtDkLLH5RuJ1auP73qkuL4WXyRLtdvq1XSRrH8Yk1AyqhsJ54YbRbbXmetpRuXuHKENwN1hQsNd37vQZd", + "ed25519:4NcmdYz5VjHKmSRboX8NYsZLRGtGe6bPMcpCcWQdQfTXezDY6EtYL8awXWd6Y3kxaaZkJJ69FuFBazjtTTWADivu", + "ed25519:34sdiKBSp2jkjTySbM14ivoXseRBxpYus7jAfsBNnaa4KPxhpLXVW32proR1YCt732AErg2KnyC7xkJc3Y6CVJ8V", + null, + "ed25519:4aijMmx4KWhS4XmxBfxVCxnJ4s8Yz3iRrFBLYXywb5v13CtKxW9VKSNqwAXJw6jndVaPTo7rz53CsSWNG8CEujgz", + "ed25519:52MtGXV8G1Tq6jWWZZXxBVGVQQK8Egz2yt4TRMqEe4YPDgo9PmCwoNbpzPTSdBQXi4hwFDHpSP5aU1DdjnFLkrFA", + null, + "ed25519:5xBStwognhUYGVzX4dDyVTvJ5HpT5wqFnLcAbNVK9XAJXdivcZqX5MjFBLiwyPHUpPKvx25UEztbtpQVyTqjaorq", + null, + "ed25519:2GhyEXY4wR9iqWshGEF1tQ5Fwb6M6ZGUeXUwQjHed5eUQs71YwuYUyACgSH5VoMiJwGhPhitrjwBVqV9eLHbmDzv", + "ed25519:31wQipuDcL6FwTDd3NCwaqiUDyi7cZUcr7qUF54sU1akdrkQmdHmx1wvoYXf9CU6jrAnF8qrvhridMdgVtZPZvx1", + "ed25519:4DqZuCJx1pW7zYqqU1rU5K6Qf7TjP5LnVU89PfNkmnwfRcQeHaunkky5JC9qYNZLgpQ1nufb583DsakHD25fDNvJ", + "ed25519:5EoXqxQa1TcMsjh6DfzQqbkMJe6Gc2VeyJaFCNhaHuMgN9AEa394cpaQrceS8h9mowNDHGJU6KGHSUCbPrPXv3et", + "ed25519:59hxAGF8dSHwLaepMQKPHxqvFGHszQJfLhLjtjoXKYbidPfEPr1ZAF84X2npHoQ7SHwf7Ev47zEY2RCNUjvY4TuA", + "ed25519:2rKQJBW1LKRvh3Z134e8oNravs9q84Gr72NdrZTbHu8eepp7SgUoAPexCRgCh4f3ubeG5wE6yMdHRB1WTZ8RrCgd", + null, + "ed25519:46TMbMumBmNEP6cLDtS2LshuznVHoFdxzmqYunkqeQm5S761Q6LfgxHkLXx424NFjyebAhmWk6z5bVYHCtyczxJN", + "ed25519:2gWgD8Kyobc9XXGJ4346BVA4rB6wKMXjZyN6GsQPLNCsZEgR8cTk6gxhwgxHxUPDGkob8bsFmqU5hh8Xbochkb3s", + null, + "ed25519:61hGSWPcfZ6YxYW41WG69jhr9c5UrA2XrE2KZEEPHJkDHV4dJBFWvhtt8hXNz4cmPai2uwCy2DZSUgBYSR9sjaYn", + "ed25519:5MZU8UxnychBdGxzNH5k3fa37zRV7hgiauZRuPNXks5J4EgBS8UQxZU1JUnD4j4JhEQRAUmfJ1J5S6VPfKbQHSbX", + "ed25519:5EXH5GeSKE5T85XCuTbF5cMQbUPYG3nzXyKYM9eQL87v83v2U2dHaENa5AjgfY6NmXdfJjC7wNQuo2inASWvYFTi", + null, + null, + null, + "ed25519:5a38NPqoMHpXDqTthFZPFjKnv3cS7pyrrT5ziGNCwGBfaGk1VVyqrtDawmhKMBs8xhUmktXeXP9Wv2PQGdVkxh3", + "ed25519:5mG8yAgauHMZMyFMrPvQw8qGQ7D2xiksE4vekVPWH4bEbxUuwJtdHr5cQgqY87KfSqqbkgrcxozKGRi3CFVapm9g", + "ed25519:4BjQpErboUNcF28gzdxdKQWvRDb7SVZjx65knyCSqseHkZBRT25AfAJkdy8Ra6rPx43xK3YPxu38hbZmKG9nxFkn", + null, + "ed25519:3Uoo5KSZKfPGACtJLiH3KhFBs9N8iohXy5iUPK4BG3EFGHsPcUKLVboWnPevNRx7hcpmKsyxQbcRdndetDMVTWvi", + "ed25519:5uTYvfbViRcsmox5UPkfkzHmEQ9Z5uxdeZ6NvmtTwsyidqEYN1evryH1USrpmZR4t2gswDSLitoSywEFftZ6GmGB", + "ed25519:2B3V7Ms1ZPKcZ5NqJXW9MgRDgHW21gJV1kCu8nKASK451MdVUEdBTd4cyuAqduv5RZQd7F16XytdG7PDXam9BQcA", + "ed25519:AJZ6918C6QkmnS9CA6ZUAAgqPhCaq7Sqb2ZFPWVE84cRsubN9EAR1zK2dBRxX9ZtQhheyzAHy6RwCN8EDRJUHTM", + "ed25519:5VvRCFWLATSRSdEE85NQV3wNhRMnvmeXiV4oSHKyGwi8nowdVmnwmAT4kb7ro6Z1A74hYDqsRQjW4PC4Cxarcxq8", + null, + "ed25519:4PEddhHi6rrKjULmA5J4Sq5djmZ447CGuDQwUEhe2HNCxmLNWQ9njV7kxihmD4M5oidfvLvmdF7z9aDFfkzZBYfW", + "ed25519:5HVs2UR3Ba5ELFjHUmMVfww8M21K4K9wodqBHhXntuRk53GBZnLx8V8eqA5KVbSCJeZZktoeTyqMT9Pa5jMaCKHW", + "ed25519:31RMTcGQ546gn4MXUyytA6ugo1pKXVMa77cVMWtzMLHb6kQF4cPw4gdVE5B69waSaL1GzBtN7Ra7PMDgsMWoN8D6", + null, + "ed25519:vCcvHzko2DqtAtgPeodUzQ3ctemmZKwva5N6xroMcdxYW4CYiG4cgjseq4C72kGuoo1fmt8AQV1HSaG6wd7xeLA", + "ed25519:4Gpvq9SWy6ARfNKHMw6gEC6AmF1EMqXUbdkKW1tGGpw8ySrrPw1ZqFfqAVCyVueteZBgQLp7MSsiBp2v97Z3M4DV", + "ed25519:3Wn5NkmKk9RA5moGFTr5oW5QvHyF3fCnMVjDXDPi8WhwsgHQ9oEHpGpiFkpKKuJj1hTgeP4Yo76w1Nyv2Ya53XFt", + "ed25519:5nGyhoz9wwJJwaDMGnBN3fpxaMVNzSeBrTx2F1v6R6nTRS3Fd16vpGCezCr2r8BSzCMZDrTAqqXb62HeyXZGZbpj", + "ed25519:2WGZQemboLuyCrqoBKAD4GEGkWXCAo5SoN8z5oNzrNHJewesycHwrvoSuw8mmMSPBUQutqnowMtMxsPbgmJnxTpx", + "ed25519:5EzFyykbaPjWrkPRgE5CWkLSkKrA2PGkfPucSJDB4Tzw5VETAS6TuusEAD9TVH9zpHmWvQ6qcxHMgD5ycUKWXsuu", + "ed25519:4Qrtz6NqwegmRV3KWMKVXPiPQ2xJGKyVLwTQZ5gRipHUVaU6ovtoCh2Knk5rLr3BthZumWXYzbQiumS3Adq2GZWA", + null, + "ed25519:5sMjvdios6LjjCGiU2MMo7fjjkchJuxTwXroKWGD8jkzqFqGjyb1tEiD24sbHtuGdW1DTKLFLGzvLqKrexmf3vU8", + null + ], + "inner_lite": { + "block_merkle_root": "ExTQ1q1HvfPZy7BehiR8JmgwUd9j3DTzHrTPmr6r9scd", + "epoch_id": "5h3PDeeRRQjgyNvzbKepLcBJT3jWJdhu662LzfJGC8ub", + "height": 86716292, + "next_bp_hash": "ALsAx1zoiwiCvcJoSrNuGbtTk3XcUcXdMBGaZAW9C36m", + "next_epoch_id": "BCC27fXZwLaqs3MmuhvVfiSHtHjSw2y4zQfP6RTCT2QS", + "outcome_root": "EwkVmmLtfMwR29qGPUDVAEVPJZFPWjqTGBGpYDxLSja3", + "prev_state_root": "8NnmP9ZsBesVgrLwWbLTNVGp9T8NK2oRcBLAsL7eZsCp", + "timestamp": 1678142413035318546, + "timestamp_nanosec": "1678142413035318546" + }, + "inner_rest_hash": "49Jsd8ULPst4hPqn9gLV42pncN2B73Xgab18S4BRARMt", + "next_block_inner_hash": "381NRbYEm7wo1miWJhCvyGFC7WuMyhTJkDP62rrPmm79", + "next_bps": [ + { + "account_id": "figment.poolv1.near", + "public_key": "ed25519:7RjyY1bRKDqkshbKZtgpQdwsdxou8j9my8g1hPKZ9ngM", + "stake": "39206129243863608141066930499972", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "staked.poolv1.near", + "public_key": "ed25519:3JBVXqenru2ErAM1kHQ8qfd29dCkURLd6JKrFgtmcDTZ", + "stake": "33419809779120392920269809612199", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "astro-stakers.poolv1.near", + "public_key": "ed25519:2nPSBCzjqikgwrqUMcuEVReJhmkC91eqJGPGqH9sZc28", + "stake": "27294688224403596819807905373855", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "bzam6yjpnfnxsdmjf6pw.poolv1.near", + "public_key": "ed25519:2ZJqaaCAisK4u8E2i611zFfvNmrvevovnU3M7SpGHkLY", + "stake": "23416062305792484840940844551487", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "zavodil.poolv1.near", + "public_key": "ed25519:HHARoU1hANWF9hu7YRstDDvgyigBhUeUuqecRVr8dpUz", + "stake": "17630216582180625016114945099933", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "binancenode1.poolv1.near", + "public_key": "ed25519:Bb7uPEocbsiQwRfPmsiiiM88DodtuYnBDi6dKZ4JZo2N", + "stake": "14048896105546755595738737008478", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "yes_protocol1.poolv1.near", + "public_key": "ed25519:4bnrmHSMYkvsgjbQSaCY3AFwrfS1w17ACEUQdn7aC4iT", + "stake": "13632840600753345981723601120095", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "staking_yes_protocol1.poolv1.near", + "public_key": "ed25519:CVVcLtfAWj6k1DqKJwhYBQwjMQFmXzFY2NBdMxp1RqL1", + "stake": "13548114501459907012425142831555", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "epic.poolv1.near", + "public_key": "ed25519:68HExKDtw1CjGzopZ8fMAMhMSZRVKRhwLzLQmGKtFNzT", + "stake": "13361490946637633806027080459531", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "electric.poolv1.near", + "public_key": "ed25519:GpSr5KAZMZ1Cb4dHMRUVhmp95y2fmWtm4dEjAr8iAva5", + "stake": "13094194582706200726499022124313", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "aurora.pool.near", + "public_key": "ed25519:FZKXoWHFCXMrKiXjAKFdHo5g9PDom4bWMRFERBfufi2Y", + "stake": "12455530195608719577803023115066", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "stake1.poolv1.near", + "public_key": "ed25519:7EiVt9i7SmULDKEnAXBFSMzwUmZdxUYDFkP73MZuCH1h", + "stake": "11723004342951596666411372180029", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "sweat_validator.poolv1.near", + "public_key": "ed25519:677kArWPFPRDgWEBHqHj6BCmEdTVBsAcjQAc75Gtyq2j", + "stake": "11061535470684271849484334918122", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "dqw9k3e4422cxt92masmy.poolv1.near", + "public_key": "ed25519:EPNc2bHqRCz6TKLstNiusv9qZCRBL63zViwUAcgoZJZj", + "stake": "10479308296906700818189011839258", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "future_is_near.poolv1.near", + "public_key": "ed25519:F3vEGwYYGisaXwKJWrYgorB95DfArDby8bK5wydxD5fp", + "stake": "10309322520727981661721876402207", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "rekt.poolv1.near", + "public_key": "ed25519:FoAaUdVKEHtVokG1aVmJNou61YcfQhXmaZ5Hnfsz4fHC", + "stake": "10079667782041637158777028934416", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "kiln.poolv1.near", + "public_key": "ed25519:GAekByYrSuo3seuaGQx7V1ZTC3gWZY8JxZJ4aWW76LiT", + "stake": "7980652394651037069871965079140", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "nearcrowd.poolv1.near", + "public_key": "ed25519:He7QeRuwizNEhBioYG3u4DZ8jWXyETiyNzFD3MkTjDMf", + "stake": "7002893129834998728551934925199", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "finoa.poolv1.near", + "public_key": "ed25519:62gxgzoie7FiK9dnWuiwM1bbuvhpceYDavK7SgdfEMJc", + "stake": "6862544459467539008922458111228", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "d1.poolv1.near", + "public_key": "ed25519:7ZhMRwnSHGJtWjGBZiRhhSi6XyqKeNHtnEXsVTNdrsk6", + "stake": "6522886931909028877795116092724", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "continue.poolv1.near", + "public_key": "ed25519:9rDZywYL3tnvzj6hnePw3MaPFPfSeSCLxBp1niTGbMaK", + "stake": "6418629997062742180813621956876", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "anonymous.poolv1.near", + "public_key": "ed25519:Hoj7LbPwNwAkLFhf8z2aDF1BG6NDSrq1BfkdaKqPfbXx", + "stake": "6271712752150531999559361269851", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "hashquark.poolv1.near", + "public_key": "ed25519:3YDdmN1vhF7yAWnYxGMHY46jcLE9h11HvEeF6Kntugeq", + "stake": "6176316778768669484263610930775", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "foundry.poolv1.near", + "public_key": "ed25519:5Qx8Fq3SK4Vu1sRRpf2HsNGLAqdNqgkKEebHMniLWhkW", + "stake": "5925879216899098565250728067432", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "near-fans.poolv1.near", + "public_key": "ed25519:AgV97ssnHm7qN8JhYZjwyDtuaT6Ms3Fgbw3WeAC8M3iF", + "stake": "5646665045313893189005647236282", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "stakin.poolv1.near", + "public_key": "ed25519:85UGfKdVoxX9u86JsBMxmVHBguYonnM3vTR2WoD5GkEg", + "stake": "5583623315375786166458286896325", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "neardevgov.poolv1.near", + "public_key": "ed25519:FsZH8qQGfHRxFUbrK5pCEDgN758ZmqUtcUtYRWWGCcAG", + "stake": "5554866332371942354526927649509", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "hb436_pool.poolv1.near", + "public_key": "ed25519:7oU4C3vWqkeup7aMfjyV1ojt7yKX7ShLfvNCahBRy1eW", + "stake": "5396966930657509205043842792722", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "chorusone.poolv1.near", + "public_key": "ed25519:AZwJAgu2qRxHwdpj8ioZEFGcc2jbaZGN7ZvUe7CuXtM7", + "stake": "5287147598217926353386779299664", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "08investinwomen_runbybisontrails.poolv1.near", + "public_key": "ed25519:C6yqxQ3suwjmm8ufG5e3BsHiwxUs9h839FCneF41V7TM", + "stake": "4857774634147130373813689246471", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "p2p-org.poolv1.near", + "public_key": "ed25519:J441YAvvYvjWs3aVzjc5KLLWRzmhQTEMaymPyWFkMGeG", + "stake": "4723790666044236105496108137009", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "northernlights.poolv1.near", + "public_key": "ed25519:7HXh6iS9Rh92Uj1c5T9fPjQXPLnti4Rr2cJQcJEYpdGV", + "stake": "4712387224906733281947973541174", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "nearfans.poolv1.near", + "public_key": "ed25519:GM8vWM4TqTt7jh3sXYCAs2KPyn4vEmAceteBGEFYhyku", + "stake": "4710423887240747307183606599570", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "everstake.poolv1.near", + "public_key": "ed25519:4JLvwa1r2eAxHLyKeDJnpqMG5f2Z9rr49rwuTwb9g8u2", + "stake": "4623315567330451805820491717070", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "openshards.poolv1.near", + "public_key": "ed25519:4Xm73PiAGMZu3mZg4gF7j96iTAFHGbPvqzxBaTgKP4ub", + "stake": "4611959073339809590025288736983", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "dokiacapital.poolv1.near", + "public_key": "ed25519:FGcJJeWMyx1xDbfkcPM2oMeUeGaADJuPmeqx5rjsHn7t", + "stake": "4332759036466228308554905977698", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "accomplice.poolv1.near", + "public_key": "ed25519:5ck255MtkoGQxh9LfjNtdb4M7WHkUmjU7SBJCEkZP2B7", + "stake": "4266120587684739122299552723543", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "cryptium.poolv1.near", + "public_key": "ed25519:5Y9hW8cKBb5RnsJBqttHHC5ujz5zcZZ5xnrJPwkCWmGQ", + "stake": "4227791919561939934282903484058", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "blockdaemon.poolv1.near", + "public_key": "ed25519:3GNFSJiFQQ1rnR68T4eZRff2omPhg1CTewUHBJpQAdyc", + "stake": "4197683971126897677552917113311", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "pandora.poolv1.near", + "public_key": "ed25519:53N7KBhSkEP6tLuQmxZV9fAK16D1C2kWnuzes8KNyS7P", + "stake": "4146080022605167207664031127947", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "bisontrails.poolv1.near", + "public_key": "ed25519:Emk6wQJtpQZRJCvvPmmwP9GD2Pk37xxRpmb5uRvJpX62", + "stake": "4038512909923817748075892748374", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "smart-stake.poolv1.near", + "public_key": "ed25519:A6wpkLQiYqPZ1rbd9s5S1Bg3LxccVsQqiCRDUXwzJ6Hx", + "stake": "4003234307493046391337326649739", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "nc2.poolv1.near", + "public_key": "ed25519:He7QeRuwizNEhBioYG3u4DZ8jWXyETiyNzFD3MkTjDMf", + "stake": "3869238705002385060975735647681", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "ideocolabventures.poolv1.near", + "public_key": "ed25519:6NFuvrmnJiokXibR9Z7TUHjB4NJnD1rJAHhBu9JWmBdh", + "stake": "3771051905041496783453388460098", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "stakesabai.poolv1.near", + "public_key": "ed25519:6abauNvvWnEkagjVpWRy2tZJdzPkmqurUjteMTKk5KQF", + "stake": "3535334314397193862153015712370", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "buildlinks.poolv1.near", + "public_key": "ed25519:Hd3irGt4zEqRPAzcFszX3oTkVWRFFxdecDvShCJSS1Wg", + "stake": "3526372164342614084796298814676", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "sharpdarts.poolv1.near", + "public_key": "ed25519:9XMHXqv7rM3QQxzjUu7dfKD7GhMkq8CEceaPdkhiBQUX", + "stake": "3434848476944224053624702383467", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "consensus_finoa_01.poolv1.near", + "public_key": "ed25519:3LqCGkM3uLjQjPmd3yVyaEnceinEL4cBfUm9vp5hJRTJ", + "stake": "3210187970648326218235433796250", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "nodeasy.poolv1.near", + "public_key": "ed25519:8mjespqqUePSYSsxYxPqCUsZUuMxVJr1vjBRwFeCke5K", + "stake": "3175117754588187183467391312105", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "consensus_finoa_00.poolv1.near", + "public_key": "ed25519:62c41nzrrZAspLnPBC2A112PXBhJuj1cGkVE3ANwbzat", + "stake": "3137487132332056735962851894070", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "dsrvlabs.poolv1.near", + "public_key": "ed25519:9SACdsDDgXA2WZLfJvpkKbu22Exxtc4CMbeHmVnN2P4a", + "stake": "3068789867106978388439487819348", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "lux.poolv1.near", + "public_key": "ed25519:HzTGTDfTz63QGvvUdMGozFeaENFGyYAoSrqYJb23qZFN", + "stake": "3028423991046584165619348124538", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "lunanova.poolv1.near", + "public_key": "ed25519:qkfP4NsSuHybdLhdvvYQ2Y9xWPsd249thEvrzbJBKNc", + "stake": "2870316617608351013129493882339", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "brea.poolv1.near", + "public_key": "ed25519:8dce49J5G28yMGRcSiDnYNFh7GBSma8TmYaw5mGTSH1Z", + "stake": "2761858870237463180720625792343", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "zkv_staketosupportprivacy.poolv1.near", + "public_key": "ed25519:2kAo86DW8mDaLDg37rFhQY8UYSZVq1CtegUHBEDvpSMA", + "stake": "2689727012142129963731924151456", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "baziliknear.poolv1.near", + "public_key": "ed25519:E4LAWdgLifBEoaWvhRNy5vpdAnUc3GsUHePeiAurZY5v", + "stake": "2688388636772692288448305121899", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "erm.poolv1.near", + "public_key": "ed25519:88nnN6LAuCbJaj9wucd1WUMfTtdv2s3njpvozHft8oQ5", + "stake": "2535798066743341414045251252289", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "fish.poolv1.near", + "public_key": "ed25519:27KegJd17HeXHk9h5MqkT35QAuvYvo5GFgPTpSVU4kPN", + "stake": "2359349916980152012597982756209", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "01node.poolv1.near", + "public_key": "ed25519:5xz7EbcnPqabwoFezdJBxieK8S7XLsdHHuLwM4vLLhFt", + "stake": "2330998910140068045131278690848", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "stardust.poolv1.near", + "public_key": "ed25519:6rxCJpTnrT6NFuGg6d5Dj3FEUz1ScNU9u35ywB3dYhrX", + "stake": "2179193523704935865995375845863", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "republic.poolv1.near", + "public_key": "ed25519:5sT6xtwxvLARW6y3KURYmyFd5SokJFhiK4jyqbamzzZ6", + "stake": "2124651577543740701890267481063", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "moonlet.poolv1.near", + "public_key": "ed25519:GkDwzPckMfhkdYgyFG69Uph8RJ12BcV9xNeZW2q93ZJD", + "stake": "2060503312099452529479997679460", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "allnodes.poolv1.near", + "public_key": "ed25519:AGEeyukQdMtg8EttsU39YLgryhao8yQeVwQTut5bbWdL", + "stake": "2041189719996971478342261526212", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "masternode24.poolv1.near", + "public_key": "ed25519:5ZyaXsGCya4Sch5bqUfohvo7iRFYB9ancRouggWRsiDU", + "stake": "2013012692631849510294424733258", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "legends.poolv1.near", + "public_key": "ed25519:DNK46DeHKeJPF9YetmNxZnqtpkeLjdUb9ezSRCue3TpB", + "stake": "1968963206127000985432877551650", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "fresh.poolv1.near", + "public_key": "ed25519:6YHLXhohY8kMnkp5Jw4HrJ52xtdyt1rcP6AaWkKzh3ED", + "stake": "1908553262368274972364412463603", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "nearkoreahub.poolv1.near", + "public_key": "ed25519:HUKmMJ59Hht8rcGG6uZ9M4qWsfbTCDtBgyV93YZnPXGE", + "stake": "1811363932350908894826349268172", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "inotel.poolv1.near", + "public_key": "ed25519:DmEDRntb9NwfbfdvDf6wzjsw1vxzQcJAAhFL2J75iLwr", + "stake": "1783140530783276198612825703651", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "appload.poolv1.near", + "public_key": "ed25519:6LbMVL6otkvZbpuC9sN3z7EXSMo3PT9noPeBdBZTFneM", + "stake": "1777016586059857984166086383996", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "qbit.poolv1.near", + "public_key": "ed25519:5DqZLnDu6PMEyhJzc5NhiMsoWeYMWG1bC4AULyafoXMv", + "stake": "1652745895856216988922137332983", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "jazza.poolv1.near", + "public_key": "ed25519:EW66Fkv7XcE9FiybuYtVURjHhYeEgwWWpzF685Vi7foY", + "stake": "1600810581770426565414413340826", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "avado.poolv1.near", + "public_key": "ed25519:FdLWsf42e3Sc7bdKMtxJMgWRP21ysZDSXFnS2vTwTaaA", + "stake": "1505671712920196582626546247266", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "satori.poolv1.near", + "public_key": "ed25519:9r8HYmw8mbys2Ng9BaKeQqZnaQTGCcBUbMatV5NeeWJj", + "stake": "1505563874806956005096650532342", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "ledgerbyfigment.poolv1.near", + "public_key": "ed25519:4JJTNeMaSb8W3NELh2rkkrDCqG1VpM3gdJ1hc9HFTBmN", + "stake": "1378902973337960064375143109943", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "atomic-nodes.poolv1.near", + "public_key": "ed25519:CpVAHE3JpfDoEPqjBDgYEjgG8JhM5BFKbjUD2N1EuvAL", + "stake": "1320330340013835475473012378960", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "pandateam.poolv1.near", + "public_key": "ed25519:Cu83NRziNLiT6HLu9kJ8svFoftZQ9wVmjScxjqCybppt", + "stake": "1319203644166316104758512034128", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "staking_sp2.poolv1.near", + "public_key": "ed25519:CS4uHAipvtxGz9irnoCX7SxT6d8zKpDj8Y3Fyf2zVgBp", + "stake": "1189875320275820429094732822094", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "nonli-near.poolv1.near", + "public_key": "ed25519:91jusDFxjY32h51tfq2HoKhoPbGs66s88t1v2oZPBSxC", + "stake": "1185432705606468385332754514200", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "bridgetower_v1.poolv1.near", + "public_key": "ed25519:AHgnnt8yhNBpoZChBiHXfjaH6X2zMZaDDXmmSWHvDcWL", + "stake": "1035663254387646835799962119440", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "stakely_io.poolv1.near", + "public_key": "ed25519:HWp9E3gP91s25ddMS9xUWuzbJUpVGiPoitu5bT6hqMHs", + "stake": "1021258364486646824071027357415", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "calimero.pool.near", + "public_key": "ed25519:7A9aFJtr9yWh5eyAUUUSdXMoxzi1qBjshiVCjsDWWa1J", + "stake": "1015874783766921089538649131256", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "staking_opp_disc.poolv1.near", + "public_key": "ed25519:8XbCfLQVSwtwaBajvByG87CxPPbaFdryz5qEkde1fSGv", + "stake": "945252783112950401552190350991", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "galactic.poolv1.near", + "public_key": "ed25519:GFK83N32DbERtFg8rkpfNBsKtkFpmNQzyKFM9kJvPCMG", + "stake": "831246120998540891354298874477", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "cryptogarik.poolv1.near", + "public_key": "ed25519:45zFAC8pLgwn1d5pSBpBHesWbzngfRgd92zaom7K8m8j", + "stake": "828004032171300648370990744344", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "optimusvalidatornetwork.poolv1.near", + "public_key": "ed25519:C3CJMKaWdEzkqyNCKwnKud6wDNnzs7Ura63k16zm4LUU", + "stake": "801755793868841694119971272782", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "pathrocknetwork.poolv1.near", + "public_key": "ed25519:2iJQLVXubWafG7K1NzGVvjP54UJCgVg3cuPMktw8r7uQ", + "stake": "798288406254751164539305822812", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "dexagon.poolv1.near", + "public_key": "ed25519:AQHwptR3Ho348BpFXJDjkxpWMW5ZwN7xWM3XWAWSEEgs", + "stake": "781119997524930787753273551265", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "staking-power.poolv1.near", + "public_key": "ed25519:42ikqyV1BYmSnhHJ9EsLLy9kgeAg1mC3qqU1AJGaTEaW", + "stake": "739158259862982574010823948092", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "infiniteloop.poolv1.near", + "public_key": "ed25519:9BUwtDegzwKcmJBjLgUDLHc3pePgPKcWJXYGcZb33Nyr", + "stake": "694945966749165983829361965202", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "prophet.poolv1.near", + "public_key": "ed25519:BV5b4DpgCUy1TEitE4TVPhpTY7uDNpHc8DBPyH6cYCBq", + "stake": "671635020628939237380029587432", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "bitcoinsuisse.poolv1.near", + "public_key": "ed25519:Cy2sboVqjDk6d3d2A2AJZBdFvokjk7sjZpYATLjcQSCj", + "stake": "664239734198440103401629427218", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "cryptoblossom.poolv1.near", + "public_key": "ed25519:5opTNJEkCBYuyMgAghY2Sxp4bBtXYQtbEvZ3Wc5Awohb", + "stake": "657665183791735436571718632241", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "kosmos_and_p2p.poolv1.near", + "public_key": "ed25519:41GWxdQHe4Y2fuisvz5k5G2NwDFEavRkisoZkB5tfJuC", + "stake": "636577548907797834502568994402", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "readylayerone_staking.poolv1.near", + "public_key": "ed25519:6AuBsxxSCYHkuJW9Rhf7HK2qYKErtThZUrN5HFDnQ9eg", + "stake": "627738918419591761430004629136", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "n0ok.poolv1.near", + "public_key": "ed25519:EC1p3w9hd4XkYoUiAKc8PSQGVFGiUXTDJvqkurRdAFz5", + "stake": "603091766828423031754951292758", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "dragonfly.poolv1.near", + "public_key": "ed25519:6Gj8MRp9KqfdiXa35LJcZnqeBNNEZoYk6ysvpzHaruvq", + "stake": "573145205007582852162929757548", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "pangdao.poolv1.near", + "public_key": "ed25519:C35kAQVW6MHoWtUZ599WHXamRXVZnrHMVD1q85FERiem", + "stake": "536104952358448307683904244716", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "nearua.poolv1.near", + "public_key": "ed25519:6YRLTm4coawMYrchYs1ex5BLY7xtnPrnvGWgk6NJAQvy", + "stake": "471397693642001593493614085881", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "galaxydigital.poolv1.near", + "public_key": "ed25519:8ZD8CcSzSfVsYo7XyABHJsYcrpBE3EL5MwukoEfrNYMR", + "stake": "448811822469059379056147844225", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "grassets.poolv1.near", + "public_key": "ed25519:GS8uhr7mhsBWB5c1JgvsJzpwZDGrcnB9Xnw7YRyMSQP5", + "stake": "418986205174954907945983151920", + "validator_stake_struct_version": "V1" + } + ], + "prev_block_hash": "HrafGqcmmviAysiDHZypHiqj5W6Edr7QLUK2rkP6dCRA" + } + } diff --git a/fixtures/test_0.json b/fixtures/test_0.json new file mode 100644 index 0000000..30b103c --- /dev/null +++ b/fixtures/test_0.json @@ -0,0 +1,247 @@ +{ + "last_block_hash": "6taaeb6h2uJcuUvvmwXpYgagYvyHsFanWhm2ziGGHCff", + "body": { + "approvals_after_next": [ + "ed25519:VK3Hhut16e5agbePKPfsyrLVQRJGQwWamSRTRCQwJNFL7FuKtxfoPiRNbaYoEcUqSGvYNK8LXru4etnNtCQZyf2", + "ed25519:3AzJSuR438NiC53Rx2BqjcxxeFKQcXBPspJfTyQ5CAuSmrazNJ1vsXgub1dfJWGkLB9m7zD16AghdHbwyxHa3gwo", + "ed25519:4gFgfJefgLs78u1PfQckGstEbhLK1TCtDWCXUiYLHiXvGFVmPWgZbtU57DJbiLQqYkKUN2yfRohRTZA6w52TAcVS", + "ed25519:5Q3QdNsCa9j3siWQNAHXk4FTsiKntFwB1sFE4zUuM6S6gPx1cniPFEg3VfoShpVR9M9VPAr3AVfRmDFQGCvcvcKq", + "ed25519:2X1uEUuWGBF9D6FgK6GGXf3qVjeiqa4F4UzCatdtmRA6MPrePbv9W5AmGgaEePuYv81WytXU1xmfSGfaHhbpYyEt", + "ed25519:ftssnQfBCA8iEYLTcAkupddx82df53Hjm6T7qvD1ZWwmMF7CQDkKPxnBMC6CVL6wPrZX6Dsrz18RCTmyks3M7gV", + "ed25519:4d4kPwBhg27K8ZMC5A4MgVDu4kbKmZ6nMQUTQBfXsShGS5DwAyCks4f1jKWnbh8jW4bJERiJUWH4mhHStfoNNbgF", + "ed25519:3d3VNqdXZQyfKudgfAPmMr645Rn3RUxFNYsvsJJUkPmV75vbMYZyKLAGgXKNGUddtwawDrnRjbvJtaMwFraCSb4X", + "ed25519:63qxBKg1npU8SzanxtTZmz6BPQGoZyihe2rXko8DAyM9Kmxrg3xrQyoyk9yk9Mxa6kgw6HNTpPAEbSLVewzhzxB2", + "ed25519:124mNKfU8gHtMdCnhZMLfiREpy6Lh2ZQYLo1KJo8JThqQp4BwqJ4wMCGvDp7jcCBBfHWzXz1eqnZWMWFubvcZnXT", + "ed25519:4dq1ud5d12SNzcdGP2rFdJYH91a9FVGRteoRirNBudhz2LmiiEANqgfkB93SmxA7BuQRdKYkK42hbSNUPXdGQxWj", + "ed25519:4DozYNm9f9suvuWj87QfAMfquaEqJJpZi8cPMH8u8h3re9BMwbvu1RfVLZEaWziihwCQUJWV7Meiat5wfqj5FUt5", + "ed25519:5sp9Awt7UzzJGiJN3jMF2jSP5nxU2E1wC6PVoKL57XgTfmWkdxQUmNgev8HPZruMvVWRYkpW1dYa9hibRuPU9sQV", + "ed25519:29ByUDGKUE6c7rZA5A1nVaNK14Z6dHgMT6ejAnirvTgRci5EEmjUdJS69XES6Pk9VxeDTi1X19Hnnw67KPyQMHbC", + "ed25519:2Myim4fHvkaAJWpaeAavoF42nkvAqaTVixnav4v7fSPHFWgXLNM5L8FNZowzfBfKimu3juHSf5fNUtht7Y8ZU2oT", + "ed25519:4qNiUd6fM6aXRqBuda2Pvwjt5h3EPuvTrryXUUjoaz9c5Uh9Q2pYyY7k6ENC2RkNGxmTMzGKbhMmXQKpVesADcrJ", + "ed25519:2nBVHpagEujexVf3PJUkBxPdA7mWadZkKMmcZ3KyKNaue7ya7UrUB8yDUG9DoFkP5ZbYdZmkrdWDboFSUEMjB1ae", + null, + null, + "ed25519:3zWa7NL6WJz3MYgPGjKGf9eEAG4qCAdHwBmV3zuxAoE8RTQkhj91WnXfZd5o2TrtHQDJYKLAsaGd7EikiBar7Bs", + "ed25519:67Ph2NiNfr9LERQdRh25npY1xmimC9m1L1ofaW5jXuvbG4Byfp7WoC9DXrfWzjLuwK9tKS4oQLC6gLaHefVn5DiV", + "ed25519:3UbX3YBcyARb4CbtFRnzA25qRKswvFiLLgsZ8VAEjs7D1qoG75B7UpRh8aYrXK2U2WuFEkzLb9dQVRb7mzLUxjfT", + "ed25519:2wuLqd2ZNdTfHF367bzFXL7NV2Qk3m6YNEeCdMASnx1sUB4BULm3Q4WNF9ZGrAKSMAaEyxKGFA3tvyKDxoSk1wve", + null, + "ed25519:7mbR6ii13WLpPn1m259ym4k3Rb2DxbU8NKdo5VjaGNt2VnAqYojLW9gKa9HMErJP2bUPZTj9BsjGBCNjCZ1cDzx", + "ed25519:2UP2VsEcgSubk9AgKAHJ9pAM9imrF4Ms5rQvsPynU5w33HpjxHS7gzsakcdXq94SCgScTV3y6oU2SZ4PijKTmsKt", + "ed25519:3maB3cKsDSL7AJu8s3cmnJcpekjU93mhdnQH5UWTeLdDmEbnmZEHAewSBFqhCwFe5hHKgapKSV9VoMCRnwsgrVtw", + "ed25519:2KEVy7rQ6FK91yMc6mgF8ueP1vpr5c1eLBMxhn64nmtVzU5V3tQjD4jjrBQkTYD5eaGqvke2noTiU93DTHQzRU3T", + "ed25519:4wj8EycC9K7aQ8JpGTTrY5K2adqxZL76p8kvjjyKaqXip4dE9HwXRFqh7cTgy3sXbQvdJtxSZ64njHeDoWvJD1Ct", + null, + null, + null + ], + "inner_lite": { + "block_merkle_root": "3huzCnEQhgDDMWyVNR9kNbQFJ7qJGy1J4MBrCJAWndW9", + "epoch_id": "FsJbcG3yvQQC81FVLgAsaHZrMBFbrPM22kgqfGcCdrFb", + "height": 154654776, + "next_bp_hash": "AcNatyPz9nmg2e5dMKQAbNLjFfkLgBN7AbR31vcpVJ7z", + "next_epoch_id": "Fjn8T3phCCSCXSdjtQ4DqHGV86yeS2MQ92qcufCEpwbf", + "outcome_root": "7SYchEDbwawjP2MVfZ2GinP8bBQU1hKFRz34b2ZzG3A8", + "prev_state_root": "F2NNVhJJJdC7oWMbjpaJL3HVNK9RxcCWuTXjrM32ShuP", + "timestamp": 1705334624027402581, + "timestamp_nanosec": "1705334624027402581" + }, + "inner_rest_hash": "DZT9p28adyuiTSbUV5bsuPRxX9K7R1bag1AeUEMhm4bh", + "next_block_inner_hash": "DNCadyQPnQNYU3hA99zY2RfPQY4JpfRJeT8PewWpWQRQ", + "next_bps": [ + { + "account_id": "node1", + "public_key": "ed25519:6DSjZ8mvsRZDvFqFxo8tCKePG96omXW7eVYVSySmDk8e", + "stake": "51965991496563659315960459285056", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "node2", + "public_key": "ed25519:GkDv7nSMS3xcqA45cpMvFmfV1o4fRF6zYo1JRR6mNqg5", + "stake": "51956315551249534697100259004698", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "node3", + "public_key": "ed25519:ydgzeXHJ5Xyt7M1gXLxqLBW1Ejx6scNV5Nx2pxFM8su", + "stake": "51901364964498492263434600300098", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "node0", + "public_key": "ed25519:7PGseFbWxvYVgZ89K1uTJKYoKetWs7BJtbyXDzfbAcqX", + "stake": "51807871317794349436390749741568", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "aurora.pool.f863973.m0", + "public_key": "ed25519:9c7mczZpNzJz98V1sDeGybfD4gMybP4JKHotH8RrrHTm", + "stake": "17889547137784368999057296757171", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "legends.pool.f863973.m0", + "public_key": "ed25519:AhQ6sUifJYgjqarXSAzdDZU9ZixpUesP9JEH1Vr7NbaF", + "stake": "16201913225042074278623061793112", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "01node.pool.f863973.m0", + "public_key": "ed25519:3iNqnvBgxJPXCxu6hNdvJso1PEAc1miAD35KQMBCA3aL", + "stake": "11170441638122498891243391338168", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "fastvalidator.pool.f863973.m0", + "public_key": "ed25519:93EQCbHLEY6cMuxDNe8LysWPy8zv5VsoqvHppMbMndpZ", + "stake": "10592433670906673196820699139628", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "kiln.pool.f863973.m0", + "public_key": "ed25519:Bq8fe1eUgDRexX2CYDMhMMQBiN13j8vTAVFyTNhEfh1W", + "stake": "7466078258914882102490404903558", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "stakely_v2.pool.f863973.m0", + "public_key": "ed25519:7BanKZKGvFjK5Yy83gfJ71vPhqRwsDDyVHrV2FMJCUWr", + "stake": "5536803167995073895287889871766", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "fastvalidator2.pool.f863973.m0", + "public_key": "ed25519:4BYnfLhhvNkcDe6U4W43uAqBXDaxM6DcN3YAbLKNUWSh", + "stake": "5302106052281372493614954324464", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "fastvalidator1.pool.f863973.m0", + "public_key": "ed25519:GSeKR7hJrgfBJ4FjS4GwQYaQzcVhuDun3PcjWZh4nGpT", + "stake": "5291814124144644904379619249839", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "chorusone.pool.f863973.m0", + "public_key": "ed25519:3TkUuDpzrq75KtJhkuLfNNJBPHR5QEWpDxrter3znwto", + "stake": "3830782869095601550208218306826", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "everstake.pool.f863973.m0", + "public_key": "ed25519:4LDN8tZUTRRc4siGmYCPA67tRyxStACDchdGDZYKdFsw", + "stake": "3424542869832679924363110810613", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "ni.pool.f863973.m0", + "public_key": "ed25519:GfCfFkLk2twbAWdsS3tr7C2eaiHN3znSfbshS5e8NqBS", + "stake": "3102526368747483216749759285501", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "foundryusa.pool.f863973.m0", + "public_key": "ed25519:ABGnMW8c87ZKWxvZLLWgvrNe72HN7UoSf4cTBxCHbEE5", + "stake": "2969728543420726431634300166705", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "chorus-one.pool.f863973.m0", + "public_key": "ed25519:6LFwyEEsqhuDxorWfsKcPPs324zLWTaoqk4o6RDXN7Qc", + "stake": "2699586772185217175436266507686", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "lunanova2.pool.f863973.m0", + "public_key": "ed25519:9Jv6e9Kye4wM9EL1XJvXY8CYsLi1HLdRKnTzXBQY44w9", + "stake": "2621112518848962964878885105004", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "valeraverim.pool.f863973.m0", + "public_key": "ed25519:3686ABqNUZc1qhLWLHg5xZpBzrWPiUCMNZxcCNmg3e2s", + "stake": "2470287532644478855780095683680", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "nodeasy.pool.f863973.m0", + "public_key": "ed25519:25Dhg8NBvQhsVTuugav3t1To1X1zKiomDmnh8yN9hHMb", + "stake": "2422603751767713530958290540330", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "stakesstone.pool.f863973.m0", + "public_key": "ed25519:3aAdsKUuzZbjW9hHnmLWFRKwXjmcxsnLNLfNL4gP1wJ8", + "stake": "1884761660146474524590126573806", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "pathrocknetwork.pool.f863973.m0", + "public_key": "ed25519:CGzLGZEMb84nRSRZ7Au1ETAoQyN7SQXQi55fYafXq736", + "stake": "1716080041579049406737178399888", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "dsrvlabs.pool.f863973.m0", + "public_key": "ed25519:61ei2efmmLkeDR1CG6JDEC2U3oZCUuC2K1X16Vmxrud9", + "stake": "1582167714882447593375801170700", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "bee1stake.pool.f863973.m0", + "public_key": "ed25519:B7Mwy3sCCJ6GZzEojsKFXMjLQfVXPDC4Q1LjuHoZcyM6", + "stake": "951628760427592588357858953323", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "bisontrails.pool.f863973.m0", + "public_key": "ed25519:8g4P5EXyp2b2pfVMHY1QLfkRcY59hjPfWrFCKUWX3RmR", + "stake": "784322861457562867996710885838", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "pennyvalidators.pool.f863973.m0", + "public_key": "ed25519:HiHdwq9rxi9hyxaGkazDHbYu4XL1j3J4TjgHQioyhEva", + "stake": "453985902267796464609404547243", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "nw.pool.devnet", + "public_key": "ed25519:65XTtuthwFDL9LpK9FJystfEvJ6brtBpfYSnRMa5a2wN", + "stake": "351594742984477077395922766923", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "leadnode.pool.f863973.m0", + "public_key": "ed25519:CdP6CBFETfWYzrEedmpeqkR6rsJNeT22oUFn2mEDGk5i", + "stake": "222791099831338589442315274396", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "blueprint.pool.f863973.m0", + "public_key": "ed25519:DUfxa8EUaTQyVXgEm4NFCtiez7jsjbM3m838c7aRSEBn", + "stake": "138000501667279356740025791621", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "al3c5.pool.f863973.m0", + "public_key": "ed25519:BoYixTjyBePQ1VYP3s29rZfjtz1FLQ9og4FWZB5UgWCZ", + "stake": "113955994115662929112230612769", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "cymac.pool.f863973.m0", + "public_key": "ed25519:EzUKatz6stcg4pKA2HpwhQXhSDvef3Cxyo6zvsz87est", + "stake": "112838247651548890239554150501", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "a41.pool.f863973.m0", + "public_key": "ed25519:Gzg8dYaeBe6ime9dsMKUFiRZeWLjQ3VHjBCbapjsCmUf", + "stake": "55030000541997702601700000000", + "validator_stake_struct_version": "V1" + } + ], + "prev_block_hash": "5dbt6rh82Xx6nNG1PuKoQj96g4jnWw6cyb8HNWPPkVJE" + } +} diff --git a/fixtures/test_1.json b/fixtures/test_1.json new file mode 100644 index 0000000..59e84c3 --- /dev/null +++ b/fixtures/test_1.json @@ -0,0 +1,248 @@ +{ + "last_block_hash": "A6XdHk59MvQf3aMA4Fo4AbqFBRMrFTPkMzbK4xKi4Pyr", + "body": { + "approvals_after_next": [ + "ed25519:4iYR8JPp96vrgh4X7vJt6x4iXkcz8xNKzMzn9Zy9393grrahCNnpKUAFzfjynoa3pDaaFVH4TG9i3kC277GCqDh", + "ed25519:4JQWoZN6GwuXityiM9FtzutPSFT6NT4w9HyRVEHr77KCMASo65gg2WEbSxKr9b8hgKnxqsYtEnPURZo8158ZXgLu", + "ed25519:4miyB7FCbkEPARW5vZh5PkdjN2T3xU4kbdQTEJh34E9J94qQkNJxibw59cFkHYQ8p5jZNTJm8gqo2WRZ1C5MT5ys", + "ed25519:23sAhk87wCEk9y127pVTxzEHuPiPnhuGayqsm84ZDEssDZmmwBJV2AwgtJ8je7LLf3q5w58YH7ZdiCKRmRJVHU6y", + "ed25519:3Nxn2PXkn3ebBjeTggZtZxatCfVvBND5pK9JafrruEt4Mvm7vrTVb3wS5n6iiwzzgqPi2futbrrGg6hD159Tywcb", + "ed25519:4JDewsvjKo6b5qbi8TJT5QvG2oMDXjp6UGyD77cMiC9yBbpnsvqtqucT1ovWEZAejSEteTKh8MwTYNG4fqGxkgEK", + "ed25519:53ExLA4n8k8GPRtx9gyG3GAUkzVWMEMHfWP9JNxhfWnPvnFKdF4Rx7qt9LGMSxh6hHxPBwYrqrM2MJGiXTBBmU9g", + "ed25519:2b5RQYp2CQRC6Kde3Uw8gHpyPKbJJGHedBPDkPojFNddYDMU1xVxHe62RV3cUxv4pNr3GtC4ytdSzkjXyqXnUZWg", + "ed25519:Ck7SvjdBK6NshMJHHQ1mH8mTsRRXbxg9V9QdZF3MzyAZWv9sNZoovCyuSJQjJdnmZR41ZeYZhPMAYKa7rwii6ZV", + "ed25519:5T3eJwLWefGRpGKfMArKoY93nwgQbvN4tpTN5ETH7EDB89kpixn54k3HNR21hnwg5ZDuC4ZEPf97CCoWao5VDqmh", + "ed25519:5VeUZVNrTqqfyT6FdRukznT6AB8X8fR43Mv4aTPuNjneKpEXWeiPtWrQniQnaiz64CikMhi5K67FuuP48uDY62Ya", + "ed25519:45BerwL4v3JgXXcUnLAW3UAw8iTanQLo2okYbmzVkmSNB62GtmPf2PESEbgrd4jr3VNreb7oSxd7k3LAgNEV7Exn", + "ed25519:5tAqssJmXV6Fcy8T6qQ9W819om6c93Fmz5fk1iFDu2mnTw1bfYrNVPZxwbjNMxyU6EzSu4cjykBVmcGXm7EJtHr8", + "ed25519:462bhuLShbMmu6K8RkC6uc6fKmGmTzpC4iJcEqSdH5BS2q7sLmU2j2PWwAedg2Z8nXjVYRMCzci3FeYPZR8fkZK4", + "ed25519:4JMdzn7HHrkpZh4yvY6Cx9cyfHSE44tj8jABhty14WJccJTugomC8xDLQE6HYTuxgXrpVmS8Dz8oK3fzwMSZeWsr", + "ed25519:4yEHBfzWYhC7SSonhczffKvwWRJE5ViMXSkXpowAgZHbJMF2iKJtMfQk9jvf8XPWzsMj9W8eEBsmZfDLHVc1hyA6", + "ed25519:vhEsZ3bry9yHtLQjiWD6KZZYSfZp6Aea6zrDaF4Z8eJi6ESkaNzKksjrXRyroXWhbyZtQVTqJDtz44t6AJAA8D1", + "ed25519:4BqS5LjoEkS3CvvgfhgTiYsyoxTdg1wLYTUxyizENxpKUWvFVZPCeG4PTR7hGBth7nL1Duoh35bWr1Zhwnw5PwHc", + null, + null, + "ed25519:2QphJc3W6cuM9pKP3UJ1Rb31V3gfsNck4TrCkJesxQjTRD8vUoPJHRdmuNyh7x7uKEiy9Fm1nPzLdJUKvnpBvsXe", + "ed25519:4fjjCEvCr3Vd8kyjv1YYfXxZD3YcPmjxnEbeE4KdAA7pPip4FfbaAtv69rpguWP2YjQwRrW9rn6eVYvSXBFtVQJc", + "ed25519:4kGKNsRxhx3XzV2gapzpxfczyKyMxzsdWfUbDSZWRAbLK1965EKjuFXTqhhvHC5vS2L1MiYtHWDi9zwzDk8zYiyG", + "ed25519:Ff7Zj6HHHhLXfH8T3kKsQxJVF5EQLmLdTwBXtszLUaL3Um7qR1ZamXAxURXsK2cdgfbtpJkV4DwaH5Vx5VLZmow", + "ed25519:5gUPptJB6aDKJTELCVQBvK5DHAtPkMcMMSrEDTBdfkt7hGA9TmEbTcAyz1RSANRCzzUDphtMemD2VGLJen23yWpK", + "ed25519:274QMhhCkbkh6QpCQZ2q8eDGHMe7zoNDcun3GJPCgKnzfQ9e9hgndruuua8R5D68bTeEd3E5vsCzs3XgFdKYYkTL", + "ed25519:4tRmVgq11TpQgDKVuvj5RVRD7qFhrv8ztQRxPu6c8y4KfbE7xKGdPFEeG7UXWXruZFs1wrGKTu8HJyLrjVpWcDHD", + null, + "ed25519:4HvAS18pettmeiAinDe3ZoLTFLNjpRzUVmafqYqRT21RyGLxxH1cyTz5ER2h5U5PYLewCdkVNwEbXsfH56dqyiD9", + null, + "ed25519:3bCdULXmujMamQiwfNnkvVjjbLDedDNdr9Mpcp7zrSAp32ZC5QWMuPFAv8tG8QFV9mdT1Yk3K25NLe32x9EhwU8N", + "ed25519:XM5mNvN284AwzhT1BPs7MTt4UeESpvp73LyYg5ZXizKXJpo1j1xaQbh45Dru74qVP7uZp599Zbyo5reTe1bK2yA", + null + ], + "inner_lite": { + "block_merkle_root": "5geZEhgh6CExgjagwJ99fgQtf5Ej6dHL6WNJ7fNXgG8c", + "epoch_id": "Fjn8T3phCCSCXSdjtQ4DqHGV86yeS2MQ92qcufCEpwbf", + "height": 154697976, + "next_bp_hash": "HiGgVkmWFuvHdLaBCrp7G5Q9yzmSrxmyA78QhoVqHHwS", + "next_epoch_id": "FgBfwcG3XMnWBkqu3xbYH8Guju8iBNJHJcvxdHsL6svr", + "outcome_root": "2DoUX6XsDr5BxRN821ZxTLYYcQBzSSxPMTqMU4TLfu35", + "prev_state_root": "J28Pfz9gHzXsChqW2U5ArTcMkTc1ATx6duk7rynkTnHZ", + "timestamp": 1705361606832234145, + "timestamp_nanosec": "1705361606832234145" + }, + "inner_rest_hash": "2VFJq5AJCKnnai6mZFYtCyn1ZM6GmB4w5Rjy1StE7HXE", + "next_block_inner_hash": "FFUJkMD1wEQYLH3JBrhKGBCySXVvsp79zUBZF4ifyHnE", + "next_bps": [ + { + "account_id": "node1", + "public_key": "ed25519:6DSjZ8mvsRZDvFqFxo8tCKePG96omXW7eVYVSySmDk8e", + "stake": "51980883591416601010719726777959", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "node2", + "public_key": "ed25519:GkDv7nSMS3xcqA45cpMvFmfV1o4fRF6zYo1JRR6mNqg5", + "stake": "51971204873229463484002611006028", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "node3", + "public_key": "ed25519:ydgzeXHJ5Xyt7M1gXLxqLBW1Ejx6scNV5Nx2pxFM8su", + "stake": "51916238539076580840311339695332", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "node0", + "public_key": "ed25519:7PGseFbWxvYVgZ89K1uTJKYoKetWs7BJtbyXDzfbAcqX", + "stake": "51822718099537070721488806689276", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "aurora.pool.f863973.m0", + "public_key": "ed25519:9c7mczZpNzJz98V1sDeGybfD4gMybP4JKHotH8RrrHTm", + "stake": "17895092803259114287724420293384", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "legends.pool.f863973.m0", + "public_key": "ed25519:AhQ6sUifJYgjqarXSAzdDZU9ZixpUesP9JEH1Vr7NbaF", + "stake": "16206556269879622555039863033060", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "01node.pool.f863973.m0", + "public_key": "ed25519:3iNqnvBgxJPXCxu6hNdvJso1PEAc1miAD35KQMBCA3aL", + "stake": "11173642795262854946815330034213", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "fastvalidator.pool.f863973.m0", + "public_key": "ed25519:93EQCbHLEY6cMuxDNe8LysWPy8zv5VsoqvHppMbMndpZ", + "stake": "10595469185547409447626687991414", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "kiln.pool.f863973.m0", + "public_key": "ed25519:Bq8fe1eUgDRexX2CYDMhMMQBiN13j8vTAVFyTNhEfh1W", + "stake": "7468217842007976196291671160040", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "stakely_v2.pool.f863973.m0", + "public_key": "ed25519:7BanKZKGvFjK5Yy83gfJ71vPhqRwsDDyVHrV2FMJCUWr", + "stake": "5538389871199320877264924449940", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "fastvalidator2.pool.f863973.m0", + "public_key": "ed25519:4BYnfLhhvNkcDe6U4W43uAqBXDaxM6DcN3YAbLKNUWSh", + "stake": "5303625497287173100081594363152", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "fastvalidator1.pool.f863973.m0", + "public_key": "ed25519:GSeKR7hJrgfBJ4FjS4GwQYaQzcVhuDun3PcjWZh4nGpT", + "stake": "5293330619752851761190952982195", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "chorusone.pool.f863973.m0", + "public_key": "ed25519:3TkUuDpzrq75KtJhkuLfNNJBPHR5QEWpDxrter3znwto", + "stake": "3831880671335147210435951074724", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "everstake.pool.f863973.m0", + "public_key": "ed25519:4LDN8tZUTRRc4siGmYCPA67tRyxStACDchdGDZYKdFsw", + "stake": "3425524339069666388552956739441", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "ni.pool.f863973.m0", + "public_key": "ed25519:GfCfFkLk2twbAWdsS3tr7C2eaiHN3znSfbshS5e8NqBS", + "stake": "3103415468246532541895473430716", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "foundryusa.pool.f863973.m0", + "public_key": "ed25519:ABGnMW8c87ZKWxvZLLWgvrNe72HN7UoSf4cTBxCHbEE5", + "stake": "2970579589997198167425850722035", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "chorus-one.pool.f863973.m0", + "public_key": "ed25519:6LFwyEEsqhuDxorWfsKcPPs324zLWTaoqk4o6RDXN7Qc", + "stake": "2700360401758961539837510871690", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "lunanova2.pool.f863973.m0", + "public_key": "ed25519:9Jv6e9Kye4wM9EL1XJvXY8CYsLi1HLdRKnTzXBQY44w9", + "stake": "2621863661185071626699112987798", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "valeraverim.pool.f863973.m0", + "public_key": "ed25519:3686ABqNUZc1qhLWLHg5xZpBzrWPiUCMNZxcCNmg3e2s", + "stake": "2470287532644478855780095683680", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "stakesstone.pool.f863973.m0", + "public_key": "ed25519:3aAdsKUuzZbjW9hHnmLWFRKwXjmcxsnLNLfNL4gP1wJ8", + "stake": "1885301783710511590471643861522", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "pathrocknetwork.pool.f863973.m0", + "public_key": "ed25519:CGzLGZEMb84nRSRZ7Au1ETAoQyN7SQXQi55fYafXq736", + "stake": "1716571825486169408513188183201", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "dsrvlabs.pool.f863973.m0", + "public_key": "ed25519:61ei2efmmLkeDR1CG6JDEC2U3oZCUuC2K1X16Vmxrud9", + "stake": "1582621122794136327048654501834", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "bee1stake.pool.f863973.m0", + "public_key": "ed25519:B7Mwy3sCCJ6GZzEojsKFXMjLQfVXPDC4Q1LjuHoZcyM6", + "stake": "951901472501611026961984404965", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "bisontrails.pool.f863973.m0", + "public_key": "ed25519:8g4P5EXyp2b2pfVMHY1QLfkRcY59hjPfWrFCKUWX3RmR", + "stake": "784547628028533758413173572394", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "pennyvalidators.pool.f863973.m0", + "public_key": "ed25519:HiHdwq9rxi9hyxaGkazDHbYu4XL1j3J4TjgHQioyhEva", + "stake": "454116002760902808255722029483", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "nw.pool.devnet", + "public_key": "ed25519:65XTtuthwFDL9LpK9FJystfEvJ6brtBpfYSnRMa5a2wN", + "stake": "351695500847678181284638315706", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "leadnode.pool.f863973.m0", + "public_key": "ed25519:CdP6CBFETfWYzrEedmpeqkR6rsJNeT22oUFn2mEDGk5i", + "stake": "222854945937138358386550711453", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "blueprint.pool.f863973.m0", + "public_key": "ed25519:DUfxa8EUaTQyVXgEm4NFCtiez7jsjbM3m838c7aRSEBn", + "stake": "138040049008009637755493563288", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "al3c5.pool.f863973.m0", + "public_key": "ed25519:BoYixTjyBePQ1VYP3s29rZfjtz1FLQ9og4FWZB5UgWCZ", + "stake": "113955994115662929112230612769", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "cymac.pool.f863973.m0", + "public_key": "ed25519:EzUKatz6stcg4pKA2HpwhQXhSDvef3Cxyo6zvsz87est", + "stake": "112870584143910008966689700738", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "p2p-org.pool.f863973.m0", + "public_key": "ed25519:5qyxefArHQfABdNv9ELuEiWcEo7DTzABM9LrMAKTCY3Z", + "stake": "100198001398444504508422270154", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "a41.pool.f863973.m0", + "public_key": "ed25519:Gzg8dYaeBe6ime9dsMKUFiRZeWLjQ3VHjBCbapjsCmUf", + "stake": "55030000541997702601700000000", + "validator_stake_struct_version": "V1" + } + ], + "prev_block_hash": "ATa5K9ofmjtLXsgkp2VNQhALi5hgJPmojMVQ1MtYUa8e" + } + } diff --git a/fixtures/test_2.json b/fixtures/test_2.json new file mode 100644 index 0000000..3e55f48 --- /dev/null +++ b/fixtures/test_2.json @@ -0,0 +1,235 @@ +{ + "last_block_hash": "EAUfcEw9BMjf1TqwqprD5rcMXbGrXmjdmmihLWEYbigA", + "body": { + "approvals_after_next": [ + "ed25519:EjkN3ekQRFPnAW9MFjTGE7ntb6V16spgMB6YYnejRzs6mzfbp6UB4ELHUR7tezZZyVL7AgAgAHwtHPBnJC6HHFf", + "ed25519:EPFUZAu9SXM8rm3JQMZdY4tF4nicUH8zPEdVnF96ukAZpHwFeUQKDLmrrWjopA95FhykvQTmuQUjYfNLTvDeXYi", + "ed25519:3uVsabfdcWDPeRK6yCinDWXonXxWhu6qv1MAHMHTYYsB6tcFCi3GLbdsddcdmTg2sDCbJUpkfwC51ZbUB7QATzx7", + "ed25519:fjdgPLhjDaLKQaUvPGuRkaAwUxFKA9rgkDT8uRQCqtts8oM3ZyS6gmkz53x3VLBFoWWDyM6aZCXQCvakpq1eEAe", + null, + null, + "ed25519:4kxomt3EQriQubccMgnUg9eQ5nkM7z4Fb3suA3nKQVc3D5P9HkvzN6wF5zEkvvG2TUELFDrCckbuLGFb38N4zDQc", + null, + null, + null, + null, + null, + "ed25519:5FVqGn2MK2CAWtzJmhPt9XktRvU9d6KNJ8BGST55qoKPJ9vZzADBDcW18iXHT8HqWixqBDLm5f9M46z2RSZoA64Z", + null, + "ed25519:4SHM7cVMmtpWcrJRcVLL5SU14WeyEpHGSEuvaU4hnr3NypKyekv6vMWdCU4DTTR6BoQjhYvtWXeqqZtMvPsJ9j7s", + null, + "ed25519:34EDE41YUxvrS6KSBkvM6VRMHzempoYawFt1bJrGLD9KRuYWJCJBQmt6axJuwh49tLpYMe4TCqw6Sq5C5kdDVzjY", + null, + null, + null, + null, + null, + null, + null, + "ed25519:5cEY3iPBcoooFKMds1zubY23yvfCaCARBm43Qv8xMrTuH6iPUW1Wjmvf8kc5SdC46HzBjYRXueZEURZuSQ5oeXnx", + null, + null, + null, + null, + "ed25519:5Z18ZBq9iQ3m6cZ8R3fsZ5ipJU81rqMmHnipstRfTX77AJshFCBpP8TxA8fK7aN44nrHdabncCJ9jFo6msWTzCnW", + null, + null + ], + "inner_lite": { + "block_merkle_root": "4Bo6a89Pr9AmKqBF54PExQ5J6QnuMgmac3SooXftFirj", + "epoch_id": "FgBfwcG3XMnWBkqu3xbYH8Guju8iBNJHJcvxdHsL6svr", + "height": 154741176, + "next_bp_hash": "2bg8kQAwnTYZetw6BRpWBvw69BSF9WE4Zws2bQgNyNcm", + "next_epoch_id": "EPpSEMnWuzHW4aTQ5hfAbkG4EyT8z7g9JvnUZH4yQFS5", + "outcome_root": "7Ntnzqbsmgg5g4vKGfyzR19ZswdXriYXzhzpCJgR89Zz", + "prev_state_root": "7ynM1RWwXiJtEVqFi9Zjn54FD9j7qU4wDNcBRLs9iPSu", + "timestamp": 1705388244771412430, + "timestamp_nanosec": "1705388244771412430" + }, + "inner_rest_hash": "VF86i5AC81TCtEfRfG1m4tZCz5DGt8FUYbiVfjajk4D", + "next_block_inner_hash": "HPX8ijJhWVtLh3cSupas2vudKFAZefvufA6zpxv5zoem", + "next_bps": [ + { + "account_id": "node1", + "public_key": "ed25519:6DSjZ8mvsRZDvFqFxo8tCKePG96omXW7eVYVSySmDk8e", + "stake": "51995849873243611939132459599779", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "node2", + "public_key": "ed25519:GkDv7nSMS3xcqA45cpMvFmfV1o4fRF6zYo1JRR6mNqg5", + "stake": "51986168368370021532730821376618", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "node3", + "public_key": "ed25519:ydgzeXHJ5Xyt7M1gXLxqLBW1Ejx6scNV5Nx2pxFM8su", + "stake": "51931186208367497781029863589354", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "node0", + "public_key": "ed25519:7PGseFbWxvYVgZ89K1uTJKYoKetWs7BJtbyXDzfbAcqX", + "stake": "51837638842520506321820685079720", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "aurora.pool.f863973.m0", + "public_key": "ed25519:9c7mczZpNzJz98V1sDeGybfD4gMybP4JKHotH8RrrHTm", + "stake": "17900245019402583650133465073632", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "legends.pool.f863973.m0", + "public_key": "ed25519:AhQ6sUifJYgjqarXSAzdDZU9ZixpUesP9JEH1Vr7NbaF", + "stake": "16211222444669702135933673463207", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "01node.pool.f863973.m0", + "public_key": "ed25519:3iNqnvBgxJPXCxu6hNdvJso1PEAc1miAD35KQMBCA3aL", + "stake": "11176821118717456771315953721266", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "fastvalidator.pool.f863973.m0", + "public_key": "ed25519:93EQCbHLEY6cMuxDNe8LysWPy8zv5VsoqvHppMbMndpZ", + "stake": "10598519821992269587094887938586", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "kiln.pool.f863973.m0", + "public_key": "ed25519:Bq8fe1eUgDRexX2CYDMhMMQBiN13j8vTAVFyTNhEfh1W", + "stake": "7470359030070502795722434017080", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "stakely_v2.pool.f863973.m0", + "public_key": "ed25519:7BanKZKGvFjK5Yy83gfJ71vPhqRwsDDyVHrV2FMJCUWr", + "stake": "5539984478778409079274412314443", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "fastvalidator2.pool.f863973.m0", + "public_key": "ed25519:4BYnfLhhvNkcDe6U4W43uAqBXDaxM6DcN3YAbLKNUWSh", + "stake": "5305152511612693872683364078590", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "fastvalidator1.pool.f863973.m0", + "public_key": "ed25519:GSeKR7hJrgfBJ4FjS4GwQYaQzcVhuDun3PcjWZh4nGpT", + "stake": "5294854669987962601093008353993", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "chorusone.pool.f863973.m0", + "public_key": "ed25519:3TkUuDpzrq75KtJhkuLfNNJBPHR5QEWpDxrter3znwto", + "stake": "3832983942424293301319485066620", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "everstake.pool.f863973.m0", + "public_key": "ed25519:4LDN8tZUTRRc4siGmYCPA67tRyxStACDchdGDZYKdFsw", + "stake": "3426510612590284723534740848915", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "ni.pool.f863973.m0", + "public_key": "ed25519:GfCfFkLk2twbAWdsS3tr7C2eaiHN3znSfbshS5e8NqBS", + "stake": "3104309000394639023138702227876", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "foundryusa.pool.f863973.m0", + "public_key": "ed25519:ABGnMW8c87ZKWxvZLLWgvrNe72HN7UoSf4cTBxCHbEE5", + "stake": "2971434876176689081354111194088", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "chorus-one.pool.f863973.m0", + "public_key": "ed25519:6LFwyEEsqhuDxorWfsKcPPs324zLWTaoqk4o6RDXN7Qc", + "stake": "2701137886711820880744418684468", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "lunanova2.pool.f863973.m0", + "public_key": "ed25519:9Jv6e9Kye4wM9EL1XJvXY8CYsLi1HLdRKnTzXBQY44w9", + "stake": "2622618545437785136715521089346", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "stakesstone.pool.f863973.m0", + "public_key": "ed25519:3aAdsKUuzZbjW9hHnmLWFRKwXjmcxsnLNLfNL4gP1wJ8", + "stake": "1885844597972525233055555116008", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "pathrocknetwork.pool.f863973.m0", + "public_key": "ed25519:CGzLGZEMb84nRSRZ7Au1ETAoQyN7SQXQi55fYafXq736", + "stake": "1717066059294035141561843218976", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "dsrvlabs.pool.f863973.m0", + "public_key": "ed25519:61ei2efmmLkeDR1CG6JDEC2U3oZCUuC2K1X16Vmxrud9", + "stake": "1583076789418337934155466345470", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "bee1stake.pool.f863973.m0", + "public_key": "ed25519:B7Mwy3sCCJ6GZzEojsKFXMjLQfVXPDC4Q1LjuHoZcyM6", + "stake": "952175543126836190103726170469", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "bisontrails.pool.f863973.m0", + "public_key": "ed25519:8g4P5EXyp2b2pfVMHY1QLfkRcY59hjPfWrFCKUWX3RmR", + "stake": "784773514321136890208157331616", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "pennyvalidators.pool.f863973.m0", + "public_key": "ed25519:HiHdwq9rxi9hyxaGkazDHbYu4XL1j3J4TjgHQioyhEva", + "stake": "454246751367119221511607975024", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "nw.pool.devnet", + "public_key": "ed25519:65XTtuthwFDL9LpK9FJystfEvJ6brtBpfYSnRMa5a2wN", + "stake": "351796760649730627846279409552", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "leadnode.pool.f863973.m0", + "public_key": "ed25519:CdP6CBFETfWYzrEedmpeqkR6rsJNeT22oUFn2mEDGk5i", + "stake": "222919110100903924760392563095", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "blueprint.pool.f863973.m0", + "public_key": "ed25519:DUfxa8EUaTQyVXgEm4NFCtiez7jsjbM3m838c7aRSEBn", + "stake": "138079793355047795768517097405", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "cymac.pool.f863973.m0", + "public_key": "ed25519:EzUKatz6stcg4pKA2HpwhQXhSDvef3Cxyo6zvsz87est", + "stake": "112903081724858326049928307120", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "p2p-org.pool.f863973.m0", + "public_key": "ed25519:5qyxefArHQfABdNv9ELuEiWcEo7DTzABM9LrMAKTCY3Z", + "stake": "100198001398444504508422270154", + "validator_stake_struct_version": "V1" + }, + { + "account_id": "a41.pool.f863973.m0", + "public_key": "ed25519:Gzg8dYaeBe6ime9dsMKUFiRZeWLjQ3VHjBCbapjsCmUf", + "stake": "55045849262927169777589487275", + "validator_stake_struct_version": "V1" + } + ], + "prev_block_hash": "EqCBWBif1xyr6pq4Kvr6s4aPhEMRqBerfDVBJp4GDDUG" + } +} diff --git a/fixtures/well_known_header.json b/fixtures/well_known_header.json deleted file mode 100644 index c21a06c..0000000 --- a/fixtures/well_known_header.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "height": 4, - "prev_height": 3, - "epoch_id": "11111111111111111111111111111111", - "next_epoch_id": "AuatKw3hiGmXed3uT2u4Die6ZRGZhEHn34kTyVpGnYLM", - "prev_hash": "BUcVEkMq3DcZzDGgeh1sb7FFuD86XYcXpEt25Cf34LuP", - "prev_state_root": "Bn786g4GdJJigSP4qRSaVCfeMotWVX88cV1LTZhD6o3z", - "chunk_receipts_root": "9ETNjrt6MkwTgSVMMbpukfxRshSD1avBUUa4R4NuqwHv", - "chunk_headers_root": "Fk7jeakmi8eruvv4L4ToKs7MV1YG64ETZtASQYjGBWK1", - "chunk_tx_root": "7tkzFg8RHBmMw1ncRJZCCZAizgq4rwCftTKYLce8RU8t", - "outcome_root": "7tkzFg8RHBmMw1ncRJZCCZAizgq4rwCftTKYLce8RU8t", - "chunks_included": 1, - "challenges_root": "11111111111111111111111111111111", - "timestamp": 1642022757141096960, - "timestamp_nanosec": "1642022757141096960", - "random_value": "GxYrjCxQtfG2K7hX6w4aPs3usTskzfCkbVc2icSQMF7h", - "validator_proposals": [], - "chunk_mask": [ - true - ], - "gas_price": "1000000000", - "block_ordinal": 4, - "rent_paid": "0", - "validator_reward": "0", - "total_supply": "3000000000000000000000000000000000", - "challenges_result": [], - "last_final_block": "GTudmqKJQjEVCrdi31vcHqXoEpvEScmZ9BhBf3gPJ4pp", - "last_ds_final_block": "BUcVEkMq3DcZzDGgeh1sb7FFuD86XYcXpEt25Cf34LuP", - "next_bp_hash": "236RGxQc2xSqukyiBkixtZSqKu679ZxeS6vP8zzAL9vW", - "block_merkle_root": "Gf3uWgULzc5WDuaAq4feehh7M1TFRFxTWVv2xH6AsnpA", - "epoch_sync_data_hash": "4JTQn5LGcxdx4xstsAXgXHcP3oHKatzdzHBw6atBDSWV", - "approvals": [ - "ed25519:5Jdeg8rk5hAbcooyxXQSTcxBgUK39Z8Qtfkhqmpi26biU26md5wBiFvkAEGXrMyn3sgq3cTMG8Lr3HD7RxWPjkPh", - "ed25519: 4vqTaN6bucu6ALsb1m15e8HWGGxLQeKJhWrcU8zPRrzfkZbakaSzW8rfas2ZG89rFKheZUyrnZRKooRny6YKFyKi" - ], - "signature": "ed25519:5mGi9dyuyt7TnSpPFjbEWSJThDdiEV9NNQB11knXvRbxSv8XfBT5tdVVFypeqpZjeB3fD7qgJpWhTj3KvdGbcXdu", - "latest_protocol_version": 50 -} \ No newline at end of file diff --git a/flake.nix b/flake.nix index b5e880b..62207a2 100644 --- a/flake.nix +++ b/flake.nix @@ -37,6 +37,9 @@ llvmPackages_11.libclang protobuf + nodejs + solc + ]; buildInputs = with pkgs; [ (rustVersion.override { extensions = [ "rust-src" ]; }) diff --git a/nearx/Cargo.lock b/nearx/Cargo.lock new file mode 100644 index 0000000..2663cd2 --- /dev/null +++ b/nearx/Cargo.lock @@ -0,0 +1,4581 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addchain" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" +dependencies = [ + "num-bigint 0.3.3", + "num-integer", + "num-traits", +] + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aes" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +dependencies = [ + "cfg-if", + "const-random", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +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.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" + +[[package]] +name = "array-macro" +version = "2.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "220a2c618ab466efe41d0eace94dfeff1c35e3aa47891bdb95e1c0fefffd3c99" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "async-trait" +version = "0.1.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[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 = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borsh" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d4d6dafc1a3bb54687538972158f07b2c948bc57d5890df22c0739098b3028" +dependencies = [ + "cfg_aliases", +] + +[[package]] +name = "bs58" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +dependencies = [ + "sha2", + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +dependencies = [ + "serde", +] + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "chrono" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.48.5", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clap" +version = "4.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52bdc885e4cacc7f7c9eedc1ef6da641603180c783c41a15c264944deeaab642" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "clap_lex" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + +[[package]] +name = "coins-bip32" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" +dependencies = [ + "bs58", + "coins-core", + "digest", + "hmac", + "k256", + "serde", + "sha2", + "thiserror", +] + +[[package]] +name = "coins-bip39" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" +dependencies = [ + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2 0.12.2", + "rand", + "sha2", + "thiserror", +] + +[[package]] +name = "coins-core" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" +dependencies = [ + "base64 0.21.5", + "bech32", + "bs58", + "digest", + "generic-array", + "hex", + "ripemd", + "serde", + "serde_derive", + "sha2", + "sha3", + "thiserror", +] + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "const-hex" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5104de16b218eddf8e34ffe2f86f74bfa4e61e95a1b89732fccf6325efd0557" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-random" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aaf16c9c2c612020bcfd042e170f6e32de9b9d75adb5277cdbbd2e2c8c8299a" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +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-deque" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curta" +version = "0.1.0" +source = "git+https://github.com/succinctlabs/curta.git#59e489d21622a92b25a2e4a5b710ce322f309b87" +dependencies = [ + "anyhow", + "bincode", + "curve25519-dalek", + "env_logger 0.9.3", + "hex", + "itertools 0.10.5", + "log", + "num", + "plonky2", + "plonky2_maybe_rayon 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", + "serde", + "subtle-encoding", +] + +[[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", + "fiat-crypto", + "platforms", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.48", +] + +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +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 0.48.0", +] + +[[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 = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ena" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" +dependencies = [ + "log", +] + +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enr" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe81b5c06ecfdbc71dd845216f225f53b62a10cb8a16c946836a3467f701d05b" +dependencies = [ + "base64 0.21.5", + "bytes", + "hex", + "k256", + "log", + "rand", + "rlp", + "serde", + "sha3", + "zeroize", +] + +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "env_logger" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" +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 = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "eth-keystore" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" +dependencies = [ + "aes", + "ctr", + "digest", + "hex", + "hmac", + "pbkdf2 0.11.0", + "rand", + "scrypt", + "serde", + "serde_json", + "sha2", + "sha3", + "thiserror", + "uuid 0.8.2", +] + +[[package]] +name = "ethabi" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" +dependencies = [ + "ethereum-types", + "hex", + "once_cell", + "regex", + "serde", + "serde_json", + "sha3", + "thiserror", + "uint", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash 0.8.0", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash 0.8.0", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types 0.12.2", + "scale-info", + "uint", +] + +[[package]] +name = "ethers" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5344eea9b20effb5efeaad29418215c4d27017639fd1f908260f59cbbd226e" +dependencies = [ + "ethers-addressbook", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-middleware", + "ethers-providers", + "ethers-signers", + "ethers-solc", +] + +[[package]] +name = "ethers-addressbook" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c405f24ea3a517899ba7985385c43dc4a7eb1209af3b1e0a1a32d7dcc7f8d09" +dependencies = [ + "ethers-core", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "ethers-contract" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0111ead599d17a7bff6985fd5756f39ca7033edc79a31b23026a8d5d64fa95cd" +dependencies = [ + "const-hex", + "ethers-contract-abigen", + "ethers-contract-derive", + "ethers-core", + "ethers-providers", + "futures-util", + "once_cell", + "pin-project", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "ethers-contract-abigen" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51258120c6b47ea9d9bec0d90f9e8af71c977fbefbef8213c91bfed385fe45eb" +dependencies = [ + "Inflector", + "const-hex", + "dunce", + "ethers-core", + "ethers-etherscan", + "eyre", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "reqwest", + "serde", + "serde_json", + "syn 2.0.48", + "toml", + "walkdir", +] + +[[package]] +name = "ethers-contract-derive" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936e7a0f1197cee2b62dc89f63eff3201dbf87c283ff7e18d86d38f83b845483" +dependencies = [ + "Inflector", + "const-hex", + "ethers-contract-abigen", + "ethers-core", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.48", +] + +[[package]] +name = "ethers-core" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f03e0bdc216eeb9e355b90cf610ef6c5bb8aca631f97b5ae9980ce34ea7878d" +dependencies = [ + "arrayvec", + "bytes", + "cargo_metadata", + "chrono", + "const-hex", + "elliptic-curve", + "ethabi", + "generic-array", + "k256", + "num_enum", + "once_cell", + "open-fastrlp", + "rand", + "rlp", + "serde", + "serde_json", + "strum", + "syn 2.0.48", + "tempfile", + "thiserror", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "ethers-etherscan" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abbac2c890bdbe0f1b8e549a53b00e2c4c1de86bb077c1094d1f38cdf9381a56" +dependencies = [ + "chrono", + "ethers-core", + "reqwest", + "semver", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "ethers-middleware" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681ece6eb1d10f7cf4f873059a77c04ff1de4f35c63dd7bccde8f438374fcb93" +dependencies = [ + "async-trait", + "auto_impl", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-providers", + "ethers-signers", + "futures-channel", + "futures-locks", + "futures-util", + "instant", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "tracing-futures", + "url", +] + +[[package]] +name = "ethers-providers" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25d6c0c9455d93d4990c06e049abf9b30daf148cf461ee939c11d88907c60816" +dependencies = [ + "async-trait", + "auto_impl", + "base64 0.21.5", + "bytes", + "const-hex", + "enr", + "ethers-core", + "futures-core", + "futures-timer", + "futures-util", + "hashers", + "http", + "instant", + "jsonwebtoken", + "once_cell", + "pin-project", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-tungstenite", + "tracing", + "tracing-futures", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "ws_stream_wasm", +] + +[[package]] +name = "ethers-signers" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cb1b714e227bbd2d8c53528adb580b203009728b17d0d0e4119353aa9bc5532" +dependencies = [ + "async-trait", + "coins-bip32", + "coins-bip39", + "const-hex", + "elliptic-curve", + "eth-keystore", + "ethers-core", + "rand", + "sha2", + "thiserror", + "tracing", +] + +[[package]] +name = "ethers-solc" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a64f710586d147864cff66540a6d64518b9ff37d73ef827fee430538265b595f" +dependencies = [ + "cfg-if", + "const-hex", + "dirs", + "dunce", + "ethers-core", + "glob", + "home", + "md-5", + "num_cpus", + "once_cell", + "path-slash", + "rayon", + "regex", + "semver", + "serde", + "serde_json", + "solang-parser", + "svm-rs", + "thiserror", + "tiny-keccak", + "tokio", + "tracing", + "walkdir", + "yansi", +] + +[[package]] +name = "eyre" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6267a1fa6f59179ea4afc8e50fd8612a3cc60bc858f786ff877a4a8cb042799" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec", + "byteorder", + "ff_derive", + "rand_core", + "subtle", +] + +[[package]] +name = "ff_derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f54704be45ed286151c5e11531316eaef5b8f5af7d597b806fdb8af108d84a" +dependencies = [ + "addchain", + "cfg-if", + "num-bigint 0.3.3", + "num-integer", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" + +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "static_assertions", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-locks" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" +dependencies = [ + "futures-channel", + "futures-task", +] + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[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 0.4.0", +] + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[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 = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.1.0", + "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.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "rayon", + "serde", +] + +[[package]] +name = "hashers" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +dependencies = [ + "fxhash", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "http" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[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.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +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.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls", + "tokio", + "tokio-rustls", +] + +[[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.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +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-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[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" +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", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", + "serde", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "is-terminal" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" +dependencies = [ + "hermit-abi 0.3.3", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "jobserver" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.5", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "k256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f01b677d82ef7a676aa37e099defd83a28e15687112cafdd112d60236b6115b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2bd4c29270e724d3eaadf7bdc8700af4221fc0ed771b855eadcd1b98d52851" +dependencies = [ + "primitive-types 0.10.1", + "tiny-keccak", +] + +[[package]] +name = "lalrpop" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da4081d44f4611b66c6dd725e6de3169f9f63905421e8626fcb86b6a898998b8" +dependencies = [ + "ascii-canvas", + "bit-set", + "diff", + "ena", + "is-terminal", + "itertools 0.10.5", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax 0.7.5", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "lalrpop-util" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" + +[[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.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[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 = "near-light-client-circuits" +version = "0.1.0" +dependencies = [ + "borsh", + "plonky2", + "plonky2x", + "serde", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "num" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" +dependencies = [ + "num-bigint 0.4.4", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", + "rand", +] + +[[package]] +name = "num-complex" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +dependencies = [ + "num-traits", + "rand", +] + +[[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-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint 0.4.4", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.3", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 3.0.0", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "ethereum-types", + "open-fastrlp-derive", +] + +[[package]] +name = "open-fastrlp-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +dependencies = [ + "bytes", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "openssl" +version = "0.10.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" +dependencies = [ + "bitflags 2.4.1", + "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.48", +] + +[[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.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" +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 = "parity-scale-codec" +version = "3.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" +dependencies = [ + "proc-macro-crate 2.0.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", + "hmac", + "password-hash", + "sha2", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap 2.1.0", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[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.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" + +[[package]] +name = "platforms" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" + +[[package]] +name = "plonky2" +version = "0.1.4" +source = "git+https://github.com/mir-protocol/plonky2.git#3e61f06a1d2012785c65f1708620cf399857ac8d" +dependencies = [ + "ahash", + "anyhow", + "getrandom", + "hashbrown 0.14.3", + "itertools 0.11.0", + "keccak-hash", + "log", + "num", + "plonky2_field", + "plonky2_maybe_rayon 0.1.1 (git+https://github.com/mir-protocol/plonky2.git)", + "plonky2_util", + "rand", + "rand_chacha", + "serde", + "serde_json", + "static_assertions", + "unroll", +] + +[[package]] +name = "plonky2_field" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git#3e61f06a1d2012785c65f1708620cf399857ac8d" +dependencies = [ + "anyhow", + "itertools 0.11.0", + "num", + "plonky2_util", + "rand", + "serde", + "static_assertions", + "unroll", +] + +[[package]] +name = "plonky2_maybe_rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194db0cbdd974e92d897cd92b74adb3968dc1b967315eb280357c49a7637994e" +dependencies = [ + "rayon", +] + +[[package]] +name = "plonky2_maybe_rayon" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git#3e61f06a1d2012785c65f1708620cf399857ac8d" +dependencies = [ + "rayon", +] + +[[package]] +name = "plonky2_util" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git#3e61f06a1d2012785c65f1708620cf399857ac8d" + +[[package]] +name = "plonky2x" +version = "0.1.0" +source = "git+https://github.com/succinctlabs/succinctx.git#abd43565ef519da40d73240557cec95d962aa257" +dependencies = [ + "anyhow", + "array-macro", + "async-trait", + "backtrace", + "base64 0.13.1", + "bincode", + "clap", + "curta", + "curve25519-dalek", + "digest", + "dotenv", + "ed25519-dalek", + "env_logger 0.10.1", + "ethers", + "ff", + "futures", + "hex", + "itertools 0.10.5", + "lazy_static", + "log", + "num", + "num-bigint 0.4.4", + "plonky2", + "plonky2x-derive", + "rand", + "reqwest", + "serde", + "serde_json", + "serde_plain", + "serde_with", + "sha2", + "sha256", + "tokio", + "tracing", + "uuid 1.6.1", +] + +[[package]] +name = "plonky2x-derive" +version = "0.1.0" +source = "git+https://github.com/succinctlabs/succinctx.git#abd43565ef519da40d73240557cec95d962aa257" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" +dependencies = [ + "proc-macro2", + "syn 2.0.48", +] + +[[package]] +name = "primitive-types" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" +dependencies = [ + "fixed-hash 0.7.0", + "uint", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash 0.8.0", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", +] + +[[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.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +dependencies = [ + "toml_edit 0.20.7", +] + +[[package]] +name = "proc-macro-crate" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b2685dd208a3771337d8d386a89840f0f43cd68be8dae90a5f8c2384effc9cd" +dependencies = [ + "toml_edit 0.21.0", +] + +[[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.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +dependencies = [ + "bitflags 2.4.1", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax 0.8.2", + "unarray", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +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 = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "reqwest" +version = "0.11.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" +dependencies = [ + "base64 0.21.5", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +dependencies = [ + "cc", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rlp-derive", + "rustc-hex", +] + +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +dependencies = [ + "log", + "ring 0.17.7", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.5", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.7", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scale-info" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +dependencies = [ + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scrypt" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" +dependencies = [ + "hmac", + "pbkdf2 0.11.0", + "salsa20", + "sha2", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.7", + "untrusted 0.9.0", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +dependencies = [ + "serde", +] + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.195" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.195" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "serde_json" +version = "1.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_plain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1fc6db65a611022b23a0dec6975d63fb80a302cb3388835ff02c097258d50" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +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_with" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +dependencies = [ + "base64 0.21.5", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.1.0", + "serde", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha256" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18278f6a914fa3070aa316493f7d2ddfb9ac86ebc06fa3b83bffda487e9065b0" +dependencies = [ + "async-trait", + "bytes", + "hex", + "sha2", + "tokio", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint 0.4.4", + "num-traits", + "thiserror", + "time", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "solang-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" +dependencies = [ + "itertools 0.11.0", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror", + "unicode-xid", +] + +[[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" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.48", +] + +[[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 = "svm-rs" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20689c7d03b6461b502d0b95d6c24874c7d24dea2688af80486a130a06af3b07" +dependencies = [ + "dirs", + "fs2", + "hex", + "once_cell", + "reqwest", + "semver", + "serde", + "serde_json", + "sha2", + "thiserror", + "url", + "zip", +] + +[[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.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall", + "rustix", + "windows-sys 0.52.0", +] + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "time" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +dependencies = [ + "deranged", + "itoa", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +dependencies = [ + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "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.35.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.21.0", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +dependencies = [ + "indexmap 2.1.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[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.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand", + "rustls", + "sha1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" + +[[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 = "unroll" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad948c1cb799b1a70f836077721a92a35ac177d4daddf4c20a633786d4cf618" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", + "serde", +] + +[[package]] +name = "uuid" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +dependencies = [ + "serde", +] + +[[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 = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" + +[[package]] +name = "web-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +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-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "winnow" +version = "0.5.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7520bbdec7211caa7c4e682eb1fbe07abe20cee6756b6e00f537c82c11816aa" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version", + "send_wrapper 0.6.0", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.9+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/nearx/Cargo.toml b/nearx/Cargo.toml new file mode 100644 index 0000000..39b5d10 --- /dev/null +++ b/nearx/Cargo.toml @@ -0,0 +1,44 @@ +[package] +description = "A ZK light client for NEAR" +edition.workspace = true +name = "near-light-clientx" +resolver = "2" +version.workspace = true + +[dependencies] +async-trait.workspace = true +borsh.workspace = true +cfg-if = "1.0.0" +ethers = "2.0.11" +hex.workspace = true +log.workspace = true +pretty_assertions = "1.4.0" +serde.workspace = true + +# Circuit related things +plonky2 = { git = "https://github.com/mir-protocol/plonky2.git" } +plonky2x = { git = "https://github.com/succinctlabs/succinctx.git" } + +near-light-client-protocol.workspace = true +near-light-client-rpc.workspace = true + +[dev-dependencies] +borsh.workspace = true +near-primitives.workspace = true +pretty_env_logger.workspace = true +serde_json.workspace = true +serial_test = "3" +test-utils.workspace = true +tokio.workspace = true + +[features] +default = [ "testnet" ] + +# FIXME: these features are not great - will be replaced by a full fledged operator +# Network features +mainnet = [ ] +testnet = [ ] + +# Circuit features +sync = [ ] +verify = [ ] diff --git a/nearx/contract/README.md b/nearx/contract/README.md new file mode 100644 index 0000000..9265b45 --- /dev/null +++ b/nearx/contract/README.md @@ -0,0 +1,66 @@ +## Foundry + +**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** + +Foundry consists of: + +- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). +- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. +- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. +- **Chisel**: Fast, utilitarian, and verbose solidity REPL. + +## Documentation + +https://book.getfoundry.sh/ + +## Usage + +### Build + +```shell +$ forge build +``` + +### Test + +```shell +$ forge test +``` + +### Format + +```shell +$ forge fmt +``` + +### Gas Snapshots + +```shell +$ forge snapshot +``` + +### Anvil + +```shell +$ anvil +``` + +### Deploy + +```shell +$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key +``` + +### Cast + +```shell +$ cast +``` + +### Help + +```shell +$ forge --help +$ anvil --help +$ cast --help +``` diff --git a/nearx/contract/foundry.toml b/nearx/contract/foundry.toml new file mode 100644 index 0000000..f78b70d --- /dev/null +++ b/nearx/contract/foundry.toml @@ -0,0 +1,8 @@ +[profile.default] +fs_permissions = [ { access = "read", path = "./broadcast" } ] +libs = [ "lib" ] +optimizer = true +optimizer-runs = 1_000_000 +out = "out" +remappings = [ "@openzeppelin/contracts=lib/openzeppelin-contracts/contracts", "@openzeppelin/contracts-upgradeable=lib/openzeppelin-contracts-upgradeable/contracts" ] +src = "src" diff --git a/nearx/contract/lib/forge-std b/nearx/contract/lib/forge-std new file mode 160000 index 0000000..ae570fe --- /dev/null +++ b/nearx/contract/lib/forge-std @@ -0,0 +1 @@ +Subproject commit ae570fec082bfe1c1f45b0acca4a2b4f84d345ce diff --git a/nearx/contract/lib/foundry-devops b/nearx/contract/lib/foundry-devops new file mode 160000 index 0000000..efe8780 --- /dev/null +++ b/nearx/contract/lib/foundry-devops @@ -0,0 +1 @@ +Subproject commit efe8780bb039b6d25642951764aac63fafd8faf1 diff --git a/nearx/contract/lib/openzeppelin-contracts b/nearx/contract/lib/openzeppelin-contracts new file mode 160000 index 0000000..3def8f9 --- /dev/null +++ b/nearx/contract/lib/openzeppelin-contracts @@ -0,0 +1 @@ +Subproject commit 3def8f9d15871160a146353b975ad7adf4c2bf67 diff --git a/nearx/contract/lib/openzeppelin-contracts-upgradeable b/nearx/contract/lib/openzeppelin-contracts-upgradeable new file mode 160000 index 0000000..f0fa8a3 --- /dev/null +++ b/nearx/contract/lib/openzeppelin-contracts-upgradeable @@ -0,0 +1 @@ +Subproject commit f0fa8a3d12015e5fa08efeadd8014d0aa3791ea2 diff --git a/nearx/contract/lib/solidity-bytes-utils b/nearx/contract/lib/solidity-bytes-utils new file mode 160000 index 0000000..e0115c4 --- /dev/null +++ b/nearx/contract/lib/solidity-bytes-utils @@ -0,0 +1 @@ +Subproject commit e0115c4d231910df47ce3b60625ce562fe4af985 diff --git a/nearx/contract/script/Deploy.s.sol b/nearx/contract/script/Deploy.s.sol new file mode 100644 index 0000000..4e3042a --- /dev/null +++ b/nearx/contract/script/Deploy.s.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.19; + +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {NearX} from "../src/NearX.sol"; +import {Script} from "forge-std/Script.sol"; + +contract Deploy is Script { + function setUp() public {} + + function run() external returns (address) { + address proxy = deployNearX(); + return proxy; + } + + function deployNearX() public returns (address) { + vm.startBroadcast(); + + NearX lightClient = new NearX(); + + ERC1967Proxy proxy = new ERC1967Proxy(address(lightClient), ""); + + lightClient.initialize(); + + vm.stopBroadcast(); + return address(proxy); + } +} diff --git a/nearx/contract/script/Initialise.s.sol b/nearx/contract/script/Initialise.s.sol new file mode 100644 index 0000000..2a78171 --- /dev/null +++ b/nearx/contract/script/Initialise.s.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.19; + +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {NearX} from "../src/NearX.sol"; +import {Script} from "forge-std/Script.sol"; +import {DevOpsTools} from "lib/foundry-devops/src/DevOpsTools.sol"; + +// TODO: scripts need to support multiple envs +contract Initialise is Script { + function setUp() public {} + + function run() external { + address proxyAddress = DevOpsTools.get_most_recent_deployment( + "ERC1967Proxy", + block.chainid + ); + vm.startBroadcast(); + NearX lightClient = NearX(payable(proxyAddress)); + + // Succinct's goerli gateway + address initialGateway = 0x6e4f1e9eA315EBFd69d18C2DB974EEf6105FB803; + lightClient.updateGateway(initialGateway); + + bytes32 syncFunctionId = vm.envBytes32("SYNC_FUNCTION_ID"); + lightClient.updateSyncId(syncFunctionId); + + bytes32 verifyFunctionId = vm.envBytes32("VERIFY_FUNCTION_ID"); + lightClient.updateVerifyId(verifyFunctionId); + + bytes32 header = vm.envBytes32("NEAR_CHECKPOINT_HEADER_HASH"); + lightClient.setCheckpointHeader(header); + + vm.stopBroadcast(); + } +} diff --git a/nearx/contract/script/Upgrade.s.sol b/nearx/contract/script/Upgrade.s.sol new file mode 100644 index 0000000..5a654af --- /dev/null +++ b/nearx/contract/script/Upgrade.s.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {Script} from "forge-std/Script.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {DevOpsTools} from "lib/foundry-devops/src/DevOpsTools.sol"; +import {NearX} from "../src/NearX.sol"; + +contract Upgrade is Script { + function run() external returns (address) { + address mostRecentlyDeployedProxy = DevOpsTools + .get_most_recent_deployment("ERC1967Proxy", block.chainid); + vm.startBroadcast(); + + NearX newAddress = new NearX(); + + vm.stopBroadcast(); + address proxy = upgrade(mostRecentlyDeployedProxy, address(newAddress)); + return proxy; + } + + function upgrade(address proxyAddress, address newAddress) + public + returns (address) + { + vm.startBroadcast(); + + NearX proxy = NearX(payable(proxyAddress)); + proxy.upgradeToAndCall(address(newAddress), ""); + + vm.stopBroadcast(); + return address(proxy); + } +} diff --git a/nearx/contract/script/Verify.s.sol b/nearx/contract/script/Verify.s.sol new file mode 100644 index 0000000..0b9f306 --- /dev/null +++ b/nearx/contract/script/Verify.s.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {Script} from "forge-std/Script.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {DevOpsTools} from "lib/foundry-devops/src/DevOpsTools.sol"; +import {NearX, TransactionOrReceiptId} from "../src/NearX.sol"; + +contract Verify is Script { + function run() external { + address proxyAddress = DevOpsTools.get_most_recent_deployment( + "ERC1967Proxy", + block.chainid + ); + TransactionOrReceiptId[] memory ids = new TransactionOrReceiptId[](2); + + ids[0].isTransaction = true; + bytes32 txId = hex"2c53bcfe871da28decc45c3437f5864568d91af6d990dbc2662f11ce44c18d79"; + ids[0].id = txId; + bytes + memory txAccount = hex"7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c"; + ids[0].account = txAccount; + + ids[1].isTransaction = false; + bytes32 rxId = hex"7ff581f8517ec58459099a5af2465d5232fdcdd7c4da9c3d42a887bf6bd5457e"; + ids[1].id = rxId; + bytes + memory rxAccount = hex"70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c"; + ids[1].account = rxAccount; + + vm.startBroadcast(); + + NearX lightClient = NearX(payable(proxyAddress)); + + lightClient.requestVerify(ids); + + vm.stopBroadcast(); + } +} diff --git a/nearx/contract/src/NearX.sol b/nearx/contract/src/NearX.sol new file mode 100644 index 0000000..3fb5e28 --- /dev/null +++ b/nearx/contract/src/NearX.sol @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {ISuccinctGateway} from "./interfaces/ISuccinctGateway.sol"; +import {INearX, TransactionOrReceiptId, ProofVerificationResult, encodePackedIds, decodePackedIds, decodePackedResults} from "./interfaces/INearX.sol"; + +/// @notice The NearX contract is a light client for Near. +contract NearX is INearX, Initializable, OwnableUpgradeable, UUPSUpgradeable { + uint32 public constant DEFAULT_GAS_LIMIT = 1000000; + + /// @notice The address of the gateway contract. + address public gateway; + + constructor() { + _disableInitializers(); + } + + function initialize() public initializer { + __Ownable_init(msg.sender); + __UUPSUpgradeable_init(); + } + + function _authorizeUpgrade(address newImplementation) + internal + override + onlyOwner + {} + + /// @notice Sync function id. + bytes32 public syncFunctionId; + + /// @notice Verify function id. + bytes32 public verifyFunctionId; + + /// @notice The latest header that has been committed. + bytes32 public latestHeader; + + function updateGateway(address _gateway) external onlyOwner { + gateway = _gateway; + } + + function updateSyncId(bytes32 _functionId) external onlyOwner { + syncFunctionId = _functionId; + } + + function updateVerifyId(bytes32 _functionId) external onlyOwner { + verifyFunctionId = _functionId; + } + + /// Note: Only for testnet. The genesis header should be set when initializing the contract. + function setCheckpointHeader(bytes32 _header) external onlyOwner { + latestHeader = _header; + } + + function ensureInitialized() internal view { + if (gateway == address(0)) { + revert GatewayNotInitialised(); + } + if (syncFunctionId == bytes32(0) || verifyFunctionId == bytes32(0)) { + revert FunctionIdsNotInitialised(); + } + if (latestHeader == bytes32(0)) { + revert HeaderNotInitialised(); + } + } + + /// @notice Inputs of a sync request. + function requestSync() external payable { + ensureInitialized(); + bytes memory context; + + ISuccinctGateway(gateway).requestCallback{value: msg.value}( + syncFunctionId, + abi.encodePacked(latestHeader), + context, + NearX.handleSync.selector, + DEFAULT_GAS_LIMIT + ); + + emit SyncRequested(latestHeader); + } + + function handleSync(bytes memory _output, bytes memory _context) external { + if (msg.sender != gateway || !ISuccinctGateway(gateway).isCallback()) { + revert NotFromSuccinctGateway(msg.sender); + } + + bytes32 targetHeader = abi.decode(_output, (bytes32)); + + latestHeader = targetHeader; + + emit HeadUpdate(targetHeader); + } + + function requestVerify(TransactionOrReceiptId[] memory ids) + external + payable + { + ensureInitialized(); + bytes memory context; + bytes memory input = abi.encodePacked( + latestHeader, + encodePackedIds(ids) + ); + + ISuccinctGateway(gateway).requestCallback{value: msg.value}( + verifyFunctionId, + input, + context, + NearX.handleVerify.selector, + DEFAULT_GAS_LIMIT + ); + + emit VerifyRequested(latestHeader, ids); + } + + function handleVerify(bytes calldata _output, bytes memory _context) + external + { + if (msg.sender != gateway || !ISuccinctGateway(gateway).isCallback()) { + revert NotFromSuccinctGateway(msg.sender); + } + ProofVerificationResult[] memory results = decodePackedResults(_output); + emit VerifyResult(results); + } +} diff --git a/nearx/contract/src/interfaces/Bytes.sol b/nearx/contract/src/interfaces/Bytes.sol new file mode 100644 index 0000000..7ce2504 --- /dev/null +++ b/nearx/contract/src/interfaces/Bytes.sol @@ -0,0 +1,151 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (utils/Bytes.sol) +pragma solidity ^0.8.4; + +/** + * @dev Provides a set of functions to operate with packed data in bytes array. + * + * _Available since v4.8.1 + */ +library Bytes { + /** + * @dev Read uint from input bytes array + */ + function _readUint( + bytes memory input, + uint256 offset, + uint256 length + ) private pure returns (uint256 result) { + require(offset + length <= input.length, "Bytes: Out of range"); + assembly { + // Read 256 bits at the given offset + result := mload(add(add(input, 0x20), offset)) + } + } + + /** + * @dev Convert bytes to bytes32 array + */ + function toBytes32Array(bytes memory input) + internal + pure + returns (bytes32[] memory) + { + require(input.length % 32 == 0, "Bytes: Invalid input length"); + bytes32[] memory result = new bytes32[](input.length / 32); + assembly { + // Read length of input + let length := mload(input) + + // Seek offset to the beginning + let offset := add(input, 0x20) + + // Point result offset to the beginging + let resultOffset := add(result, 0x20) + + for { + let i := 0 + } lt(i, length) { + i := add(i, 0x20) + } { + // Copy 32 bytes to bytes32 array + mstore(resultOffset, mload(add(offset, i))) + // resultOffset += 32 + resultOffset := add(resultOffset, 0x20) + } + } + return result; + } + + /** + * @dev Read sub bytes array from input bytes array + */ + function readBytes( + bytes memory input, + uint256 offset, + uint256 length + ) internal pure returns (bytes memory result, uint256 nextOffset) { + nextOffset = offset + length; + require(nextOffset <= input.length, "Bytes: Out of range"); + result = new bytes(length); + assembly { + // Set seek to the given offset of the input + let seek := add(add(input, 0x20), offset) + let resultOffset := add(result, 0x20) + + for { + let i := 0 + } lt(i, length) { + i := add(i, 0x20) + } { + mstore(add(resultOffset, i), mload(add(seek, i))) + } + } + } + + /** + * @dev Read uint256 from input bytes array + */ + function readUint256(bytes memory input, uint256 offset) + internal + pure + returns (uint256 result, uint256 nextOffset) + { + return (_readUint(input, offset, 32), offset + 32); + } + + /** + * @dev Read uint160 from input bytes array + */ + function readUint160(bytes memory input, uint256 offset) + internal + pure + returns (uint160 result, uint256 nextOffset) + { + return (uint160(_readUint(input, offset, 20) >> 96), offset + 20); + } + + /** + * @dev Read uint128 from input bytes array + */ + function readUint128(bytes memory input, uint256 offset) + internal + pure + returns (uint128 result, uint256 nextOffset) + { + return (uint128(_readUint(input, offset, 16) >> 128), offset + 16); + } + + /** + * @dev Read uint64 from input bytes array + */ + function readUint64(bytes memory input, uint256 offset) + internal + pure + returns (uint64 result, uint256 nextOffset) + { + return (uint64(_readUint(input, offset, 8) >> 192), offset + 8); + } + + /** + * @dev Read uint32 from input bytes array + */ + function readUint32(bytes memory input, uint256 offset) + internal + pure + returns (uint32 result, uint256 nextOffset) + { + return (uint32(_readUint(input, offset, 4) >> 224), offset + 4); + } + + /** + * @dev Read uint16 from input bytes array + */ + function readUint16(bytes memory input, uint256 offset) + internal + pure + returns (uint16 result, uint256 nextOffset) + { + return (uint16(_readUint(input, offset, 2) >> 240), offset + 2); + } +} diff --git a/nearx/contract/src/interfaces/INearX.sol b/nearx/contract/src/interfaces/INearX.sol new file mode 100644 index 0000000..db3f8f4 --- /dev/null +++ b/nearx/contract/src/interfaces/INearX.sol @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./Bytes.sol"; + +interface INearX { + /// @notice Emits event with the new head update. + event HeadUpdate(bytes32 headerHash); + + /// @notice Inputs of a sync request. + /// @param trustedHeader The header hash of the trusted block. + event SyncRequested(bytes32 indexed trustedHeader); + + /// @notice Inputs of a verify request. + /// @param trustedHeader The header hash of the trusted block. + /// @param ids The transaction or receipt ids to verify. + event VerifyRequested( + bytes32 indexed trustedHeader, + TransactionOrReceiptId[] indexed ids + ); + + /// @notice Trusted header not found. + error TrustedHeaderNotFound(); + + /// @notice Header not Initialised. + error HeaderNotInitialised(); + + /// @notice Not from Succinct Gateway. + error NotFromSuccinctGateway(address); + + error GatewayNotInitialised(); + + error FunctionIdsNotInitialised(); + + /// @notice The result of the verification request + event VerifyResult(ProofVerificationResult[] results); +} + +uint256 constant MAX_LEN = 64; + +struct TransactionOrReceiptId { + bool isTransaction; + bytes32 id; + bytes account; +} + +function encodePackedIds(TransactionOrReceiptId[] memory ids) + pure + returns (bytes memory) +{ + bytes memory output; + for (uint256 i = 0; i < ids.length; i++) { + if (i > 0) { + output = abi.encodePacked( + output, + ids[i].isTransaction, + ids[i].id, + ids[i].account + ); + } else { + output = abi.encodePacked( + ids[i].isTransaction, + ids[i].id, + ids[i].account + ); + } + } + return output; +} + +function decodePackedIds(bytes memory _input) + pure + returns (TransactionOrReceiptId[] memory) +{ + uint256 iterationLength = 1 + 32 + MAX_LEN; + uint256 idsLength = _input.length / iterationLength; + TransactionOrReceiptId[] memory ids = new TransactionOrReceiptId[]( + idsLength + ); + + bytes memory nextBytes; + uint256 offset = 0; + for (uint256 i = 0; i < idsLength; i++) { + (nextBytes, offset) = Bytes.readBytes(_input, offset, iterationLength); + ids[i] = decodeTransactionOrReceiptId(nextBytes); + } + return ids; +} + +function decodeTransactionOrReceiptId(bytes memory _input) + pure + returns (TransactionOrReceiptId memory id) +{ + bytes memory nextBytes; + uint256 offset = 0; + + (nextBytes, offset) = Bytes.readBytes(_input, offset, 1); + id.isTransaction = uint8(bytes1(nextBytes)) != 0; + + (nextBytes, offset) = Bytes.readBytes(_input, offset, 32); + id.id = abi.decode(nextBytes, (bytes32)); + + (nextBytes, offset) = Bytes.readBytes(_input, offset, MAX_LEN); + id.account = nextBytes; +} + +struct ProofVerificationResult { + bytes32 id; + bool result; +} + +function decodePackedResults(bytes memory _input) + pure + returns (ProofVerificationResult[] memory) +{ + uint256 iterationLength = 1 + 32; + uint256 idsLength = _input.length / iterationLength; + ProofVerificationResult[] memory results = new ProofVerificationResult[]( + idsLength + ); + + bytes memory nextBytes; + uint256 offset = 0; + for (uint256 i = 0; i < idsLength; i++) { + (nextBytes, offset) = Bytes.readBytes(_input, offset, iterationLength); + results[i] = decodeProofVerificationResult(nextBytes); + } + return results; +} + +function decodeProofVerificationResult(bytes memory _input) + pure + returns (ProofVerificationResult memory result) +{ + bytes memory nextBytes; + uint256 offset = 0; + (nextBytes, offset) = Bytes.readBytes(_input, offset, 32); + result.id = abi.decode(nextBytes, (bytes32)); + + (nextBytes, offset) = Bytes.readBytes(_input, offset, 1); + result.result = uint8(bytes1(nextBytes)) != 0; +} diff --git a/nearx/contract/src/interfaces/ISuccinctGateway.sol b/nearx/contract/src/interfaces/ISuccinctGateway.sol new file mode 100644 index 0000000..1be5839 --- /dev/null +++ b/nearx/contract/src/interfaces/ISuccinctGateway.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0; + +interface ISuccinctGatewayEvents { + event RequestCallback( + uint32 indexed nonce, + bytes32 indexed functionId, + bytes input, + bytes context, + address callbackAddress, + bytes4 callbackSelector, + uint32 callbackGasLimit, + uint256 feeAmount + ); + event RequestCall( + bytes32 indexed functionId, + bytes input, + address entryAddress, + bytes entryCalldata, + uint32 entryGasLimit, + address sender, + uint256 feeAmount + ); + event RequestFulfilled( + uint32 indexed nonce, + bytes32 indexed functionId, + bytes32 inputHash, + bytes32 outputHash + ); + event Call( + bytes32 indexed functionId, + bytes32 inputHash, + bytes32 outputHash + ); + event SetFeeVault(address indexed oldFeeVault, address indexed newFeeVault); + event ProverUpdated(address indexed prover, bool added); +} + +interface ISuccinctGatewayErrors { + error InvalidRequest( + uint32 nonce, + bytes32 expectedRequestHash, + bytes32 requestHash + ); + error CallbackFailed(bytes4 callbackSelector, bytes output, bytes context); + error InvalidCall(bytes32 functionId, bytes input); + error CallFailed(address callbackAddress, bytes callbackData); + error InvalidProof( + address verifier, + bytes32 inputHash, + bytes32 outputHash, + bytes proof + ); + error ReentrantFulfill(); + error OnlyProver(address sender); +} + +interface ISuccinctGateway is ISuccinctGatewayEvents, ISuccinctGatewayErrors { + function requestCallback( + bytes32 functionId, + bytes memory input, + bytes memory context, + bytes4 callbackSelector, + uint32 callbackGasLimit + ) external payable returns (bytes32); + + function requestCall( + bytes32 functionId, + bytes memory input, + address entryAddress, + bytes memory entryData, + uint32 entryGasLimit + ) external payable; + + function verifiedCall( + bytes32 functionId, + bytes memory input + ) external view returns (bytes memory); + + function isCallback() external view returns (bool); +} diff --git a/nearx/contract/test/NearX.t.sol b/nearx/contract/test/NearX.t.sol new file mode 100644 index 0000000..8ef5fc8 --- /dev/null +++ b/nearx/contract/test/NearX.t.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "forge-std/Test.sol"; +import "../src/NearX.sol"; +import {Bytes} from "../src/interfaces/Bytes.sol"; + +contract NearXTest is Test { + NearX public lightClient; + + function setUp() public { + lightClient = new NearX(); + } + + function testGetEncodePackedSync() public view { + bytes32 header = hex"63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3"; + bytes memory encodedInput = abi.encodePacked(header); + console.logBytes(encodedInput); + } + + function testGetEncodePackedVerify() public { + bytes32 header = hex"63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3"; + bytes memory txIsAccount = hex"01"; + bytes32 txId = hex"2c53bcfe871da28decc45c3437f5864568d91af6d990dbc2662f11ce44c18d79"; + bytes + memory txAccount = hex"7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c"; + + bytes memory rxIsAccount = hex"00"; + bytes32 rxId = hex"7ff581f8517ec58459099a5af2465d5232fdcdd7c4da9c3d42a887bf6bd5457e"; + bytes + memory rxAccount = hex"70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c"; + + TransactionOrReceiptId[] memory ids = new TransactionOrReceiptId[](2); + + ids[0].isTransaction = true; + ids[0].id = txId; + ids[0].account = txAccount; + + ids[1].isTransaction = false; + ids[1].id = rxId; + ids[1].account = rxAccount; + + bytes memory encodedIds = encodePackedIds(ids); + bytes memory encodedInput = abi.encodePacked(header, encodedIds); + + bytes + memory expected = hex"63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3012c53bcfe871da28decc45c3437f5864568d91af6d990dbc2662f11ce44c18d797a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007ff581f8517ec58459099a5af2465d5232fdcdd7c4da9c3d42a887bf6bd5457e70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c"; + + assertEq(encodedInput, expected); + + bytes32 encodedHeader = bytes32(encodedInput); + assertEq(header, encodedHeader); + + TransactionOrReceiptId[] memory decodedIds = decodePackedIds( + encodedIds + ); + assertEq(ids[0].isTransaction, decodedIds[0].isTransaction); + assertEq(ids[0].id, decodedIds[0].id); + assertEq(ids[0].account, decodedIds[0].account); + assertEq(ids[1].isTransaction, decodedIds[1].isTransaction); + assertEq(ids[1].id, decodedIds[1].id); + assertEq(ids[1].account, decodedIds[1].account); + } + + function testDecodeResult() public { + bytes + memory inputData = hex"7ff581f8517ec58459099a5af2465d5232fdcdd7c4da9c3d42a887bf6bd5457e012c53bcfe871da28decc45c3437f5864568d91af6d990dbc2662f11ce44c18d7901"; + ProofVerificationResult[] memory results = decodePackedResults( + inputData + ); + bytes + memory outputTest = hex"2c53bcfe871da28decc45c3437f5864568d91af6d990dbc2662f11ce44c18d79017ff581f8517ec58459099a5af2465d5232fdcdd7c4da9c3d42a887bf6bd5457e01"; + ProofVerificationResult[] memory expected = decodePackedResults( + outputTest + ); + } +} diff --git a/nearx/src/builder.rs b/nearx/src/builder.rs new file mode 100644 index 0000000..6e5ff9a --- /dev/null +++ b/nearx/src/builder.rs @@ -0,0 +1,695 @@ +use near_light_client_protocol::{config::NUM_BLOCK_PRODUCER_SEATS, prelude::Itertools}; +use plonky2x::prelude::*; +use pretty_assertions::assert_eq; + +use crate::{ + merkle::{MerklePathVariable, NearMerkleTree}, + variables::{ + ApprovalMessage, BlockHeightVariable, BlockVariable, BpsApprovals, BpsArr, + BuildEndorsement, CryptoHashVariable, HeaderVariable, ProofVariable, StakeInfoVariable, + SyncedVariable, ValidatorStakeVariable, + }, +}; + +pub trait Ensure, const D: usize> { + fn ensure_not_already_verified( + &mut self, + head: &HeaderVariable, + block_height: &BlockHeightVariable, + ) -> BoolVariable; + + fn ensure_epoch_is_current_or_next( + &mut self, + head: &HeaderVariable, + epoch_id: &CryptoHashVariable, + ) -> BoolVariable; + + fn ensure_if_next_epoch_contains_next_bps( + &mut self, + head: &HeaderVariable, + epoch_id: &CryptoHashVariable, + next_bps: &BpsArr, + ) -> BoolVariable; + + fn validate_signatures( + &mut self, + approvals: &BpsApprovals, + bps: &BpsArr, + approval_message: ApprovalMessage, + ) -> StakeInfoVariable; + + fn ensure_stake_is_sufficient(&mut self, stake: &StakeInfoVariable) -> BoolVariable; + + fn ensure_next_bps_is_valid( + &mut self, + expected_hash: &CryptoHashVariable, + next_bps_hash: Option<&CryptoHashVariable>, + ) -> BoolVariable; + + fn ensure_block_hash_matches_outcome( + &mut self, + head: &HeaderVariable, + outcome_proof_block_hash: &CryptoHashVariable, + ) -> BoolVariable; + + fn ensure_block_hash_matches_outcome_hashed( + &mut self, + head: &CryptoHashVariable, + outcome_proof_block_hash: &CryptoHashVariable, + ) -> BoolVariable; + + fn verify_outcome( + &mut self, + expected: &CryptoHashVariable, + outcome_proof: &MerklePathVariable, + outcome_hash: &CryptoHashVariable, + outcome_root_proof: &MerklePathVariable, + ) -> BoolVariable; + + fn verify_block( + &mut self, + expected: &CryptoHashVariable, + block_proof: &MerklePathVariable, + block_hash: &CryptoHashVariable, + ) -> BoolVariable; + + fn assertx(&mut self, condition: BoolVariable); +} + +impl, const D: usize> Ensure for CircuitBuilder { + fn ensure_not_already_verified( + &mut self, + head: &HeaderVariable, + block_height: &BlockHeightVariable, + ) -> BoolVariable { + self.gt(*block_height, head.inner_lite.height) + } + + fn ensure_epoch_is_current_or_next( + &mut self, + head: &HeaderVariable, + epoch_id: &CryptoHashVariable, + ) -> BoolVariable { + let epoch_id = *epoch_id; + let this = self.is_equal(epoch_id, head.inner_lite.epoch_id); + let next = self.is_equal(epoch_id, head.inner_lite.next_epoch_id); + self.or(this, next) + } + + fn ensure_if_next_epoch_contains_next_bps( + &mut self, + head: &HeaderVariable, + epoch_id: &CryptoHashVariable, + next_bps: &BpsArr, + ) -> BoolVariable { + let is_next_epoch = self.is_equal(head.inner_lite.next_epoch_id, *epoch_id); + let is_not_empty = self.constant(next_bps.len() > 0); + let ok_anyway = self._true(); + self.select(is_next_epoch, is_not_empty, ok_anyway) + } + + fn validate_signatures( + &mut self, + approvals_after_next: &BpsApprovals, + epoch_bps: &BpsArr, + approval_message: ApprovalMessage, + ) -> StakeInfoVariable { + assert_eq!(approvals_after_next.is_active.len(), LEN); + assert_eq!(approvals_after_next.signatures.len(), LEN); + assert_eq!(epoch_bps.data.len(), LEN); + + let messages = [approval_message; LEN]; + + let mut pubkeys = vec![]; + let mut total_stake = self.zero(); + let mut approved_stake = self.zero(); + + for i in 0..LEN { + let vs = &epoch_bps.data[i]; + + pubkeys.push(vs.public_key.clone()); + + let maybe_add = self.add(approved_stake, vs.stake); + approved_stake = + self.select(approvals_after_next.is_active[i], maybe_add, approved_stake); + total_stake = self.add(total_stake, vs.stake); + } + + // TODO: what happens if a conditionally active signature fails? + self.curta_eddsa_verify_sigs_conditional( + approvals_after_next.is_active.clone(), + None, + ArrayVariable::new(messages.to_vec()), + approvals_after_next.signatures.clone(), + ArrayVariable::new(pubkeys), + ); + + StakeInfoVariable { + total: total_stake, + approved: approved_stake, + } + } + + fn ensure_stake_is_sufficient(&mut self, stake: &StakeInfoVariable) -> BoolVariable { + // 2/3 stake + let numerator = self.constant(2.into()); + let denominator = self.constant(3.into()); + + let threshold = self.mul(stake.total, numerator); + let approved = self.mul(stake.approved, denominator); + self.gte(approved, threshold) + } + + fn ensure_next_bps_is_valid( + &mut self, + expected_hash: &CryptoHashVariable, + next_bps_hash: Option<&CryptoHashVariable>, + ) -> BoolVariable { + if let Some(next_bps) = next_bps_hash { + self.is_equal(*next_bps, *expected_hash) + } else { + self._true() + } + } + + fn ensure_block_hash_matches_outcome( + &mut self, + head: &HeaderVariable, + outcome_proof_block_hash: &CryptoHashVariable, + ) -> BoolVariable { + let hash = head.hash(self); + self.is_equal(hash, *outcome_proof_block_hash) + } + + fn ensure_block_hash_matches_outcome_hashed( + &mut self, + head_hash: &CryptoHashVariable, + outcome_proof_block_hash: &CryptoHashVariable, + ) -> BoolVariable { + self.is_equal(*head_hash, *outcome_proof_block_hash) + } + + fn verify_outcome( + &mut self, + expected: &CryptoHashVariable, + outcome_proof: &MerklePathVariable, + outcome_hash: &CryptoHashVariable, + outcome_root_proof: &MerklePathVariable, + ) -> BoolVariable { + let outcome_root = self.get_root_from_merkle_proof_hashed_leaf_unindex( + &outcome_proof.path, + &outcome_proof.indices, + *outcome_hash, + ); + + let leaf = self.curta_sha256(&outcome_root.0 .0); + + let outcome_root = self.get_root_from_merkle_proof_hashed_leaf_unindex( + &outcome_root_proof.path, + &outcome_root_proof.indices, + leaf, + ); + self.is_equal(outcome_root, *expected) + } + + fn verify_block( + &mut self, + expected: &CryptoHashVariable, + block_proof: &MerklePathVariable, + block_hash: &CryptoHashVariable, + ) -> BoolVariable { + let block_root = self.get_root_from_merkle_proof_hashed_leaf_unindex( + &block_proof.path, + &block_proof.indices, + *block_hash, + ); + self.is_equal(block_root, *expected) + } + + fn assertx(&mut self, condition: BoolVariable) { + let t = self._true(); + self.assert_is_equal(condition, t); + } +} + +pub trait Sync, const D: usize> { + fn sync( + &mut self, + head: &HeaderVariable, + epoch_bps: &BpsArr, + next_block: &BlockVariable, + ) -> SyncedVariable; + + fn reconstruct_approval_message(&mut self, next_block: &BlockVariable) -> ApprovalMessage; +} + +impl, const D: usize> Sync for CircuitBuilder { + fn sync( + &mut self, + head: &HeaderVariable, + epoch_bps: &BpsArr, + next_block: &BlockVariable, + ) -> SyncedVariable { + let a = self.ensure_not_already_verified(head, &next_block.header.inner_lite.height); + self.assertx(a); + + let b = self.ensure_epoch_is_current_or_next(head, &next_block.header.inner_lite.epoch_id); + self.assertx(b); + + let c = self.ensure_if_next_epoch_contains_next_bps( + head, + &next_block.header.inner_lite.epoch_id, + &next_block.next_bps, + ); + self.assertx(c); + + let approval = self.reconstruct_approval_message(next_block); + let stake = self.validate_signatures(&next_block.approvals_after_next, epoch_bps, approval); + let d = self.ensure_stake_is_sufficient(&stake); + self.assertx(d); + + if next_block.next_bps.len() > 0 { + // TODO: hashing bps in circut + let e = self.ensure_next_bps_is_valid( + &next_block.header.inner_lite.next_bp_hash, + Some(&next_block.next_bps_hash), + ); + self.assertx(e); + assert!(next_block.next_bps.len() == NUM_BLOCK_PRODUCER_SEATS); + } + // FIXME: remove this, return the new head + SyncedVariable { + new_head: next_block.header.to_owned(), + next_bps_epoch: next_block.header.inner_lite.next_epoch_id, + next_bps: next_block.next_bps.to_owned(), + } + } + + fn reconstruct_approval_message(&mut self, next_block: &BlockVariable) -> ApprovalMessage { + let next_header_hash = next_block.header.hash(self); + let next_block_hash = + self.curta_sha256_pair(next_block.next_block_inner_hash, next_header_hash); + + let should_hint = false; + // TODO: decide if we should constrain this way or just hint in the manual + // encodes + if should_hint { + let mut input_stream = VariableStream::new(); + input_stream.write(&next_block_hash); + input_stream.write(&next_block.header.inner_lite.height); + let output_stream = self.hint(input_stream, BuildEndorsement); + output_stream.read::(self) + } else { + let mut bytes = vec![ByteVariable::zero(self)]; + bytes.extend_from_slice(&next_block_hash.as_bytes()); + let blocks_to_advance = self.constant::(2u64); + let height = self.add(blocks_to_advance, next_block.header.inner_lite.height); + bytes.extend_from_slice(&to_le_bytes::<_, _, D, 8>(self, &height).0); + let bytes: [ByteVariable; 41] = bytes.try_into().unwrap(); + BytesVariable(bytes) + } + } +} + +pub trait Verify, const D: usize> { + fn verify(&mut self, proof: ProofVariable) -> BoolVariable; +} + +impl, const D: usize> Verify for CircuitBuilder { + fn verify(&mut self, proof: ProofVariable) -> BoolVariable { + let block_hash = proof.block_header.hash(self); + + let block_hash_matches = self.is_equal(block_hash, proof.outcome_proof_block_hash); + + let outcome_matches = self.verify_outcome( + &proof.block_header.inner_lite.outcome_root, + &proof.outcome_proof, + &proof.outcome_hash, + &proof.outcome_root_proof, + ); + + let block_matches = + self.verify_block(&proof.head_block_root, &proof.block_proof, &block_hash); + + let comp = self.and(block_matches, outcome_matches); + let verified = self.and(comp, block_hash_matches); + self.assertx(verified); + verified + } +} + +// TODO: test this and reuse for block header inner +fn to_le_bytes, V: CircuitVariable, const D: usize, const N: usize>( + b: &mut CircuitBuilder, + v: &V, +) -> BytesVariable { + let mut bytes = vec![]; + for target in v.targets() { + let mut bits = b.api.split_le(target, 32); + bits.reverse(); + let to_extend = bits + .chunks(8) + .rev() + .map(|chunk| { + let targets = chunk.iter().map(|b| b.target).collect_vec(); + ByteVariable::from_targets(&targets) + }) + .collect_vec(); + bytes.extend(to_extend); + } + BytesVariable(bytes.try_into().unwrap()) +} + +#[cfg(test)] +mod tests { + use near_light_client_protocol::{Protocol, StakeInfo}; + + use self::assert_eq; + use super::*; + use crate::{test_utils::*, variables::*}; + + #[test] + fn test_header_hash() { + let header = to_header(test_first().body); + let expected_hash = header.hash().0; + + let define = |builder: &mut B| { + let header = builder.read::(); + let result = header.hash(builder); + builder.write(result); + }; + + let writer = |input: &mut PI| { + input.write::(header.into()); + }; + + let assertions = |mut output: PO| { + let hash = output.read::(); + assert_eq!(hash.0, expected_hash); + }; + builder_suite(define, writer, assertions); + } + + #[test] + fn test_ensure_stake() { + let approved_stakes = [200, 199, 201, 0]; + + let define = |builder: &mut B| { + let mut stake_info = builder.constant::( + StakeInfo { + total: 300, + approved: 0, + } + .into(), + ); + + for _ in 0..approved_stakes.len() { + stake_info.approved = builder.read::(); + let is_sufficient = builder.ensure_stake_is_sufficient(&stake_info); + builder.write::(is_sufficient); + } + }; + let writer = |input: &mut PI| { + for stake in approved_stakes { + input.write::(stake.into()); + } + }; + let assertions = |mut output: PO| { + assert!(output.read::(), "stake is equal to threshold"); + assert!( + !output.read::(), + "stake is less than threshold" + ); + assert!( + output.read::(), + "stake is greater than threshold" + ); + assert!(!output.read::(), "stake is zero"); + }; + builder_suite(define, writer, assertions); + } + + #[test] + fn test_ensure_height() { + let test_header = to_header(test_next().body); + let define = |builder: &mut B| { + let header = builder.read::(); + + let early_block_height = builder.constant::(1); + let one = builder.one(); + let later_block_height = builder.add(header.inner_lite.height, one); + + let r = builder.ensure_not_already_verified(&header, &early_block_height); + builder.write::(r); + + let r = builder.ensure_not_already_verified(&header, &later_block_height); + builder.write::(r); + }; + let writer = |input: &mut PI| { + input.write::(test_header.into()); + }; + let assertions = |mut output: PO| { + assert!(!output.read::(), "too early"); + assert!(output.read::(), "height is later"); + }; + builder_suite(define, writer, assertions); + } + + #[test] + fn test_ensure_next_bps() { + let (header, bps, _) = testnet_state(); + let bps_hash = CryptoHash::hash_borsh(bps.clone()); + + let define = |builder: &mut B| { + let header = builder.read::(); + let next_bps = builder.read::>(); + + let current = + builder.ensure_epoch_is_current_or_next(&header, &header.inner_lite.epoch_id); + builder.write::(current); + let next = + builder.ensure_epoch_is_current_or_next(&header, &header.inner_lite.next_epoch_id); + builder.write::(next); + + let contains_next_bps = builder.ensure_if_next_epoch_contains_next_bps( + &header, + &header.inner_lite.next_epoch_id, + &next_bps, + ); + builder.write::(contains_next_bps); + + let next_bps_hash = builder.constant::(bps_hash.0.into()); + let is_valid = builder + .ensure_next_bps_is_valid(&header.inner_lite.next_bp_hash, Some(&next_bps_hash)); + builder.write::(is_valid); + }; + let writer = |input: &mut PI| { + input.write::(header.clone().into()); + input.write::>(bps_to_variable(Some(bps))); + }; + let assertions = |mut output: PO| { + assert!(output.read::(), "epoch is current"); + assert!(output.read::(), "epoch is next"); + assert!(output.read::(), "next epoch has bps"); + assert!(output.read::(), "next bps is valid"); + }; + builder_suite(define, writer, assertions); + } + + #[test] + fn test_reconstruct_approval_msg() { + let (_, _, next_block) = test_state(); + let define = |builder: &mut B| { + let next_block = builder.read::(); + let os = builder.reconstruct_approval_message(&next_block); + builder.write::(os); + }; + let writer = |input: &mut PI| { + input.write::(next_block.clone().into()); + }; + let assertions = |mut output: PO| { + let created = output.read::(); + let msg = Protocol::reconstruct_approval_message(&next_block).unwrap(); + assert_eq!(msg, created); + }; + builder_suite(define, writer, assertions); + } + + #[test] + fn test_raw_le_bytes() { + let (_, _, next_block) = test_state(); + let define = |builder: &mut B| { + let next_block = builder.read::(); + + let mut bytes = vec![]; + for target in next_block.header.inner_lite.height.targets() { + let mut bits = builder.api.split_le(target, 32); + bits.reverse(); + let to_extend = bits + .chunks(8) + .rev() + .map(|chunk| { + let targets = chunk.iter().map(|b| b.target).collect_vec(); + ByteVariable::from_targets(&targets) + }) + .collect_vec(); + bytes.extend(to_extend); + } + builder.write::>(BytesVariable(bytes.try_into().unwrap())); + }; + let writer = |input: &mut PI| { + input.write::(next_block.clone().into()); + }; + let assertions = |mut output: PO| { + let bytes = output.read::>(); + println!("{:?}", bytes); + assert_eq!(bytes, next_block.inner_lite.height.to_le_bytes()); + }; + builder_suite(define, writer, assertions); + } +} + +/// These tests require either: +/// - A LOT of time if running in debug mode +/// - A LOT of RAM if running in release +/// +/// TODO: CI for only beefy tests +#[cfg(test)] +mod beefy_tests { + use serial_test::serial; + + use crate::{ + builder::{Ensure, Sync, Verify}, + test_utils::*, + variables::*, + }; + + #[test] + #[serial] + #[ignore] + fn beefy_builder_test_next_bps() { + let (header, bps, _) = testnet_state(); + let bps_hash = CryptoHash::hash_borsh(bps.clone()); + + let define = |builder: &mut B| { + let header = builder.read::(); + let next_bps = builder.read::>(); + + let current = + builder.ensure_epoch_is_current_or_next(&header, &header.inner_lite.epoch_id); + builder.write::(current); + let next = + builder.ensure_epoch_is_current_or_next(&header, &header.inner_lite.next_epoch_id); + builder.write::(next); + + let contains_next_bps = builder.ensure_if_next_epoch_contains_next_bps( + &header, + &header.inner_lite.next_epoch_id, + &next_bps, + ); + builder.write::(contains_next_bps); + + let next_bps_hash = builder.constant::(bps_hash.0.into()); + let is_valid = builder + .ensure_next_bps_is_valid(&header.inner_lite.next_bp_hash, Some(&next_bps_hash)); + builder.write::(is_valid); + }; + let writer = |input: &mut PI| { + input.write::(header.clone().into()); + input.write::>(bps_to_variable(Some(bps))); + }; + let assertions = |mut output: PO| { + assert!(output.read::(), "epoch is current"); + assert!(output.read::(), "epoch is next"); + assert!(output.read::(), "next epoch has bps"); + assert!(output.read::(), "next bps is valid"); + }; + builder_suite(define, writer, assertions); + } + + #[test] + #[serial] + #[ignore] + fn beefy_builder_test_proof_blackbox() { + let block_root = + CryptoHash::from_str("WWrLWbWHwSmjtTn5oBZPYgRCuCYn6fkYVa4yhPWNK4L").unwrap(); + + let define = |builder: &mut B| { + let registered_proof = builder.read::(); + let proof_verified = builder.verify(registered_proof); + builder.write::(proof_verified); + }; + let writer = |input: &mut PI| { + input.write::( + near_light_client_protocol::Proof::Basic { + head_block_root: block_root, + proof: Box::new(fixture("old.json")), + } + .into(), + ); + }; + let assertions = |mut output: PO| { + assert!(output.read::(), "proof verified"); + }; + builder_suite(define, writer, assertions); + } + + #[test] + #[serial] + #[ignore] + fn beefy_builder_test_sync_across_epoch_boundaries() { + let (head, next_bps, next_block) = test_state(); + + let define = |builder: &mut B| { + let head = builder.read::(); + let bps = builder.read::>(); + let next_block = builder.read::(); + let synced = builder.sync(&head, &bps, &next_block); + builder.write::(synced); + }; + let writer = |input: &mut PI| { + input.write::(head.into()); + input.write::>(bps_to_variable(Some(next_bps))); + input.write::(next_block.clone().into()); + }; + let assertions = |mut output: PO| { + let header = output.read::(); + println!("header: {:?}", header); + }; + builder_suite(define, writer, assertions); + } + + #[test] + #[serial] + #[ignore] + fn beefy_builder_test_bounded_signatures() { + let (_, bps, next_block) = test_state(); + const BPS_AMT: usize = 15; + + let define = |builder: &mut B| { + let bps = builder.read::>(); + let next_block = builder.read::(); + + let next_block_approvals = BpsApprovals { + signatures: next_block.approvals_after_next.signatures[0..BPS_AMT] + .to_vec() + .into(), + is_active: next_block.approvals_after_next.is_active[0..BPS_AMT] + .to_vec() + .into(), + }; + + let msg = builder.reconstruct_approval_message(&next_block); + + builder.validate_signatures(&next_block_approvals, &bps, msg); + }; + let writer = |input: &mut PI| { + input.write::>( + bps_to_variable(Some(bps.clone()))[0..BPS_AMT].into(), + ); + input.write::(next_block.into()); + }; + let assertions = |mut _output: PO| {}; + builder_suite(define, writer, assertions); + } +} diff --git a/nearx/src/hint.rs b/nearx/src/hint.rs new file mode 100644 index 0000000..6db6c79 --- /dev/null +++ b/nearx/src/hint.rs @@ -0,0 +1,217 @@ +use std::collections::HashMap; + +use async_trait::async_trait; +use near_light_client_protocol::{prelude::CryptoHash, Proof}; +use near_light_client_rpc::{prelude::GetProof, LightClientRpc, NearRpcClient, Network}; +use plonky2x::{frontend::hint::asynchronous::hint::AsyncHint, prelude::*}; +use serde::{Deserialize, Serialize}; + +use crate::variables::{ + normalise_account_id, BlockVariable, CryptoHashVariable, HeaderVariable, ProofVariable, + TransactionOrReceiptIdVariable, +}; + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct FetchNextHeaderInputs(pub Network); + +#[async_trait] +impl, const D: usize> AsyncHint for FetchNextHeaderInputs { + async fn hint( + &self, + input_stream: &mut ValueStream, + output_stream: &mut ValueStream, + ) { + let client = NearRpcClient::new(self.0); + + let h = input_stream.read_value::().0; + + let next = client + .fetch_latest_header(&CryptoHash(h)) + .await + .expect("Failed to fetch header") + .expect("Expected a header"); + + output_stream.write_value::(next.into()); + } +} + +impl FetchNextHeaderInputs { + pub fn fetch, const D: usize>( + &self, + b: &mut CircuitBuilder, + hash: &CryptoHashVariable, + ) -> Option { + let mut input_stream = VariableStream::new(); + input_stream.write::(hash); + + let output_stream = b.async_hint(input_stream, self.clone()); + Some(output_stream.read::(b)) + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct FetchHeaderInputs(pub Network); + +#[async_trait] +impl, const D: usize> AsyncHint for FetchHeaderInputs { + async fn hint( + &self, + input_stream: &mut ValueStream, + output_stream: &mut ValueStream, + ) { + let client = NearRpcClient::new(self.0); + + let h = input_stream.read_value::().0; + + let header = client + .fetch_header(&CryptoHash(h)) + .await + .expect("Failed to fetch header"); + + output_stream.write_value::(header.into()); + } +} + +impl FetchHeaderInputs { + /// Fetches a header based on its known hash and witnesses the result. + pub fn fetch, const D: usize>( + &self, + b: &mut CircuitBuilder, + trusted_hash: &CryptoHashVariable, + ) -> HeaderVariable { + let mut input_stream = VariableStream::new(); + input_stream.write::(trusted_hash); + + let output_stream = b.async_hint(input_stream, self.clone()); + let untrusted = output_stream.read::(b); + let untrusted_hash = untrusted.hash(b); + b.assert_is_equal(*trusted_hash, untrusted_hash); + untrusted + } +} +// TODO: refactor into some client-like carrier for all hints that is serdeable +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct FetchProofInputs(pub Network); + +#[async_trait] +impl, const D: usize, const B: usize> AsyncHint + for FetchProofInputs +{ + async fn hint( + &self, + input_stream: &mut ValueStream, + output_stream: &mut ValueStream, + ) { + let client = NearRpcClient::new(self.0); + let block_merkle_root = input_stream.read_value::().0; + let last_verified = input_stream.read_value::().0; + + let mut reqs = vec![]; + for _ in 0..B { + let tx = input_stream.read_value::(); + reqs.push(if tx.is_transaction { + GetProof::Transaction { + transaction_hash: CryptoHash(tx.id.into()), + sender_id: normalise_account_id::(&tx.account), + } + } else { + GetProof::Receipt { + receipt_id: CryptoHash(tx.id.into()), + receiver_id: normalise_account_id::(&tx.account), + } + }); + } + + let proofs = client + .batch_fetch_proofs(&CryptoHash(last_verified), reqs) + .await + .into_iter() + .map(|(k, p)| (k, p.expect("Failed to fetch proof"))) + .map(|(k, p)| { + ( + k, + Proof::Basic { + proof: Box::new(p), + head_block_root: CryptoHash(block_merkle_root), + }, + ) + }) + .collect::>(); + + assert_eq!(proofs.len(), B, "Invalid number of proofs"); + + log::debug!("Fetched {} proofs", proofs.len()); + + for (k, p) in proofs.into_iter() { + output_stream.write_value::(k.0.into()); + output_stream.write_value::(p.into()); + } + } +} + +impl FetchProofInputs { + pub fn fetch, const D: usize>( + &self, + b: &mut CircuitBuilder, + head: &HeaderVariable, + reqs: &[TransactionOrReceiptIdVariable], + ) -> ArrayVariable { + let mut input_stream = VariableStream::new(); + + input_stream.write::(&head.inner_lite.block_merkle_root); + input_stream.write::(&head.hash(b)); + input_stream.write_slice::(reqs); + + let output_stream = b.async_hint(input_stream, self.clone()); + let mut inputs = vec![]; + for _ in 0..N { + inputs.push(ProofInputVariable { + id: output_stream.read::(b), + proof: output_stream.read::(b), + }); + } + // Witness that each head block root in each proof is the same as the trusted + // head + inputs.iter().for_each(|x| { + b.assert_is_equal(x.proof.head_block_root, head.inner_lite.block_merkle_root) + }); + inputs.into() + } +} + +#[derive(CircuitVariable, Debug, Clone)] +pub struct ProofInputVariable { + pub id: CryptoHashVariable, + pub proof: ProofVariable, +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + test_utils::{builder_suite, test_state, B, PI, PO}, + variables::{BlockVariableValue, HeaderVariable}, + }; + + #[test] + fn test_fetch_header() { + let (header, _, nb) = test_state(); + + let define = |b: &mut B| { + let header = b.read::(); + let hash = header.hash(b); + let next_block = + FetchNextHeaderInputs(near_light_client_rpc::Network::Mainnet).fetch(b, &hash); + b.write::(next_block.unwrap()); + }; + let writer = |input: &mut PI| { + input.write::(header.into()); + }; + let assertions = |mut output: PO| { + let inputs = output.read::(); + let nbh: BlockVariableValue = nb.into(); + pretty_assertions::assert_eq!(format!("{:#?}", inputs), format!("{:#?}", nbh)); + }; + builder_suite(define, writer, assertions); + } +} diff --git a/nearx/src/lib.rs b/nearx/src/lib.rs new file mode 100644 index 0000000..b0aadd3 --- /dev/null +++ b/nearx/src/lib.rs @@ -0,0 +1,17 @@ +pub use plonky2x::{self, backend::circuit::Circuit, prelude::*}; +pub use sync::SyncCircuit; +pub use verify::VerifyCircuit; + +/// Building blocks injected into the CircuitBuilder +mod builder; +mod hint; +/// Unprefixed merkle tree without collision resistance +mod merkle; +mod variables; + +/// Circuits for use by the operator +pub mod sync; +pub mod verify; + +#[cfg(test)] +mod test_utils; diff --git a/nearx/src/main.rs b/nearx/src/main.rs new file mode 100644 index 0000000..a46d3e2 --- /dev/null +++ b/nearx/src/main.rs @@ -0,0 +1,28 @@ +#[cfg(any(feature = "sync", feature = "verify"))] +use near_light_clientx::plonky2x::backend::function::Plonky2xFunction; + +// Testnet, FIXME: this is error prone, use something else +#[allow(dead_code)] +const NETWORK: usize = 1; + +// TODO: make this use a nicer API for use by the prover. +// TODO: perpetually sync, use queue etc +fn main() { + cfg_if::cfg_if! { + if #[cfg(feature = "sync")] { + use near_light_clientx::SyncCircuit; + SyncCircuit::::entrypoint(); + } else if #[cfg(feature = "verify")] { + const PROOF_AMT: usize = 128; + const PROOF_BATCH_SIZE: usize = 4; + + assert!(PROOF_AMT % PROOF_BATCH_SIZE == 0); + assert!((PROOF_AMT / PROOF_BATCH_SIZE).is_power_of_two()); + + use near_light_clientx::VerifyCircuit; + VerifyCircuit::::entrypoint(); + } else { + panic!("No circuit feature enabled"); + } + } +} diff --git a/nearx/src/merkle.rs b/nearx/src/merkle.rs new file mode 100644 index 0000000..98b39b3 --- /dev/null +++ b/nearx/src/merkle.rs @@ -0,0 +1,124 @@ +use near_light_client_protocol::{merkle_util::MerklePath, prelude::Itertools}; +use plonky2x::prelude::*; + +/// This is an unprefixed merkle tree without collision resistance, this should +/// probably adapt the tendermint tree or introduce this functionality to +/// succinct's simple tree +pub trait NearMerkleTree { + fn get_root_from_merkle_proof_hashed_leaf_unindex( + &mut self, + proof: &ArrayVariable, + path_indices: &ArrayVariable, + leaf: Bytes32Variable, + ) -> Bytes32Variable; + fn inner_hash(&mut self, left: &Bytes32Variable, right: &Bytes32Variable) -> Bytes32Variable; +} + +impl, const D: usize> NearMerkleTree for CircuitBuilder { + fn get_root_from_merkle_proof_hashed_leaf_unindex( + &mut self, + proof: &ArrayVariable, + path_indices: &ArrayVariable, + leaf: Bytes32Variable, + ) -> Bytes32Variable { + let mut hash_so_far = leaf; + + let default = self.constant::(INACTIVE_NODE.into()); + + for i in 0..PROOF_DEPTH { + let aunt = proof[i]; + let path_index = path_indices[i]; + + let left_hash_pair = self.inner_hash(&hash_so_far, &aunt); + let right_hash_pair = self.inner_hash(&aunt, &hash_so_far); + + let aunt_is_default = self.is_equal(aunt, default); + + let hash = self.select(path_index, right_hash_pair, left_hash_pair); + + hash_so_far = self.select(aunt_is_default, hash_so_far, hash) + } + hash_so_far + } + fn inner_hash(&mut self, left: &Bytes32Variable, right: &Bytes32Variable) -> Bytes32Variable { + let mut encoded_leaf = vec![]; + + encoded_leaf.extend(left.as_bytes().to_vec()); + encoded_leaf.extend(right.as_bytes().to_vec()); + + self.curta_sha256(&encoded_leaf) + } +} + +pub fn determine_direction(dir: &near_light_client_protocol::Direction) -> bool { + match dir { + near_light_client_protocol::Direction::Left => true, + near_light_client_protocol::Direction::Right => false, + } +} + +const INACTIVE_NODE: [u8; 32] = [255; 32]; + +#[derive(CircuitVariable, Clone, Debug)] +pub struct MerklePathVariable { + pub path: ArrayVariable, + pub indices: ArrayVariable, +} +impl From for MerklePathVariableValue { + fn from(path: MerklePath) -> Self { + assert!(path.len() <= MAX_LEN, "merkle path too long"); + + let mut indices = path + .iter() + .map(|x| &x.direction) + .map(determine_direction) + .collect_vec(); + + indices.resize(MAX_LEN, Default::default()); + + let mut path = path.iter().map(|x| x.hash.0.into()).collect_vec(); + path.resize(MAX_LEN, INACTIVE_NODE.into()); + + Self { path, indices } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{test_utils::*, variables::ProofVariable}; + + #[test] + #[ignore] + fn beefy_test_path_is_ignored_if_default() { + let block_root = + CryptoHash::from_str("WWrLWbWHwSmjtTn5oBZPYgRCuCYn6fkYVa4yhPWNK4L").unwrap(); + + let define = |b: &mut B| { + let p = b.read::(); + let hash = p.block_header.hash(b); + + let root = b.get_root_from_merkle_proof_hashed_leaf_unindex( + &p.block_proof.path, + &p.block_proof.indices, + hash, + ); + let v = b.is_equal(root, p.head_block_root); + + b.write::(v); + }; + let writer = |input: &mut PI| { + input.write::( + near_light_client_protocol::Proof::Basic { + head_block_root: block_root, + proof: Box::new(fixture("old.json")), + } + .into(), + ); + }; + let assertions = |mut output: PO| { + assert!(output.read::()); + }; + builder_suite(define, writer, assertions); + } +} diff --git a/nearx/src/sync.rs b/nearx/src/sync.rs new file mode 100644 index 0000000..0070385 --- /dev/null +++ b/nearx/src/sync.rs @@ -0,0 +1,90 @@ +pub use plonky2x::{self, backend::circuit::Circuit, prelude::*}; + +use crate::{ + builder::Sync, + hint::{FetchHeaderInputs, FetchNextHeaderInputs}, + variables::{BuildEndorsement, CryptoHashVariable, EncodeInner, HashBpsInputs}, +}; + +// TODO: lazy sync +// TODO[Style]: Shared trait for protocol functionality between crate <> circuit +// TODO[Style]: macro to share all the same implementation with semantic type +// differences between protocol crate +// TODO: determine fees, allows integrators to charge +#[derive(Debug, Clone)] +pub struct SyncCircuit; + +impl Circuit for SyncCircuit { + fn define, const D: usize>(b: &mut CircuitBuilder) + where + <>::Config as plonky2::plonk::config::GenericConfig>::Hasher: + plonky2::plonk::config::AlgebraicHasher<>::Field>, + { + let network = NETWORK.into(); + let fetch_header = FetchHeaderInputs(network); + let fetch_next_header = FetchNextHeaderInputs(network); + + let trusted_header_hash = b.evm_read::(); + + // This is a very interesting trick to be able to get the BPS for the next epoch + // without the need to store the BPS, we verify the hash of the BPS in the + // circuit + let header = fetch_header.fetch(b, &trusted_header_hash); + let bps = fetch_next_header + .fetch(b, &header.inner_lite.next_epoch_id) + .unwrap() + .next_bps; + + let bps_hash = HashBpsInputs.hash(b, &bps); + b.assert_is_equal(header.inner_lite.next_bp_hash, bps_hash); + b.watch(&bps_hash, "calculate_bps_hash"); + + let next_block = fetch_next_header + .fetch(b, &trusted_header_hash) + .expect("Failed to fetch next block"); + + let synced = b.sync(&header, &bps, &next_block); + let synced_hash = synced.new_head.hash(b); + b.evm_write::(synced_hash); + } + + fn register_generators, const D: usize>(registry: &mut HintRegistry) + where + <>::Config as plonky2::plonk::config::GenericConfig>::Hasher: + plonky2::plonk::config::AlgebraicHasher, + { + registry.register_async_hint::(); + registry.register_async_hint::(); + registry.register_hint::(); + registry.register_hint::(); + registry.register_hint::(); + } +} + +#[cfg(test)] +mod beefy_tests { + use serial_test::serial; + + use super::*; + use crate::test_utils::{builder_suite, testnet_state, B, NETWORK, PI, PO}; + + #[test] + #[serial] + #[ignore] + fn beefy_test_sync_e2e() { + let (header, _, _) = testnet_state(); + let header = header.hash().0; + + let define = |b: &mut B| { + SyncCircuit::::define(b); + }; + let writer = |input: &mut PI| { + input.evm_write::(header.into()); + }; + let assertions = |mut output: PO| { + let hash = output.evm_read::(); + println!("hash: {:?}", hash); + }; + builder_suite(define, writer, assertions); + } +} diff --git a/nearx/src/test_utils.rs b/nearx/src/test_utils.rs new file mode 100644 index 0000000..7889d9d --- /dev/null +++ b/nearx/src/test_utils.rs @@ -0,0 +1,97 @@ +use std::fs; +pub use std::str::FromStr; + +pub use near_primitives::hash::CryptoHash; +use plonky2x::backend::function::{BytesRequestData, ProofRequest}; +pub use plonky2x::{ + backend::circuit::{PublicInput, PublicOutput}, + prelude::*, +}; +pub use test_utils::*; + +// Testnet Repr +pub const NETWORK: usize = 1; + +pub type B = CircuitBuilder; +pub type PI = PublicInput; +pub type PO = PublicOutput; + +pub fn builder_suite( + define: F, + writer: WriteInputs, + assertions: Assertions, +) where + F: FnOnce(&mut B), + WriteInputs: FnOnce(&mut PI), + Assertions: FnOnce(PO), +{ + pretty_env_logger::try_init().unwrap_or_default(); + + let mut builder = B::new(); + define(&mut builder); + + let circuit = builder.build(); + + let mut inputs = circuit.input(); + writer(&mut inputs); + + let proof_req = match &inputs { + PublicInput::Bytes(bytes) => Some(ProofRequest::::Bytes( + plonky2x::backend::function::ProofRequestBase { + release_id: "todo".to_string(), + parent_id: None, + files: None, + data: BytesRequestData { + input: bytes.clone(), + }, + }, + )), + PublicInput::Elements(elements) => Some(ProofRequest::::Elements( + plonky2x::backend::function::ProofRequestBase { + release_id: "todo".to_string(), + parent_id: None, + files: None, + data: plonky2x::backend::function::ElementsRequestData { + circuit_id: "todo".to_string(), + input: elements.clone(), + }, + }, + )), + _ => None, + }; + if let Some(req) = proof_req { + fs::write("../build/input.json", serde_json::to_string(&req).unwrap()).unwrap(); + } + + let (proof, output) = circuit.prove(&inputs); + + assertions(output.clone()); + + circuit.verify(&proof, &inputs, &output); +} + +#[allow(dead_code)] +pub fn mock_builder_suite( + define: F, + writer: WriteInputs, + assertions: Assertions, +) where + F: FnOnce(&mut B), + WriteInputs: FnOnce(&mut PI), + Assertions: FnOnce(PO), +{ + pretty_env_logger::try_init().unwrap_or_default(); + + let mut builder = B::new(); + define(&mut builder); + + let circuit = builder.mock_build(); + + let mut inputs = circuit.input(); + writer(&mut inputs); + + let (witness, output) = circuit.mock_prove(&inputs); + println!("Mock proof {:#?}", witness.full_witness()); + + assertions(output.clone()); +} diff --git a/nearx/src/variables.rs b/nearx/src/variables.rs new file mode 100644 index 0000000..1f75f73 --- /dev/null +++ b/nearx/src/variables.rs @@ -0,0 +1,781 @@ +use ethers::types::U256; +use near_light_client_protocol::{ + config::{ACCOUNT_DATA_SEPARATOR, NUM_BLOCK_PRODUCER_SEATS}, + prelude::{AccountId, CryptoHash, Header, Itertools}, + BlockHeaderInnerLiteView, ED25519PublicKey, LightClientBlockView, Proof, PublicKey, Signature, + StakeInfo, Synced, ValidatorStake, ValidatorStakeView, ValidatorStakeViewV1, +}; +use near_light_client_rpc::prelude::GetProof; +use plonky2x::{ + frontend::{ + curta::ec::point::{CompressedEdwardsY, CompressedEdwardsYVariable}, + ecc::curve25519::ed25519::eddsa::{EDDSASignatureVariable, EDDSASignatureVariableValue}, + hint::simple::hint::Hint, + vars::EvmVariable, + }, + prelude::*, +}; +use pretty_assertions::assert_eq; +use serde::{Deserialize, Serialize}; + +use crate::merkle::MerklePathVariable; + +// TODO: remove any unused fields like account id etc? +/// TODO: check if BPS seats changes for testnet/mainnet + +/// Type for omitting the size across the codebase for arrays that are the same +/// size as BPS +pub(crate) type BpsArr = ArrayVariable; + +pub type CryptoHashVariable = Bytes32Variable; +pub type BlockHeightVariable = U64Variable; +pub type BalanceVariable = U128Variable; +pub type AccountIdVariable = BytesVariable<{ AccountId::MAX_LEN }>; +pub type AccountIdVariableValue = ::ValueType; + +#[derive(CircuitVariable, Clone, Debug)] +pub struct HeaderVariable { + pub prev_block_hash: CryptoHashVariable, + pub inner_rest_hash: CryptoHashVariable, + pub inner_lite: HeaderInnerVariable, +} +impl From
for HeaderVariableValue { + fn from(header: Header) -> Self { + Self { + prev_block_hash: header.prev_block_hash.0.into(), + inner_rest_hash: header.inner_rest_hash.0.into(), + inner_lite: header.inner_lite.into(), + } + } +} +impl From for HeaderVariableValue { + fn from(header: LightClientBlockView) -> Self { + Self { + prev_block_hash: header.prev_block_hash.0.into(), + inner_rest_hash: header.inner_rest_hash.0.into(), + inner_lite: header.inner_lite.into(), + } + } +} +impl HeaderVariable { + pub(crate) fn hash, const D: usize>( + &self, + b: &mut CircuitBuilder, + ) -> CryptoHashVariable { + let inner_lite = self.inner_lite.hash(b); + let lite_rest = b.curta_sha256_pair(inner_lite, self.inner_rest_hash); + b.curta_sha256_pair(lite_rest, self.prev_block_hash) + } +} +impl EvmVariable for HeaderVariable { + fn encode, const D: usize>( + &self, + builder: &mut CircuitBuilder, + ) -> Vec { + let mut bytes = vec![]; + bytes.extend_from_slice(&self.prev_block_hash.encode(builder)); + bytes.extend_from_slice(&self.inner_rest_hash.encode(builder)); + bytes.extend_from_slice(&self.inner_lite.encode(builder)); + assert!(bytes.len() == 64 + INNER_ENCODED_LEN); + log::debug!("encoded header {:?}", bytes.len()); + bytes + } + + fn decode, const D: usize>( + builder: &mut CircuitBuilder, + bytes: &[ByteVariable], + ) -> Self { + assert!(bytes.len() == 64 + INNER_ENCODED_LEN); + let prev_block_hash = CryptoHashVariable::decode(builder, &bytes[0..32]); + let inner_rest_hash = CryptoHashVariable::decode(builder, &bytes[32..64]); + let inner_lite = HeaderInnerVariable::decode(builder, &bytes[64..64 + INNER_ENCODED_LEN]); + Self { + prev_block_hash, + inner_rest_hash, + inner_lite, + } + } + + fn encode_value(value: Self::ValueType) -> Vec { + let mut bytes = vec![]; + bytes.extend_from_slice(&CryptoHashVariable::encode_value::( + value.prev_block_hash, + )); + bytes.extend_from_slice(&CryptoHashVariable::encode_value::( + value.inner_rest_hash, + )); + bytes.extend_from_slice(&HeaderInnerVariable::encode_value::(value.inner_lite)); + assert!(bytes.len() == 64 + INNER_ENCODED_LEN); + log::debug!("encoded header value {:?}", bytes.len()); + bytes + } + + fn decode_value(bytes: &[u8]) -> Self::ValueType { + assert!(bytes.len() == 64 + INNER_ENCODED_LEN); + let prev_block_hash = CryptoHashVariable::decode_value::(&bytes[0..32]); + let inner_rest_hash = CryptoHashVariable::decode_value::(&bytes[32..64]); + let inner_lite = HeaderInnerVariable::decode_value::(&bytes[64..]); + Self::ValueType { + prev_block_hash, + inner_rest_hash, + inner_lite, + } + } +} + +#[derive(CircuitVariable, Clone, Debug)] +pub struct HeaderInnerVariable { + pub height: U64Variable, + pub epoch_id: CryptoHashVariable, + pub next_epoch_id: CryptoHashVariable, + pub prev_state_root: CryptoHashVariable, + pub outcome_root: CryptoHashVariable, + pub timestamp: U64Variable, + pub next_bp_hash: CryptoHashVariable, + pub block_merkle_root: CryptoHashVariable, +} +impl From for HeaderInnerVariableValue { + fn from(header: BlockHeaderInnerLiteView) -> Self { + Self { + height: header.height, + epoch_id: header.epoch_id.0.into(), + next_epoch_id: header.next_epoch_id.0.into(), + prev_state_root: header.prev_state_root.0.into(), + outcome_root: header.outcome_root.0.into(), + // Maybe don't need this anymore + timestamp: if header.timestamp > 0 { + header.timestamp + } else { + header.timestamp_nanosec + }, + next_bp_hash: header.next_bp_hash.0.into(), + block_merkle_root: header.block_merkle_root.0.into(), + } + } +} +pub const INNER_ENCODED_LEN: usize = 208; +impl HeaderInnerVariable { + pub(crate) fn encode_borsh, const D: usize>( + &self, + b: &mut CircuitBuilder, + ) -> BytesVariable { + // TODO: doubt we can abi encode this + let mut input_stream = VariableStream::new(); + input_stream.write(&self.height); + input_stream.write(&self.epoch_id); + input_stream.write(&self.next_epoch_id); + input_stream.write(&self.prev_state_root); + input_stream.write(&self.outcome_root); + input_stream.write(&self.timestamp); + input_stream.write(&self.next_bp_hash); + input_stream.write(&self.block_merkle_root); + + let output_bytes = b.hint(input_stream, EncodeInner); + output_bytes.read::>(b) + } + + pub(crate) fn hash, const D: usize>( + &self, + b: &mut CircuitBuilder, + ) -> CryptoHashVariable { + let bytes = self.encode_borsh(b); + b.curta_sha256(&bytes.0) + } +} +impl EvmVariable for HeaderInnerVariable { + fn encode, const D: usize>( + &self, + builder: &mut CircuitBuilder, + ) -> Vec { + let mut bytes = vec![]; + bytes.extend_from_slice(&self.height.encode(builder)); + bytes.extend_from_slice(&self.epoch_id.encode(builder)); + bytes.extend_from_slice(&self.next_epoch_id.encode(builder)); + bytes.extend_from_slice(&self.prev_state_root.encode(builder)); + bytes.extend_from_slice(&self.outcome_root.encode(builder)); + bytes.extend_from_slice(&self.timestamp.encode(builder)); + bytes.extend_from_slice(&self.next_bp_hash.encode(builder)); + bytes.extend_from_slice(&self.block_merkle_root.encode(builder)); + log::debug!("encoded inner: {:?}", bytes.len()); + assert_eq!(bytes.len(), INNER_ENCODED_LEN); + bytes + } + + fn decode, const D: usize>( + builder: &mut CircuitBuilder, + bytes: &[ByteVariable], + ) -> Self { + assert_eq!(bytes.len(), INNER_ENCODED_LEN); + let height = U64Variable::decode(builder, &bytes[0..8]); + let epoch_id = CryptoHashVariable::decode(builder, &bytes[8..40]); + let next_epoch_id = CryptoHashVariable::decode(builder, &bytes[40..72]); + let prev_state_root = CryptoHashVariable::decode(builder, &bytes[72..104]); + let outcome_root = CryptoHashVariable::decode(builder, &bytes[104..136]); + let timestamp = U64Variable::decode(builder, &bytes[136..144]); + let next_bp_hash = CryptoHashVariable::decode(builder, &bytes[144..176]); + let block_merkle_root = CryptoHashVariable::decode(builder, &bytes[176..INNER_ENCODED_LEN]); + Self { + height, + epoch_id, + next_epoch_id, + prev_state_root, + outcome_root, + timestamp, + next_bp_hash, + block_merkle_root, + } + } + + fn encode_value(value: Self::ValueType) -> Vec { + let mut bytes = vec![]; + bytes.extend_from_slice(&U64Variable::encode_value::(value.height)); + bytes.extend_from_slice(&CryptoHashVariable::encode_value::(value.epoch_id)); + bytes.extend_from_slice(&CryptoHashVariable::encode_value::(value.next_epoch_id)); + bytes.extend_from_slice(&CryptoHashVariable::encode_value::( + value.prev_state_root, + )); + bytes.extend_from_slice(&CryptoHashVariable::encode_value::(value.outcome_root)); + bytes.extend_from_slice(&U64Variable::encode_value::(value.timestamp)); + bytes.extend_from_slice(&CryptoHashVariable::encode_value::(value.next_bp_hash)); + bytes.extend_from_slice(&CryptoHashVariable::encode_value::( + value.block_merkle_root, + )); + log::debug!("encoded inner value: {:?}", bytes.len()); + assert_eq!(bytes.len(), INNER_ENCODED_LEN); + bytes + } + + fn decode_value(bytes: &[u8]) -> Self::ValueType { + assert_eq!(bytes.len(), INNER_ENCODED_LEN); + let height = U64Variable::decode_value::(&bytes[0..8]); + let epoch_id = CryptoHashVariable::decode_value::(&bytes[8..40]); + let next_epoch_id = CryptoHashVariable::decode_value::(&bytes[40..72]); + let prev_state_root = CryptoHashVariable::decode_value::(&bytes[72..104]); + let outcome_root = CryptoHashVariable::decode_value::(&bytes[104..136]); + let timestamp = U64Variable::decode_value::(&bytes[136..144]); + let next_bp_hash = CryptoHashVariable::decode_value::(&bytes[144..176]); + let block_merkle_root = + CryptoHashVariable::decode_value::(&bytes[176..INNER_ENCODED_LEN]); + + Self::ValueType { + height, + epoch_id, + next_epoch_id, + prev_state_root, + outcome_root, + timestamp, + next_bp_hash, + block_merkle_root, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct EncodeInner; +impl, const D: usize> Hint for EncodeInner { + fn hint(&self, input_stream: &mut ValueStream, output_stream: &mut ValueStream) { + let mut bytes: Vec = vec![]; + let height = input_stream.read_value::(); + let epoch_id = input_stream.read_value::(); + let next_epoch_id = input_stream.read_value::(); + let prev_state_root = input_stream.read_value::(); + let outcome_root = input_stream.read_value::(); + let timestamp = input_stream.read_value::(); + let next_bp_hash = input_stream.read_value::(); + let block_merkle_root = input_stream.read_value::(); + + bytes.extend_from_slice(&height.to_le_bytes()); + bytes.extend_from_slice(&epoch_id.0); + bytes.extend_from_slice(&next_epoch_id.0); + bytes.extend_from_slice(&prev_state_root.0); + bytes.extend_from_slice(&outcome_root.0); + bytes.extend_from_slice(×tamp.to_le_bytes()); + bytes.extend_from_slice(&next_bp_hash.0); + bytes.extend_from_slice(&block_merkle_root.0); + + assert_eq!( + bytes.len(), + INNER_ENCODED_LEN, + "expected {} bytes, got {}", + INNER_ENCODED_LEN, + bytes.len() + ); + + let bytes: [u8; INNER_ENCODED_LEN] = bytes.try_into().unwrap(); + output_stream.write_value::>(bytes); + } +} + +#[derive(CircuitVariable, Clone, Debug)] +pub struct BlockVariable { + pub header: HeaderVariable, + pub next_block_inner_hash: CryptoHashVariable, + pub next_bps: BpsArr, + pub approvals_after_next: BpsApprovals, + pub next_bps_hash: CryptoHashVariable, +} + +impl From for BlockVariableValue { + fn from(block: LightClientBlockView) -> Self { + // TODO[Optimisation]: Constrain these in-circuit + let next_bps_hash = block + .next_bps + .as_ref() + .map(CryptoHash::hash_borsh) + .unwrap_or_default() + .0 + .into(); + + let variable = Self { + next_block_inner_hash: block.next_block_inner_hash.0.into(), + header: block.clone().into(), + next_bps: bps_to_variable(block.next_bps), + approvals_after_next: block.approvals_after_next.into(), + next_bps_hash, + }; + assert_eq!(variable.next_bps.len(), NUM_BLOCK_PRODUCER_SEATS); + assert_eq!( + variable.approvals_after_next.is_active.len(), + NUM_BLOCK_PRODUCER_SEATS + ); + assert_eq!( + variable.approvals_after_next.signatures.len(), + NUM_BLOCK_PRODUCER_SEATS + ); + variable + } +} + +#[derive(CircuitVariable, Clone, Debug)] +pub struct BpsApprovals { + pub is_active: BpsArr, + pub signatures: BpsArr, +} + +impl From>>> + for BpsApprovalsValue +{ + fn from(mut approvals: Vec>>) -> Self { + approvals.resize(AMT, None); + let (signatures, is_active) = approvals + .into_iter() + .take(AMT) + .map(|s| { + let is_active = s.is_some(); + let s: SignatureVariableValue = s.into(); + + (s.signature, is_active) + }) + .unzip(); + + Self { + is_active, + signatures, + } + } +} + +pub(crate) fn bps_to_variable>( + next_bps: Option>, +) -> Vec> { + next_bps + .map(|next_bps| { + let mut bps = next_bps + .into_iter() + .take(NUM_BLOCK_PRODUCER_SEATS) + .map(Into::::into) + .map(Into::>::into) + .collect_vec(); + bps.resize(NUM_BLOCK_PRODUCER_SEATS, Default::default()); + bps + }) + .unwrap_or_else(|| vec![Default::default(); NUM_BLOCK_PRODUCER_SEATS]) +} + +#[derive(CircuitVariable, Clone, Debug)] +pub struct ValidatorStakeVariable { + pub account_id: AccountIdVariable, + pub public_key: PublicKeyVariable, + pub stake: BalanceVariable, +} + +const ACCOUNT_ID_PADDING_BYTE: u8 = ACCOUNT_DATA_SEPARATOR; +impl From for ValidatorStakeVariableValue { + fn from(vs: ValidatorStake) -> Self { + let public_key = CompressedEdwardsY(vs.public_key().unwrap_as_ed25519().0); + let stake = vs.stake().into(); + let account_id = pad_account_id(&vs.take_account_id()); + Self { + account_id, + public_key, + stake, + } + } +} + +pub(crate) fn pad_account_id(account_id: &AccountId) -> [u8; AccountId::MAX_LEN] { + let account_id = account_id.as_str().as_bytes().to_vec(); + pad_account_bytes(account_id) +} + +pub(crate) fn pad_account_bytes(mut account_id: Vec) -> [u8; AccountId::MAX_LEN] { + account_id.resize(AccountId::MAX_LEN, ACCOUNT_ID_PADDING_BYTE); + account_id.try_into().expect("invalid account bytes") +} + +pub(crate) fn normalise_account_id( + account_id: &AccountIdVariableValue, +) -> AccountId { + let unpadded_bytes = account_id + .split(|x| *x == ACCOUNT_ID_PADDING_BYTE) + .collect_vec()[0]; + let account_str = String::from_utf8(unpadded_bytes.to_vec()).expect("invalid account bytes"); + log::trace!("account id: {}", account_str); + account_str.parse().expect("invalid account id") +} + +impl From> for ValidatorStakeView { + fn from(val: ValidatorStakeVariableValue) -> Self { + let account_id = normalise_account_id::(&val.account_id); + let public_key = PublicKey::ED25519(ED25519PublicKey(val.public_key.0)); + ValidatorStakeView::V1(ValidatorStakeViewV1 { + account_id, + public_key, + stake: val.stake.as_u128(), + }) + } +} + +impl Default for ValidatorStakeVariableValue { + fn default() -> Self { + let account_id: [u8; AccountId::MAX_LEN] = [0u8; AccountId::MAX_LEN]; + let public_key = CompressedEdwardsY::default(); + + Self { + account_id, + public_key, + stake: u128::default().into(), + } + } +} + +pub type PublicKeyVariable = CompressedEdwardsYVariable; + +#[derive(CircuitVariable, Clone, Debug)] +pub struct SignatureVariable { + pub signature: EDDSASignatureVariable, +} + +impl From>> for SignatureVariableValue { + fn from(sig: Option>) -> Self { + sig.and_then(|s| match *s { + Signature::ED25519(s) => Some(Self { + signature: EDDSASignatureVariableValue { + r: CompressedEdwardsY(*s.r_bytes()), + s: U256::from_little_endian(s.s_bytes()), + }, + }), + // Silently ignores invalid signatures (ECDSA) + // The reasoning being that ECDSA is being phased out and almost all validators + // use EDDSA. + // If we still need this, we should implement ECDSA. + _ => None, + }) + .unwrap_or_default() + } +} + +impl Default for SignatureVariableValue { + fn default() -> Self { + Self { + signature: EDDSASignatureVariableValue { + r: CompressedEdwardsY::default(), + s: Default::default(), + }, + } + } +} + +#[derive(CircuitVariable, Clone, Debug)] +pub struct ProofVariable { + pub head_block_root: CryptoHashVariable, + // TODO: constrain the outcome hash by borsh encoding in the circuit, not here + pub outcome_hash: CryptoHashVariable, + pub outcome_proof_block_hash: CryptoHashVariable, + pub outcome_proof: MerklePathVariable<16>, // TODO: get real number here + pub outcome_root_proof: MerklePathVariable<8>, // TODO: get real number here + pub block_header: HeaderVariable, + pub block_proof: MerklePathVariable<64>, // TODO: get real number here +} + +impl From for ProofVariableValue +where + F: RichField, +{ + fn from(proof: Proof) -> Self { + match proof { + Proof::Basic { + head_block_root, + proof, + } => Self { + head_block_root: head_block_root.0.into(), + outcome_hash: CryptoHash::hash_borsh(proof.outcome_proof.to_hashes()) + .0 + .into(), + outcome_proof_block_hash: proof.outcome_proof.block_hash.0.into(), + outcome_proof: proof.outcome_proof.proof.into(), + outcome_root_proof: proof.outcome_root_proof.into(), + block_header: proof.block_header_lite.into(), + block_proof: proof.block_proof.into(), + }, + Proof::Experimental(_) => todo!("Batch proving"), + } + } +} + +#[derive(CircuitVariable, Clone, Debug)] +pub struct StakeInfoVariable { + pub approved: BalanceVariable, + pub total: BalanceVariable, +} + +impl From for StakeInfoVariableValue { + fn from(value: StakeInfo) -> Self { + Self { + approved: value.approved.into(), + total: value.total.into(), + } + } +} + +pub type ApprovalMessage = BytesVariable<41>; + +// TODO: not sure these even need to be hints +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct BuildEndorsement; + +impl, const D: usize> Hint for BuildEndorsement { + fn hint(&self, input_stream: &mut ValueStream, output_stream: &mut ValueStream) { + let mut bytes = vec![]; + let next_block_hash = input_stream.read_value::(); + let next_block_height = input_stream.read_value::(); + + bytes.push(0u8); + bytes.extend_from_slice(next_block_hash.as_bytes()); + bytes.extend_from_slice(&(next_block_height + 2).to_le_bytes()); + + output_stream.write_value::(bytes.try_into().unwrap()); + } +} + +#[derive(CircuitVariable, Clone, Debug)] +pub struct SyncedVariable { + pub new_head: HeaderVariable, + pub next_bps_epoch: CryptoHashVariable, + pub next_bps: BpsArr, +} + +impl From for SyncedVariableValue +where + F: RichField, +{ + fn from(value: Synced) -> Self { + let default_bps = vec![ValidatorStakeVariableValue::default(); NUM_BLOCK_PRODUCER_SEATS]; + Self { + new_head: value.new_head.into(), + next_bps_epoch: value + .next_bps + .as_ref() + .map(|v| v.0 .0 .0.into()) + .unwrap_or_default(), + next_bps: value + .next_bps + .map(|v| v.1.into_iter().map(Into::into).collect_vec()) + .unwrap_or(default_bps), + } + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct HashBpsInputs; + +impl, const D: usize> Hint for HashBpsInputs { + fn hint(&self, input_stream: &mut ValueStream, output_stream: &mut ValueStream) { + let bps = input_stream.read_value::>(); + let default_validator = + ValidatorStakeVariableValue::<>::Field>::default(); + + let bps = bps + .into_iter() + .filter(|x| x.account_id != default_validator.account_id) + .map(Into::::into) + .collect_vec(); + log::debug!("Bps to hash: {:#?}", bps); + let hash = CryptoHash::hash_borsh(bps); + log::debug!("Hash: {:#?}", hash); + + // TODO: figure out how to hash this in circuit + // It's non trivial because the account id is padded to the max len + output_stream.write_value::(hash.0.into()); + } +} + +impl HashBpsInputs { + pub fn hash, const D: usize>( + self, + b: &mut CircuitBuilder, + bps: &BpsArr, + ) -> CryptoHashVariable { + let mut input_stream = VariableStream::new(); + input_stream.write::>(bps); + + let output_stream = b.hint(input_stream, self); + output_stream.read::(b) + } +} + +// TODO: EVM these, maybe macro? +#[derive(CircuitVariable, Clone, Debug)] +pub struct TransactionOrReceiptIdVariable { + pub is_transaction: BoolVariable, + pub id: CryptoHashVariable, + pub account: AccountIdVariable, +} + +impl From for TransactionOrReceiptIdVariableValue { + fn from(value: GetProof) -> Self { + match value { + GetProof::Transaction { + transaction_hash, + sender_id, + } => Self { + is_transaction: true, + id: transaction_hash.0.into(), + account: pad_account_id(&sender_id), + }, + GetProof::Receipt { + receipt_id, + receiver_id, + } => Self { + is_transaction: false, + id: receipt_id.0.into(), + account: pad_account_id(&receiver_id), + }, + } + } +} + +pub fn byte_from_bool, const D: usize>( + b: &mut CircuitBuilder, + bool: BoolVariable, +) -> ByteVariable { + let zero = b._false(); + let mut bits = [zero; 8]; + bits[7] = bool; + + ByteVariable::from_be_bits(bits) +} + +impl EvmVariable for TransactionOrReceiptIdVariable { + fn encode, const D: usize>( + &self, + builder: &mut CircuitBuilder, + ) -> Vec { + let mut bytes = vec![]; + bytes.extend_from_slice(&byte_from_bool(builder, self.is_transaction).encode(builder)); + bytes.extend_from_slice(&self.id.encode(builder)); + bytes.extend_from_slice(&self.account.encode(builder)); + bytes + } + + fn decode, const D: usize>( + builder: &mut CircuitBuilder, + bytes: &[ByteVariable], + ) -> Self { + let zero = builder.zero::(); + let is_receipt = builder.is_equal(bytes[0], zero); + let is_transaction = builder.not(is_receipt); + Self { + is_transaction, + id: CryptoHashVariable::decode(builder, &bytes[1..33]), + account: AccountIdVariable::decode(builder, &bytes[33..33 + AccountId::MAX_LEN]), + } + } + fn encode_value(value: Self::ValueType) -> Vec { + let mut bytes = vec![value.is_transaction as u8]; + bytes.extend_from_slice(&CryptoHashVariable::encode_value::(value.id)); + bytes.extend_from_slice(&AccountIdVariable::encode_value::(pad_account_bytes( + value.account.to_vec(), + ))); + bytes + } + fn decode_value(bytes: &[u8]) -> Self::ValueType { + assert_eq!(bytes.len(), 1 + 32 + AccountId::MAX_LEN); + + Self::ValueType { + is_transaction: bytes[0] != 0, + id: CryptoHashVariable::decode_value::(&bytes[1..33]), + account: AccountIdVariable::decode_value::(&bytes[33..33 + AccountId::MAX_LEN]), + } + } +} +#[cfg(test)] +mod tests { + use std::str::FromStr; + + use ::test_utils::CryptoHash; + use near_light_client_protocol::prelude::Itertools; + use near_primitives::types::TransactionOrReceiptId; + + use super::*; + use crate::{ + test_utils::{builder_suite, B, PI, PO}, + variables::TransactionOrReceiptIdVariableValue, + }; + + #[test] + fn test_serialise_tx() { + fn tx(hash: &str, sender: &str) -> TransactionOrReceiptId { + TransactionOrReceiptId::Transaction { + transaction_hash: CryptoHash::from_str(hash).unwrap(), + sender_id: sender.parse().unwrap(), + } + } + fn rx(hash: &str, receiver: &str) -> TransactionOrReceiptId { + TransactionOrReceiptId::Receipt { + receipt_id: CryptoHash::from_str(hash).unwrap(), + receiver_id: receiver.parse().unwrap(), + } + } + + let txs: Vec> = vec![ + tx( + "3z2zqitrXNYQs19z5tK5a4bZSxdx7baqzGFUyGAkW9Mz", + "zavodil.testnet", + ), + rx( + "9cVuYLKYF26QevZ315RLb9ArU3gbcgPc4LDRJfZQyZHo", + "priceoracle.testnet", + ), + ] + .into_iter() + .map(Into::into) + .collect_vec(); + + let define = |b: &mut B| { + let receipt = b.evm_read::(); + b.evm_write::(receipt); + let tx = b.evm_read::(); + b.evm_write::(tx); + }; + let writer = |input: &mut PI| { + input.evm_write::(txs[0].clone().into()); + input.evm_write::(txs[1].clone().into()); + }; + let assertions = |mut output: PO| { + println!("{:#?}", output.evm_read::()); + println!("{:#?}", output.evm_read::()); + }; + builder_suite(define, writer, assertions); + } +} diff --git a/nearx/src/verify.rs b/nearx/src/verify.rs new file mode 100644 index 0000000..4d7ced2 --- /dev/null +++ b/nearx/src/verify.rs @@ -0,0 +1,304 @@ +use near_light_client_protocol::prelude::Itertools; +pub use plonky2x::{self, backend::circuit::Circuit, prelude::*}; +use plonky2x::{ + frontend::{hint::simple::hint::Hint, mapreduce::generator::MapReduceDynamicGenerator}, + prelude::plonky2::plonk::config::{AlgebraicHasher, GenericConfig}, + register_watch_generator, +}; +use serde::{Deserialize, Serialize}; + +use crate::{ + builder::Verify, + hint::{FetchHeaderInputs, FetchProofInputs, ProofInputVariable}, + variables::{byte_from_bool, CryptoHashVariable, EncodeInner, TransactionOrReceiptIdVariable}, +}; + +pub type ProofMapReduceVariable = ArrayVariable; + +#[derive(CircuitVariable, Debug, Clone)] +pub struct ProofVerificationResultVariable { + pub id: CryptoHashVariable, + pub result: BoolVariable, +} + +#[derive(Debug, Clone)] +pub struct VerifyCircuit; + +impl Circuit + for VerifyCircuit +{ + fn define, const D: usize>(b: &mut CircuitBuilder) + where + <>::Config as GenericConfig>::Hasher: + AlgebraicHasher<>::Field>, + { + let trusted_header_hash = b.evm_read::(); + let head = FetchHeaderInputs(NETWORK.into()).fetch(b, &trusted_header_hash); + + let mut ids = vec![]; + for _ in 0..N { + ids.push(b.evm_read::()); + } + + let proofs = FetchProofInputs::(NETWORK.into()).fetch(b, &head, &ids); + + // Init a default result for N + let zero = b.constant::([0u8; 32].into()); + let _false = b._false(); + let default = ProofVerificationResultVariable { + id: zero, + result: _false, + }; + + // TODO: write some outputs here for each ID + let output = b.mapreduce_dynamic::, Self, B, _, _>( + default, + proofs.data, + |default, proofs, b| { + let mut results = vec![]; + + // TODO[Optimisation]: could parallelise these + for ProofInputVariable { id, proof } in proofs.data { + let result = b.verify(proof); + results.push(ProofVerificationResultVariable { id, result }); + } + + results.resize( + N, + default, + ); + + results.into() + }, + |_, l, r, b| MergeProofHint::.merge(b, &l, &r), + ); + b.watch_slice(&output.data, "output"); + for r in output.data { + b.evm_write::(r.id); + let passed = byte_from_bool(b, r.result); + b.evm_write::(passed); + } + } + + fn register_generators, const D: usize>(registry: &mut HintRegistry) + where + <>::Config as GenericConfig>::Hasher: AlgebraicHasher, + { + registry.register_async_hint::>(); + registry.register_hint::>(); + registry.register_async_hint::(); + + // We hash in verify + registry.register_hint::(); + + let dynamic_id = MapReduceDynamicGenerator::::id(); + + registry.register_simple::, + Self, + B, + D, + >>(dynamic_id); + + register_watch_generator!(registry, L, D, ProofVerificationResultVariable); + } +} + +// Hinting for this as it's taking too much effort to do it in a constrained way +// It's probably a security risk that we'd need to fix later since technically +// these can just be changed post-verification +// +// |ctx, mut left, right, b| { +// let mut r_heights = right.height_indices.data; +// let mut r_results = right.results.data; +// +// left.height_indices +// .data +// .iter_mut() +// .zip(left.results.data.iter_mut()) +// .for_each(|(h, r)| { +// let is_zero = b.is_equal(h.clone(), ctx.zero); +// *h = b.select(is_zero, r_heights.pop().unwrap(), *h); +// *r = b.select(is_zero, r_results.pop().unwrap(), *r); +// }); +// +// left +// }, +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MergeProofHint; + +impl, const D: usize, const N: usize> Hint for MergeProofHint { + fn hint(&self, input_stream: &mut ValueStream, output_stream: &mut ValueStream) { + let left = input_stream.read_value::>(); + log::debug!("Left results: {:?}", left); + + let right = input_stream.read_value::>(); + log::debug!("Right results: {:?}", right); + + let mut results = left + .into_iter() + .chain(right) + .filter_map(|r| { + if r.id.0 != [0u8; 32] && r.id.0 != [255u8; 32] { + Some(r) + } else { + None + } + }) + .collect_vec(); + + log::debug!("Merged results: {:?}", results); + + results.resize( + N, + ProofVerificationResultVariableValue:: { + id: [0u8; 32].into(), + result: false, + }, + ); + + output_stream.write_value::>(results); + } +} + +impl MergeProofHint { + fn merge, const D: usize>( + self, + b: &mut CircuitBuilder, + left: &ProofMapReduceVariable, + right: &ProofMapReduceVariable, + ) -> ProofMapReduceVariable { + let mut input_stream = VariableStream::new(); + input_stream.write::>(left); + input_stream.write::>(right); + + let output_stream = b.hint(input_stream, self); + output_stream.read::>(b) + } +} + +#[cfg(test)] +mod beefy_tests { + use std::str::FromStr; + + use near_light_client_protocol::prelude::Itertools; + use near_primitives::types::TransactionOrReceiptId; + use serial_test::serial; + use test_utils::{fixture, CryptoHash}; + + use super::*; + use crate::{ + test_utils::{builder_suite, testnet_state, B, NETWORK, PI, PO}, + variables::TransactionOrReceiptIdVariableValue, + }; + + #[test] + #[serial] + #[ignore] + fn beefy_test_verify_e2e() { + let (header, _, _) = testnet_state(); + + // TODO: test many configs of these + const AMT: usize = 2; + const BATCH: usize = 1; + + fn tx(hash: &str, sender: &str) -> TransactionOrReceiptId { + TransactionOrReceiptId::Transaction { + transaction_hash: CryptoHash::from_str(hash).unwrap(), + sender_id: sender.parse().unwrap(), + } + } + fn rx(hash: &str, receiver: &str) -> TransactionOrReceiptId { + TransactionOrReceiptId::Receipt { + receipt_id: CryptoHash::from_str(hash).unwrap(), + receiver_id: receiver.parse().unwrap(), + } + } + + // TODO: test way more of these, pull the last 64 transactions and prove them + let txs: Vec> = vec![ + tx( + "3z2zqitrXNYQs19z5tK5a4bZSxdx7baqzGFUyGAkW9Mz", + "zavodil.testnet", + ), + rx( + "9cVuYLKYF26QevZ315RLb9ArU3gbcgPc4LDRJfZQyZHo", + "priceoracle.testnet", + ), + ] + .into_iter() + .map(Into::into) + .collect_vec(); + + assert_eq!(txs.len(), AMT); + + let define = |b: &mut B| { + VerifyCircuit::::define(b); + }; + let writer = |input: &mut PI| { + input.evm_write::(header.hash().0.into()); + for tx in txs { + input.evm_write::(tx.into()); + } + }; + let assertions = |mut output: PO| { + let mut results = vec![]; + for _ in 0..AMT { + let id = output.evm_read::(); + let result = output.evm_read::(); + results.push(ProofVerificationResultVariableValue:: { + id, + result: result != 0, + }); + } + println!("{:#?}", results); + }; + builder_suite(define, writer, assertions); + } + + // TODO: ignore flag as this test will likely be overkill + // #[test] + // #[serial] + // #[ignore] + #[allow(dead_code)] // Justification: huge test, takes 36 minutes. keep for local testing + fn beefy_test_data_driven_verify_e2e() { + let (header, _, _) = testnet_state(); + + const AMT: usize = 128; + const BATCH: usize = 4; + + let txs = fixture::>("ids.json") + .into_iter() + .take(AMT) + .map(Into::>::into) + .collect_vec(); + + assert_eq!(txs.len(), AMT); + + let define = |b: &mut B| { + VerifyCircuit::::define(b); + }; + let writer = |input: &mut PI| { + input.evm_write::(header.hash().0.into()); + for tx in txs { + input.evm_write::(tx.into()); + } + }; + let assertions = |mut output: PO| { + let mut results = vec![]; + for _ in 0..AMT { + let id = output.evm_read::(); + let result = output.evm_read::(); + results.push(ProofVerificationResultVariableValue:: { + id, + result: result != 0, + }); + } + println!("{:#?}", results); + }; + builder_suite(define, writer, assertions); + } +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 037198b..8d9329f 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -2,5 +2,5 @@ # This specifies the version of Rust we use to build. # Individual crates in the workspace may support a lower version, as indicated by `rust-version` field in each crate's `Cargo.toml`. # The version specified below, should be at least as high as the maximum `rust-version` within the workspace. -channel = "1.75.0" -components = [ "rustfmt", "clippy"] +channel = "nightly-2023-12-31" +components = [ "rustfmt", "clippy" ] diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..cd5d6b1 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,8 @@ +# Justification: Rust will be moving to this going forward +group_imports = "StdExternalCrate" + +# Justification: Just cleaner +imports_granularity = "Crate" + +format_code_in_doc_comments = true +wrap_comments = true diff --git a/src/client/rpc.rs b/src/client/rpc.rs deleted file mode 100644 index de9bd8d..0000000 --- a/src/client/rpc.rs +++ /dev/null @@ -1,112 +0,0 @@ -use super::message::GetProof; -use crate::prelude::*; -use futures::TryFutureExt; -use near_jsonrpc_client::{ - methods::{self, light_client_proof::RpcLightClientExecutionProofResponse}, - JsonRpcClient, -}; -use near_primitives::views::LightClientBlockView; -use std::fmt::{Display, Formatter}; - -// TODO: retry, failover rpcs - -#[derive(Debug, Clone, Deserialize, Default)] -pub enum Network { - Mainnet, - #[default] - Testnet, - Localnet, -} - -impl Network { - pub fn to_endpoint(&self) -> &str { - const MAINNET_RPC_ENDPOINT: &str = "https://rpc.mainnet.near.org"; - const TESTNET_RPC_ENDPOINT: &str = "https://rpc.testnet.near.org"; - match self { - Self::Mainnet => MAINNET_RPC_ENDPOINT, - Self::Testnet => TESTNET_RPC_ENDPOINT, - _ => "http://`localhost:3030", - } - } - pub fn archive_endpoint(&self) -> &str { - const MAINNET_RPC_ARCHIVE_ENDPOINT: &str = "https://archival-rpc.mainnet.near.org"; - const TESTNET_RPC_ARCHIVE_ENDPOINT: &str = "https://archival-rpc.testnet.near.org"; - match self { - Self::Mainnet => MAINNET_RPC_ARCHIVE_ENDPOINT, - Self::Testnet => TESTNET_RPC_ARCHIVE_ENDPOINT, - _ => "http://`localhost:3030", - } - } -} -impl Display for Network { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let s = match self { - Self::Mainnet => "mainnet", - Self::Testnet => "testnet", - _ => "localnet", - }; - write!(f, "{}", s) - } -} - -#[derive(Clone)] -pub struct NearRpcClient { - client: JsonRpcClient, - archive: JsonRpcClient, -} - -impl std::fmt::Debug for NearRpcClient { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("NearRpcClient").finish() - } -} - -impl NearRpcClient { - pub fn new(network: Network) -> Self { - let client = JsonRpcClient::connect(network.to_endpoint()); - let archive = JsonRpcClient::connect(network.archive_endpoint()); - - NearRpcClient { client, archive } - } - - pub async fn fetch_latest_header( - &self, - latest_verified: &CryptoHash, - ) -> Option { - let req = methods::next_light_client_block::RpcLightClientNextBlockRequest { - last_block_hash: *latest_verified, - }; - log::debug!("requesting next block: {:?}", req); - self.client - .call(&req) - .or_else(|e| { - debug!("Error hitting main rpc, falling back to archive: {:?}", e); - self.archive.call(&req) - }) - .await - .map_err(|e| { - log::error!("Error fetching latest header: {:?}", e); - e - }) - .ok()? - } - - pub async fn fetch_light_client_proof( - &self, - req: GetProof, - latest_verified: CryptoHash, - ) -> Result { - let req = methods::light_client_proof::RpcLightClientExecutionProofRequest { - id: req.0, - light_client_head: latest_verified, - }; - self.client - .call(&req) - .or_else(|e| { - debug!("Error hitting main rpc, falling back to archive: {:?}", e); - self.archive.call(&req) - }) - .await - .map_err(|e| anyhow::format_err!("{:?}:{}", req.id, e)) - } -} diff --git a/statelessnet.toml b/statelessnet.toml new file mode 100644 index 0000000..646ff68 --- /dev/null +++ b/statelessnet.toml @@ -0,0 +1,5 @@ +catchup = true +host = "0.0.0.0:3030" +network = "Statelessnet" +starting_head = "HqbXSLFKKvNiqruwkYj2pittRZJyXuBKHRWTVHRVcwEb" +state_path = "statelessnetstate.db" diff --git a/succinct.json b/succinct.json new file mode 100644 index 0000000..6f71bf6 --- /dev/null +++ b/succinct.json @@ -0,0 +1,24 @@ +{ + "entrypoints": [ + { + "name": "sync", + "framework": "plonky2x", + "baseDir": ".", + "buildCommand": "make build-sync-circuit", + "proveCommand": "make prove-sync-circuit", + "requiredArtifacts": [ + "sync" + ] + }, + { + "name": "verify", + "framework": "plonky2x", + "baseDir": ".", + "buildCommand": "make build-verify-circuit", + "proveCommand": "make prove-verify-circuit", + "requiredArtifacts": [ + "verify" + ] + } + ] +} diff --git a/.taplo.toml b/taplo.toml similarity index 94% rename from .taplo.toml rename to taplo.toml index 2d196b7..363d372 100644 --- a/.taplo.toml +++ b/taplo.toml @@ -16,4 +16,4 @@ compact_arrays = false # Alphabetically reorder keys that are not separated by empty lines. reorder_keys = true -exclude = [ "vendor/*", "build/*", ".direnv/*" ] +exclude = [ "vendor/**", "build/**", ".direnv/**" ] diff --git a/vendor/starkyx b/vendor/starkyx new file mode 160000 index 0000000..80604ac --- /dev/null +++ b/vendor/starkyx @@ -0,0 +1 @@ +Subproject commit 80604accb5f6a287e31f945e4e923c3d0e1a7832 diff --git a/vendor/succinctx b/vendor/succinctx new file mode 160000 index 0000000..4e539f2 --- /dev/null +++ b/vendor/succinctx @@ -0,0 +1 @@ +Subproject commit 4e539f2ea4a42cedcd0b056346ef8009cc24f619