From 8f340077b202886cb57ec732cbd7fd315a008262 Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:25:21 +0200 Subject: [PATCH 01/85] chore: update readme with new ported repositories --- README.md | 10 +++++----- justfile | 18 ------------------ 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index a35b9365f..76acc921c 100644 --- a/README.md +++ b/README.md @@ -99,11 +99,6 @@ In particular, the core components are: that handles the receipt of preconfirmation requests from users, translates them into _constraints_, and forwards them to relays. Additionally, it handles the fallback logic to produce a block locally when relays send invalid inclusion proofs. -- [**Builder**](./builder/): A fork of the [Flashbots builder][fb-builder] that - subscribes to new constraints from relays, builds blocks that respect them, and - includes the necessary proofs of inclusion in the bids submitted to relays. -- [**MEV-Boost**](./mev-boost/): A fork of the [Flashbots MEV-Boost][fb-mev-boost] sidecar - that includes new API endpoints to proxy requests from the Bolt Sidecar to the connected relays. - [**Bolt Contracts**](./bolt-contracts/): A set of smart contracts for peripheral functionality such as proposer registration and permissionless dispute resolution for attributable faults. - [**Bolt Boost**](./bolt-boost/): A [Commit-Boost][commit-boost] module that implements the Constraints-API. @@ -119,6 +114,11 @@ Bolt also relies on a few external components that are not part of this reposito Ethereum package with custom components for Bolt. - [**Helix Relay**](https://github.com/chainbound/helix): A fork of the [Gattaca Helix][helix] relay that implements the Constraints API to proxy requests from the Bolt Sidecar to the connected builders. +- [**Bolt Builder**](https://github.com/chainbound/bolt-builder): A fork of the [Flashbots builder][fb-builder] that + subscribes to new constraints from relays, builds blocks that respect them, and + includes the necessary proofs of inclusion in the bids submitted to relays. +- [**Bolt MEV-Boost**](https://github.com/chainbound/bolt-mev-boost): A fork of the [Flashbots MEV-Boost][fb-mev-boost] + sidecar that includes new API endpoints to proxy requests from the Bolt Sidecar to the connected relays.
List of legacy components that are not updated to the latest version of Bolt: diff --git a/justfile b/justfile index 974344ec2..f39da0357 100644 --- a/justfile +++ b/justfile @@ -145,28 +145,13 @@ send-blob-preconf count='1': # build all the docker images locally build-images: - @just _build-builder - @just _build-relay @just _build-sidecar - @just _build-mevboost @just _build-bolt-boost -# build the docker image for the bolt builder -_build-builder: - cd builder && docker build -t ghcr.io/chainbound/bolt-builder:0.1.0 . --load - -# build the docker image for the bolt relay -_build-relay: - cd mev-boost-relay && docker build -t ghcr.io/chainbound/bolt-relay:0.1.0 . --load - # build the docker image for the bolt sidecar _build-sidecar: cd bolt-sidecar && docker build -t ghcr.io/chainbound/bolt-sidecar:0.1.0 . --load -# build the docker image for the bolt mev-boost sidecar -_build-mevboost: - cd mev-boost && docker build -t ghcr.io/chainbound/bolt-mev-boost:0.1.0 . --load - # build the docker image for bolt-boost _build-bolt-boost: cd bolt-boost && docker build -t ghcr.io/chainbound/bolt-boost:0.1.0 . --load @@ -193,6 +178,3 @@ stop-sidecar-dev chain: release tag: chmod +x ./scripts/check_version_bumps.sh && ./scripts/check_version_bumps.sh {{tag}} cd bolt-sidecar && docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/chainbound/bolt-sidecar:{{tag}} --push . - cd mev-boost-relay && docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/chainbound/bolt-relay:{{tag}} --push . - cd builder && docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/chainbound/bolt-builder:{{tag}} --push . - cd mev-boost && docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/chainbound/bolt-mev-boost:{{tag}} --push . From 0a23908f7da5d73736554faa604ef8e6be8231e9 Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:02:54 +0200 Subject: [PATCH 02/85] chore: rm bolt-client binary --- bolt-client/.gitignore | 2 - bolt-client/Cargo.lock | 4747 ------------------------------- bolt-client/Cargo.toml | 24 - bolt-client/README.md | 46 - bolt-client/rust-toolchain.toml | 3 - bolt-client/rustfmt.toml | 11 - bolt-client/src/main.rs | 167 -- bolt-client/src/registry.rs | 241 -- bolt-client/src/utils.rs | 148 - 9 files changed, 5389 deletions(-) delete mode 100644 bolt-client/.gitignore delete mode 100644 bolt-client/Cargo.lock delete mode 100644 bolt-client/Cargo.toml delete mode 100644 bolt-client/README.md delete mode 100644 bolt-client/rust-toolchain.toml delete mode 100644 bolt-client/rustfmt.toml delete mode 100644 bolt-client/src/main.rs delete mode 100644 bolt-client/src/registry.rs delete mode 100644 bolt-client/src/utils.rs diff --git a/bolt-client/.gitignore b/bolt-client/.gitignore deleted file mode 100644 index 5f32e705c..000000000 --- a/bolt-client/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target/ -.env \ No newline at end of file diff --git a/bolt-client/Cargo.lock b/bolt-client/Cargo.lock deleted file mode 100644 index 0a8fe5832..000000000 --- a/bolt-client/Cargo.lock +++ /dev/null @@ -1,4747 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "alloy" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45855eb65e9cc70294ebea1279f6d8ee0636bf2ed3897683ebbae2739975ae8c" -dependencies = [ - "alloy-consensus", - "alloy-contract", - "alloy-core", - "alloy-eips", - "alloy-genesis", - "alloy-network", - "alloy-provider", - "alloy-pubsub", - "alloy-rpc-client", - "alloy-rpc-types", - "alloy-serde", - "alloy-signer", - "alloy-signer-local", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", -] - -[[package]] -name = "alloy-chains" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1752d7d62e2665da650a36d84abbf239f812534475d51f072a49a533513b7cdd" -dependencies = [ - "num_enum", - "strum", -] - -[[package]] -name = "alloy-consensus" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58047cc851e58c26224521d1ecda466e3d746ebca0274cd5427aa660a88c353" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "serde", -] - -[[package]] -name = "alloy-contract" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa5d42d9f87896536234b0fac1a84ad9d9dc7a4b27839cac35d0899e64ddf083" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-network", - "alloy-primitives", - "alloy-provider", - "alloy-pubsub", - "alloy-rpc-types-eth", - "alloy-sol-types", - "alloy-transport", - "futures", - "futures-util", - "thiserror", -] - -[[package]] -name = "alloy-core" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "529fc6310dc1126c8de51c376cbc59c79c7f662bd742be7dc67055d5421a81b4" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-types", -] - -[[package]] -name = "alloy-dyn-abi" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413902aa18a97569e60f679c23f46a18db1656d87ab4d4e49d0e1e52042f66df" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-type-parser", - "alloy-sol-types", - "const-hex", - "itoa", - "serde", - "serde_json", - "winnow 0.6.15", -] - -[[package]] -name = "alloy-eips" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a3e14fa0d152d00bd8daf605eb74ad397efb0f54bd7155585823dddb4401e" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "derive_more", - "k256 0.13.3", - "once_cell", - "serde", - "sha2 0.10.8", -] - -[[package]] -name = "alloy-genesis" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cb76c8a3913f2466c5488f3a915e3a15d15596bdc935558c1a9be75e9ec508" -dependencies = [ - "alloy-primitives", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-json-abi" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc05b04ac331a9f07e3a4036ef7926e49a8bf84a99a1ccfc7e2ab55a5fcbb372" -dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-rpc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e76a9feec2352c78545d1a37415699817bae8dc41654bd1bfe57d6cdd5433bd" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3223d71dc78f464b2743418d0be8b5c894313e272105a6206ad5e867d67b3ce2" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "auto_impl", - "futures-utils-wasm", - "thiserror", -] - -[[package]] -name = "alloy-primitives" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "hex-literal", - "itoa", - "k256 0.13.3", - "keccak-asm", - "proptest", - "rand 0.8.5", - "ruint", - "serde", - "tiny-keccak", -] - -[[package]] -name = "alloy-provider" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29da7457d853cb8199ec04b227d5d2ef598be3e59fc2bbad70c8be213292f32" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network", - "alloy-primitives", - "alloy-pubsub", - "alloy-rpc-client", - "alloy-rpc-types-eth", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru", - "pin-project", - "reqwest 0.12.5", - "serde", - "serde_json", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "alloy-pubsub" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64acfec654ade392cecfa9bba0408eb2a337d55f1b857925da79970cb70f3d6" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "bimap", - "futures", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a43b18702501396fa9bcdeecd533bc85fac75150d308fc0f6800a01e6234a003" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83524c1f6162fcb5b0decf775498a125066c86dda6066ed609531b0e912f85a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a9e609524fa31c2c70eb24c0da60796809193ad4787a6dfe6d0db0d3ac112d" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-pubsub", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", - "futures", - "pin-project", - "reqwest 0.12.5", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-rpc-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e5d76f1e8b22f48b7b8f985782b68e7eb3938780e50e8b646a53e41a598cdf5" -dependencies = [ - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-rpc-types-engine" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73445fbc5c02258e3d0d977835c92366a4d91545fd456c3fc8601c61810bc9f6" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-eth", - "alloy-serde", - "jsonwebtoken", - "rand 0.8.5", - "serde", - "thiserror", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "605fa8462732bb8fd0645a9941e12961e079d45ae6a44634c826f8229c187bdf" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "itertools 0.13.0", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "alloy-serde" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c5b9057acc02aee1b8aac2b5a0729cb0f73d080082c111313e5d1f92a96630" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37f10592696f4ab8b687d5a8ab55e998a14ea0ca5f8eb20ad74a96ad671bb54a" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "elliptic-curve 0.13.8", - "k256 0.13.3", - "thiserror", -] - -[[package]] -name = "alloy-signer-local" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b537f3e55f30753578f4623d5f66ddad8fa582af3fa6b15bad23dd1b9775228" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "async-trait", - "k256 0.13.3", - "rand 0.8.5", - "thiserror", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" -dependencies = [ - "alloy-json-abi", - "alloy-sol-macro-input", - "const-hex", - "heck", - "indexmap 2.2.6", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.72", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" -dependencies = [ - "alloy-json-abi", - "const-hex", - "dunce", - "heck", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.72", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-type-parser" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbcba3ca07cf7975f15d871b721fb18031eec8bce51103907f6dcce00b255d98" -dependencies = [ - "serde", - "winnow 0.6.15", -] - -[[package]] -name = "alloy-sol-types" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-macro", - "const-hex", - "serde", -] - -[[package]] -name = "alloy-transport" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b44b0f6f4a2593b258fa7b6cae8968e6a4c404d9ef4f5bc74401f2d04fa23fa" -dependencies = [ - "alloy-json-rpc", - "base64 0.22.1", - "futures-util", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror", - "tokio", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport-http" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d8f1eefa8cb9e7550740ee330feba4fed303a77ad3085707546f9152a88c380" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "reqwest 0.12.5", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport-ipc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31007c56dc65bd81392112dda4a14c20ac7e30bb4cb2e9176192e8d9fab1983f" -dependencies = [ - "alloy-json-rpc", - "alloy-pubsub", - "alloy-transport", - "bytes", - "futures", - "interprocess", - "pin-project", - "serde_json", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "alloy-transport-ws" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15ccc1c8f8ae415e93ec0e7851bd4cdf4afdd48793d13a91b860317da1f36104" -dependencies = [ - "alloy-pubsub", - "alloy-transport", - "futures", - "http 1.1.0", - "rustls", - "serde_json", - "tokio", - "tokio-tungstenite", - "tracing", - "ws_stream_wasm", -] - -[[package]] -name = "anstream" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" - -[[package]] -name = "anstyle-parse" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "anyhow" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" - -[[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" -dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.0", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-std" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "arrayref" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-sse" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6fa871e4334a622afd6bb2f611635e8083a6f5e2936c0f90f37c7ef9856298" -dependencies = [ - "async-channel", - "futures-lite", - "http-types", - "log", - "memchr", - "pin-project-lite", -] - -[[package]] -name = "async-stream" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "async-trait" -version = "0.1.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version 0.4.0", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "auto_impl" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "backtrace" -version = "0.3.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "beacon-api-client" -version = "0.1.0" -source = "git+https://github.com/ralexstokes/ethereum-consensus?rev=cf3c404#cf3c404043230559660810bc0c9d6d5a8498d819" -dependencies = [ - "clap", - "ethereum-consensus", - "http 0.2.12", - "itertools 0.10.5", - "mev-share-sse", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "bimap" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" - -[[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.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[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.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blst" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "bolt-rpc-client" -version = "0.1.0" -dependencies = [ - "alloy", - "beacon-api-client", - "clap", - "dotenvy", - "eyre", - "rand 0.8.5", - "reqwest 0.12.5", - "serde", - "serde_json", - "tokio", - "tracing", - "tracing-subscriber", - "url", -] - -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[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.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf100c4cea8f207e883ff91ca886d621d8a166cb04971dfaa9bb8fd99ed95df" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "serde", -] - -[[package]] -name = "cc" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "num-traits", -] - -[[package]] -name = "clap" -version = "4.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6b81fb3c84f5563d509c59b5a48d935f689e993afa90fe39047f05adef9142" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca6706fd5224857d9ac5eb9355f6683563cc0541c7cd9d014043b57cbec78ac" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "clap_lex" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" - -[[package]] -name = "colorchoice" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-hex" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" -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 = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "core2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" -dependencies = [ - "memchr", -] - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[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.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "0.99.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.4.0", - "syn 2.0.72", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "doctest-file" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der 0.7.9", - "digest 0.10.7", - "elliptic-curve 0.13.8", - "rfc6979 0.4.0", - "signature 2.2.0", - "spki 0.7.3", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.7", - "ff 0.12.1", - "generic-array", - "group 0.12.1", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle", - "zeroize", -] - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.5", - "digest 0.10.7", - "ff 0.13.0", - "generic-array", - "group 0.13.0", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sec1 0.7.3", - "subtle", - "zeroize", -] - -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enr" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fa0a0be8915790626d5759eb51fe47435a8eac92c2f212bd2da9aa7f30ea56" -dependencies = [ - "base64 0.13.1", - "bs58", - "bytes", - "hex", - "k256 0.11.6", - "log", - "rand 0.8.5", - "rlp", - "serde", - "sha3", - "zeroize", -] - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-consensus" -version = "0.1.1" -source = "git+https://github.com/ralexstokes/ethereum-consensus?rev=cf3c404#cf3c404043230559660810bc0c9d6d5a8498d819" -dependencies = [ - "blst", - "bs58", - "c-kzg", - "enr", - "hex", - "integer-sqrt", - "multiaddr", - "multihash", - "rand 0.8.5", - "serde", - "serde_json", - "serde_yaml", - "sha2 0.10.8", - "ssz_rs", - "thiserror", - "tokio", - "tokio-stream", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec", - "bytes", - "chrono", - "const-hex", - "elliptic-curve 0.13.8", - "ethabi", - "generic-array", - "k256 0.13.3", - "num_enum", - "open-fastrlp", - "rand 0.8.5", - "rlp", - "serde", - "serde_json", - "strum", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[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 = "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 = "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-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[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.72", -] - -[[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-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 = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "gimli" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff 0.13.0", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.2.6", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.1.0", - "indexmap 2.2.6", - "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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.1.0", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "pin-project-lite", -] - -[[package]] -name = "http-types" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad" -dependencies = [ - "anyhow", - "async-channel", - "base64 0.13.1", - "futures-lite", - "infer", - "pin-project-lite", - "rand 0.7.3", - "serde", - "serde_json", - "serde_qs", - "serde_urlencoded", - "url", -] - -[[package]] -name = "httparse" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.5", - "http 1.1.0", - "http-body 1.0.1", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" -dependencies = [ - "futures-util", - "http 1.1.0", - "hyper 1.4.1", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.30", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.4.1", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[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", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown 0.14.5", -] - -[[package]] -name = "infer" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac" - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "integer-sqrt" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" -dependencies = [ - "num-traits", -] - -[[package]] -name = "interprocess" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f4e4a06d42fab3e85ab1b419ad32b09eab58b901d40c57935ff92db3287a13" -dependencies = [ - "doctest-file", - "futures-core", - "libc", - "recvmsg", - "tokio", - "widestring", - "windows-sys 0.52.0", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonwebtoken" -version = "9.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" -dependencies = [ - "base64 0.21.7", - "js-sys", - "pem", - "ring", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if", - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.8", -] - -[[package]] -name = "k256" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" -dependencies = [ - "cfg-if", - "ecdsa 0.16.9", - "elliptic-curve 0.13.8", - "once_cell", - "sha2 0.10.8", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.155" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "lru" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "mev-share-sse" -version = "0.1.6" -source = "git+https://github.com/paradigmxyz/mev-share-rs?rev=9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8#9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8" -dependencies = [ - "async-sse", - "bytes", - "ethers-core", - "futures-util", - "http-types", - "pin-project-lite", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", -] - -[[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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - -[[package]] -name = "multiaddr" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c580bfdd8803cce319b047d239559a22f809094aaea4ac13902a1fdcfcd4261" -dependencies = [ - "arrayref", - "bs58", - "byteorder", - "data-encoding", - "multihash", - "percent-encoding", - "serde", - "static_assertions", - "unsigned-varint", - "url", -] - -[[package]] -name = "multihash" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc" -dependencies = [ - "core2", - "digest 0.10.7", - "multihash-derive", - "sha2 0.10.8", - "unsigned-varint", -] - -[[package]] -name = "multihash-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" -dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", -] - -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "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.72", -] - -[[package]] -name = "object" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[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.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" -dependencies = [ - "bitflags 2.6.0", - "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.72", -] - -[[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.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parity-scale-codec" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" -dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pem" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" -dependencies = [ - "base64 0.22.1", - "serde", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pest" -version = "2.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version 0.4.0", -] - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[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.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der 0.7.9", - "spki 0.7.3", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[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 = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" -dependencies = [ - "thiserror", - "toml", -] - -[[package]] -name = "proc-macro-crate" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.6.0", - "lazy_static", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -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.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[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 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -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 = "recvmsg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" - -[[package]] -name = "redox_syscall" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "regex" -version = "1.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" - -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "winreg 0.50.0", -] - -[[package]] -name = "reqwest" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.4.5", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.4.1", - "hyper-rustls", - "hyper-tls 0.6.0", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 2.1.2", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.1", - "system-configuration", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg 0.52.0", -] - -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac", - "zeroize", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.15", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[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 = "ruint" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp", - "num-bigint", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand 0.8.5", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver 1.0.23", -] - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.23.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.102.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "scale-info" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" -dependencies = [ - "cfg-if", - "derive_more", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" -dependencies = [ - "proc-macro-crate 3.1.0", - "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 = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array", - "pkcs8 0.9.0", - "subtle", - "zeroize", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct 0.2.0", - "der 0.7.9", - "generic-array", - "pkcs8 0.10.2", - "subtle", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - -[[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.204" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.204" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "serde_json" -version = "1.0.120" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_qs" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6" -dependencies = [ - "percent-encoding", - "serde", - "thiserror", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" -dependencies = [ - "indexmap 1.9.3", - "ryu", - "serde", - "yaml-rust", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "sha3-asm" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" -dependencies = [ - "cc", - "cfg-if", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 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", - "num-traits", - "thiserror", - "time", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der 0.7.9", -] - -[[package]] -name = "ssz_rs" -version = "0.9.0" -source = "git+https://github.com/ralexstokes/ssz-rs?rev=84ef2b71aa004f6767420badb42c902ad56b8b72#84ef2b71aa004f6767420badb42c902ad56b8b72" -dependencies = [ - "alloy-primitives", - "bitvec", - "serde", - "sha2 0.9.9", - "ssz_rs_derive", -] - -[[package]] -name = "ssz_rs_derive" -version = "0.9.0" -source = "git+https://github.com/ralexstokes/ssz-rs?rev=84ef2b71aa004f6767420badb42c902ad56b8b72#84ef2b71aa004f6767420badb42c902ad56b8b72" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.72", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[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.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" - -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", -] - -[[package]] -name = "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.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand 2.1.0", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "thiserror" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -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.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -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.38.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" -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.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[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.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" -dependencies = [ - "futures-util", - "log", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" - -[[package]] -name = "toml_edit" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" -dependencies = [ - "indexmap 2.2.6", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "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.72", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "nu-ansi-term", - "sharded-slab", - "smallvec", - "thread_local", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 1.1.0", - "httparse", - "log", - "rand 0.8.5", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "unsigned-varint" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - -[[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.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[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.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.72", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-streams" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "widestring" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "557404e450152cd6795bb558bca69e43c585055f4606e3bcae5894fc6dac9ba0" -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 = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -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 0.4.0", - "send_wrapper", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] diff --git a/bolt-client/Cargo.toml b/bolt-client/Cargo.toml deleted file mode 100644 index 0b671c321..000000000 --- a/bolt-client/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "bolt-rpc-client" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -tokio = { version = "1.37.0", features = ["full"] } - -alloy = { version = "0.2.0", features = ["full"] } -beacon-api-client = { git = "https://github.com/ralexstokes/ethereum-consensus", rev = "cf3c404" } - -clap = { version = "4.5.4", features = ["derive", "env"] } -serde = { version = "1.0.197", features = ["derive"] } -serde_json = "1.0.115" -eyre = "0.6.12" -rand = "0.8.5" -url = "2.5.2" -dotenvy = "0.15.7" -reqwest = "0.12.3" - -tracing = "0.1.40" -tracing-subscriber = "0.3.18" diff --git a/bolt-client/README.md b/bolt-client/README.md deleted file mode 100644 index 76d7e7b54..000000000 --- a/bolt-client/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Bolt CLI client - -This is a CLI tool to interact with Bolt by sending preconfirmation requests. - -## Requirements - -- [Rust toolchain & Cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html) installed -- A wallet with some funds to send transactions - -## How to use - -Bolt Client offers different ways to send commitment requests. Here's how to use them: - -### Use the default Bolt RPC - -For regular usage, you can use the default Bolt RPC server to automatically fetch the -lookahead data from the beacon chain and send the transaction to the next Bolt sidecar in line. - -To do this, prepare the environment variables (either in a `.env` file, or as CLI arguments): - -- `BOLT_PRIVATE_KEY` or `--private-key`: the private key of the account to send transactions from -- `--blob`: bool flag to send a blob-carrying transaction (default: false) -- `--count`: the number of transactions to send in a single request (default: 1) - -Run the CLI tool: - -```shell - cargo run -``` - -### Use your own beacon node and registry contract - -If you don't want to use the default RPC server, you can send transactions manually. -To do this, you need to provide the following environment variables (either in a `.env` file, or as CLI arguments): - -- `--use-registry`: bool flag to fetch data from a local node instead of the RPC_URL (default: false) -- `BOLT_RPC_URL` or `--rpc-url`: the URL of an execution client (e.g. Geth)'s RPC server (default: Chainbound's RPC) -- `BOLT_NONCE_OFFSET` or `--nonce-offset`: the offset to add to the account's nonce (default: 0) -- `BOLT_REGISTRY_ADDRESS` or `--registry-address`: the address of the bolt-registry smart contract -- `BOLT_BEACON_CLIENT_URL` or `--beacon-client-url`: the URL of the beacon client's HTTP server - -Run the CLI tool with the desired command and arguments, if any. - -```shell - cargo run -- [options] -``` diff --git a/bolt-client/rust-toolchain.toml b/bolt-client/rust-toolchain.toml deleted file mode 100644 index bbf217f21..000000000 --- a/bolt-client/rust-toolchain.toml +++ /dev/null @@ -1,3 +0,0 @@ -[toolchain] -channel = "1.81.0" -profile = "default" diff --git a/bolt-client/rustfmt.toml b/bolt-client/rustfmt.toml deleted file mode 100644 index 68c3c9303..000000000 --- a/bolt-client/rustfmt.toml +++ /dev/null @@ -1,11 +0,0 @@ -reorder_imports = true -imports_granularity = "Crate" -use_small_heuristics = "Max" -comment_width = 100 -wrap_comments = true -binop_separator = "Back" -trailing_comma = "Vertical" -trailing_semicolon = false -use_field_init_shorthand = true -format_code_in_doc_comments = true -doc_comment_code_block_width = 100 diff --git a/bolt-client/src/main.rs b/bolt-client/src/main.rs deleted file mode 100644 index 53b41af63..000000000 --- a/bolt-client/src/main.rs +++ /dev/null @@ -1,167 +0,0 @@ -use alloy::{ - eips::eip2718::Encodable2718, - hex, - network::{EthereumWallet, TransactionBuilder}, - primitives::{address, Address, B256}, - providers::{Provider, ProviderBuilder}, - signers::local::PrivateKeySigner, -}; -use beacon_api_client::mainnet::Client as BeaconApiClient; -use clap::Parser; -use eyre::{bail, Result}; -use serde_json::{json, Value}; -use tracing::info; -use url::Url; - -mod registry; -use registry::BoltRegistry; - -mod utils; -use utils::*; - -// Default Bolt RPC URL (on Helder) -pub const DEFAULT_RPC_URL: &str = "https://bolt.chainbound.io/rpc"; - -// Default Bolt-Registry address (on Helder) -pub const DEFAULT_REGISTRY: Address = address!("dF11D829eeC4C192774F3Ec171D822f6Cb4C14d9"); - -#[derive(Parser)] -struct Opts { - /// Bolt RPC URL to send requests to - #[clap(long, default_value = DEFAULT_RPC_URL, env = "BOLT_RPC_URL")] - rpc_url: Url, - /// Private key to sign transactions with - #[clap(short = 'k', long, env = "BOLT_PRIVATE_KEY")] - private_key: String, - /// Optional nonce offset to use for the transaction - #[clap(long, default_value_t = 0, env = "BOLT_NONCE_OFFSET")] - nonce_offset: u64, - /// Flag for generating a blob tx instead of a regular tx - #[clap(long, default_value_t = false)] - blob: bool, - /// Number of transactions to send in a sequence - #[clap(long, default_value_t = 1)] - count: u64, - /// Flag for sending all "count" transactions in a single bundle - #[clap(long, default_value_t = false)] - bundle: bool, - - /// Flag for using the registry to fetch the lookahead - #[clap(long, default_value_t = false, requires_ifs([("true", "registry_address"), ("true", "beacon_client_url")]))] - use_registry: bool, - /// URL of the beacon client to use for fetching the lookahead - /// (only used with the "use-registry" flag) - #[clap(short = 'b', long, env = "BOLT_BEACON_CLIENT_URL")] - beacon_client_url: Option, - /// Address of the registry contract to read bolt sidecars from - /// (only used with the "use-registry" flag) - #[clap(long, env = "BOLT_REGISTRY_ADDRESS", default_value_t = DEFAULT_REGISTRY)] - registry_address: Address, -} - -#[tokio::main] -async fn main() -> Result<()> { - tracing_subscriber::fmt::init(); - info!("starting bolt-client"); - - let _ = dotenvy::dotenv(); - let mut opts = Opts::parse(); - - let wallet: PrivateKeySigner = opts.private_key.parse().expect("invalid private key"); - let transaction_signer: EthereumWallet = wallet.clone().into(); - let provider = ProviderBuilder::new().on_http(opts.rpc_url.clone()); - let sender = wallet.address(); - - let (target_sidecar_url, target_slot) = if opts.use_registry { - // Fetch the next preconfer slot from the registry and use it - let beacon_api_client = BeaconApiClient::new(opts.beacon_client_url.unwrap()); - let registry = BoltRegistry::new(opts.rpc_url, opts.registry_address); - let curr_slot = get_current_slot(&beacon_api_client).await?; - let duties = get_proposer_duties(&beacon_api_client, curr_slot, curr_slot / 32).await?; - match registry.next_preconfer_from_registry(duties).await { - Ok(Some((endpoint, slot))) => (Url::parse(&endpoint)?, slot), - Ok(None) => bail!("no next preconfer slot found, try again later"), - Err(e) => bail!("error fetching next preconfer slot from registry: {:?}", e), - } - } else { - let url = opts.rpc_url.join("proposers/lookahead?activeOnly=true&futureOnly=true")?; - let lookahead_response = reqwest::get(url).await?.json::().await?; - if lookahead_response.as_array().unwrap_or(&vec![]).is_empty() { - bail!("no bolt proposer found in lookahead, try again later 🥲"); - } - let next_preconfer_slot = lookahead_response[0].get("slot").unwrap().as_u64().unwrap(); - (opts.rpc_url, next_preconfer_slot) - }; - - let mut txs_rlp = Vec::with_capacity(opts.count as usize); - let mut tx_hashes = Vec::with_capacity(opts.count as usize); - for _ in 0..opts.count { - let mut tx = if opts.blob { generate_random_blob_tx() } else { generate_random_tx() }; - tx.set_from(sender); - tx.set_chain_id(provider.get_chain_id().await?); - tx.set_nonce(provider.get_transaction_count(sender).await? + opts.nonce_offset); - - // Set the nonce offset for the next transaction - opts.nonce_offset += 1; - - let tx_signed = tx.build(&transaction_signer).await?; - let tx_hash = tx_signed.tx_hash(); - let tx_rlp = hex::encode(tx_signed.encoded_2718()); - - if opts.bundle { - // store transactions in a bundle to send them all at once - txs_rlp.push(tx_rlp); - tx_hashes.push(*tx_hash); - } else { - // Send rpc requests singularly for each transaction - send_rpc_request( - vec![tx_rlp], - vec![*tx_hash], - target_slot, - target_sidecar_url.clone(), - &wallet, - ) - .await?; - } - } - - if opts.bundle { - send_rpc_request(txs_rlp, tx_hashes, target_slot, target_sidecar_url, &wallet).await?; - } - - Ok(()) -} - -async fn send_rpc_request( - txs_rlp: Vec, - tx_hashes: Vec, - target_slot: u64, - target_sidecar_url: Url, - wallet: &PrivateKeySigner, -) -> Result<()> { - let request = prepare_rpc_request( - "bolt_requestInclusion", - json!({ - "slot": target_slot, - "txs": txs_rlp, - }), - ); - - info!(?tx_hashes, target_slot, %target_sidecar_url); - let signature = sign_request(tx_hashes, target_slot, wallet).await?; - - let response = reqwest::Client::new() - .post(target_sidecar_url) - .header("content-type", "application/json") - .header("x-bolt-signature", signature) - .body(serde_json::to_string(&request)?) - .send() - .await?; - - let response = response.text().await?; - - // strip out long series of zeros in the response (to avoid spamming blob contents) - let response = response.replace(&"0".repeat(32), ".").replace(&".".repeat(4), ""); - info!("Response: {:?}", response); - Ok(()) -} diff --git a/bolt-client/src/registry.rs b/bolt-client/src/registry.rs deleted file mode 100644 index 79dd9fbd9..000000000 --- a/bolt-client/src/registry.rs +++ /dev/null @@ -1,241 +0,0 @@ -use std::str::FromStr; - -use alloy::{ - contract::{Error as ContractError, Result as ContractResult}, - primitives::{Address, Bytes}, - providers::{ProviderBuilder, RootProvider}, - sol, - sol_types::{Error as SolError, SolInterface}, - transports::{http::Http, TransportError}, -}; -use beacon_api_client::ProposerDuty; -use reqwest::Client; -use tracing::info; -use url::Url; -use BoltRegistryContract::{BoltRegistryContractErrors, BoltRegistryContractInstance, Registrant}; - -#[derive(Debug, Clone)] -pub struct BoltRegistry(BoltRegistryContractInstance, RootProvider>>); - -impl BoltRegistry { - pub fn new>(execution_client_url: U, registry_address: Address) -> Self { - let provider = ProviderBuilder::new().on_http(execution_client_url.into()); - let registry = BoltRegistryContract::new(registry_address, provider); - - Self(registry) - } - - /// Gets the sidecar RPC URL for a given validator index. - /// - /// Returns Ok(None) if the operator is not found in the registry. - #[allow(unused)] - pub async fn get_sidecar_rpc_url_for_validator( - &self, - validator_index: u64, - ) -> ContractResult> { - let registrant = self.get_registrant_for_validator(validator_index).await?; - Ok(registrant.map(|r| r.metadata.rpc)) - } - - /// Gets the operator for a given validator index. - /// - /// Returns Ok(None) if the operator is not found in the registry. - pub async fn get_registrant_for_validator( - &self, - validator_index: u64, - ) -> ContractResult> { - let returndata = self.0.getOperatorForValidator(validator_index).call().await; - - // TODO: clean this after https://github.com/alloy-rs/alloy/issues/787 is merged - let error = match returndata.map(|data| data._0) { - Ok(registrant) => return Ok(Some(registrant)), - Err(error) => match error { - ContractError::TransportError(TransportError::ErrorResp(err)) => { - let data = err.data.unwrap_or_default(); - let data = data.get().trim_matches('"'); - let data = Bytes::from_str(data).unwrap_or_default(); - - BoltRegistryContractErrors::abi_decode(&data, true)? - } - e => return Err(e), - }, - }; - - if matches!(error, BoltRegistryContractErrors::NotFound(_)) { - Ok(None) - } else { - Err(SolError::custom(format!( - "unexpected Solidity error selector: {:?}", - error.selector() - )) - .into()) - } - } - - /// Gets the next preconfirmation slot and proposer RPC URL from the registry contract - /// - /// Returns Ok(None) if no registered validators are found in the lookahead - pub async fn next_preconfer_from_registry( - &self, - proposer_duties: Vec, - ) -> ContractResult> { - let mut next_preconfer_slot = 0; - let mut proposer_rpc = String::new(); - - for duty in proposer_duties { - let res = self.get_registrant_for_validator(duty.validator_index as u64).await; - match res { - Ok(Some(token_raw)) => { - next_preconfer_slot = duty.slot; - proposer_rpc = token_raw.metadata.rpc; - info!( - "preconfirmation will be sent for slot {} to validator with index {} at url {}", - duty.slot, - duty.validator_index, - proposer_rpc, - ); - break; - } - Ok(None) => { - // Handle the case where the result is Ok but contains None. - // You might want to continue to the next iteration, log something, or handle it - // in another way. - info!("No registrant found for validator index {}", duty.validator_index); - continue; - } - Err(e) => { - return Err(e); - } - } - } - - if next_preconfer_slot == 0 { - return Ok(None); - }; - - Ok(Some((proposer_rpc, next_preconfer_slot))) - } -} - -sol! { - #[sol(rpc)] - interface BoltRegistryContract { - #[derive(Debug, Default)] - struct Registrant { - address operator; - uint64[] validatorIndexes; - uint256 enteredAt; - uint256 exitInitiatedAt; - uint256 balance; - Status status; - MetaData metadata; - } - - #[derive(Debug, Default)] - enum Status { - #[default] - INACTIVE, - ACTIVE, - FROZEN, - EXITING - } - - #[derive(Debug, Default)] - struct MetaData { - string rpc; - bytes extra; - } - - function getOperatorForValidator(uint64 _validatorIndex) external view returns (Registrant memory); - - error NotFound(); - error Unauthorized(); - } -} - -#[cfg(test)] -mod tests { - use std::str::FromStr; - - use alloy::{primitives::U256, sol_types::SolCall}; - use beacon_api_client::ProposerDuty; - use BoltRegistryContract::{MetaData, Status}; - - use super::*; - - #[test] - fn test_abigen() { - assert_eq!(BoltRegistryContract::getOperatorForValidatorCall::SELECTOR, [238, 124, 139, 77]) - } - - #[tokio::test] - async fn test_get_operators_helder() -> eyre::Result<()> { - let registry = BoltRegistry::new( - Url::parse("http://remotebeast:4485")?, - Address::from_str("0xdF11D829eeC4C192774F3Ec171D822f6Cb4C14d9")?, - ); - - let registrant = registry.get_registrant_for_validator(0).await; - assert!(matches!(registrant, Ok(None))); - - let registrant = match registry.get_registrant_for_validator(2150).await { - Ok(Some(registrant)) => registrant, - e => panic!("unexpected error reading from registry: {:?}", e), - }; - - let expected = Registrant { - operator: Address::from_str("0xad3cd1b81c80f4a495d6552ae6423508492a27f8")?, - validatorIndexes: (2145..2245).collect(), - enteredAt: U256::from(1720183620), - exitInitiatedAt: U256::from(0), - balance: U256::from(10000000000000000000u128), - status: Status::ACTIVE, - metadata: MetaData { - rpc: "http://135.181.191.125:8000".to_string(), - extra: Bytes::from_str("0x")?, - }, - }; - - assert_eq!(registrant.metadata.rpc, expected.metadata.rpc); - assert_eq!(registrant.metadata.extra, expected.metadata.extra); - assert_eq!(registrant.operator, expected.operator); - assert_eq!(registrant.validatorIndexes, expected.validatorIndexes); - assert_eq!(registrant.enteredAt, expected.enteredAt); - assert_eq!(registrant.exitInitiatedAt, expected.exitInitiatedAt); - assert_eq!(registrant.balance, expected.balance); - - Ok(()) - } - - #[tokio::test] - async fn test_next_preconfer_from_registry() -> eyre::Result<()> { - let registry = BoltRegistry::new( - Url::parse("http://remotebeast:4485")?, - Address::from_str("0xdF11D829eeC4C192774F3Ec171D822f6Cb4C14d9")?, - ); - - // Mock proposer duties - let proposer_duties = vec![ - ProposerDuty { public_key: Default::default(), validator_index: 2145, slot: 12345 }, - ProposerDuty { public_key: Default::default(), validator_index: 2150, slot: 12346 }, - ]; - - // Calling the next_preconfer_from_registry function - let result = registry.next_preconfer_from_registry(proposer_duties).await?; - - // Expected result - let expected_rpc = "http://135.181.191.125:8000".to_string(); - let expected_slot = 12345; - - // Asserting the result - match result { - Some((rpc, slot)) => { - assert_eq!(rpc, expected_rpc); - assert_eq!(slot, expected_slot); - } - None => panic!("Expected some value but got None"), - } - - Ok(()) - } -} diff --git a/bolt-client/src/utils.rs b/bolt-client/src/utils.rs deleted file mode 100644 index be55f618a..000000000 --- a/bolt-client/src/utils.rs +++ /dev/null @@ -1,148 +0,0 @@ -use std::str::FromStr; - -use alloy::{ - consensus::{BlobTransactionSidecar, SidecarBuilder, SimpleCoder}, - hex, - network::TransactionBuilder, - primitives::{keccak256, Address, B256, U256}, - rpc::types::TransactionRequest, - signers::{local::PrivateKeySigner, Signer}, -}; -use beacon_api_client::{mainnet::Client as BeaconApiClient, BlockId, ProposerDuty}; -use rand::{thread_rng, Rng}; -use serde_json::Value; - -pub const DEFAULT_GAS_PRICE: u128 = 2_000_000_000u128; // 2 gwei -pub const DEAD_ADDRESS: &str = "0xdeaDDeADDEaDdeaDdEAddEADDEAdDeadDEADDEaD"; - -/// Generates random ETH transfer to `DEAD_ADDRESS` with a random payload. -pub fn generate_random_tx() -> TransactionRequest { - TransactionRequest::default() - .with_to(Address::from_str(DEAD_ADDRESS).unwrap()) - .with_value(U256::from(thread_rng().gen_range(1..100))) - .with_gas_limit(1000000u128) - .with_gas_price(DEFAULT_GAS_PRICE) -} - -/// Generate random transaction with blob (eip4844) -pub fn generate_random_blob_tx() -> TransactionRequest { - let sidecar: SidecarBuilder = SidecarBuilder::from_slice(b"Blobs are fun!"); - let sidecar: BlobTransactionSidecar = sidecar.build().unwrap(); - - TransactionRequest::default() - .with_to(Address::from_str(DEAD_ADDRESS).unwrap()) - .with_value(U256::from(100)) - .with_max_fee_per_blob_gas(100u128) - .max_fee_per_gas(100u128) - .max_priority_fee_per_gas(50u128) - .with_gas_limit(1_000_000u128) - .with_blob_sidecar(sidecar) -} - -pub fn prepare_rpc_request(method: &str, params: Value) -> Value { - serde_json::json!({ - "id": "1", - "jsonrpc": "2.0", - "method": method, - "params": vec![params], - }) -} - -/// Returns the current slot from the beacon client -pub async fn get_current_slot(beacon_api_client: &BeaconApiClient) -> eyre::Result { - Ok(beacon_api_client.get_beacon_header(BlockId::Head).await?.header.message.slot) -} - -pub async fn get_proposer_duties( - beacon_api_client: &BeaconApiClient, - current_slot: u64, - current_epoch: u64, -) -> eyre::Result> { - Ok(beacon_api_client - .get_proposer_duties(current_epoch) - .await? - .1 - .into_iter() - .filter(|duty| duty.slot > current_slot) - .collect::>()) -} - -pub async fn sign_request( - tx_hashes: Vec, - target_slot: u64, - wallet: &PrivateKeySigner, -) -> eyre::Result { - let digest = { - let mut data = Vec::new(); - let hashes = tx_hashes.iter().map(|hash| hash.as_slice()).collect::>().concat(); - data.extend_from_slice(&hashes); - data.extend_from_slice(target_slot.to_le_bytes().as_slice()); - keccak256(data) - }; - - let signature = hex::encode(wallet.sign_hash(&digest).await?.as_bytes()); - - Ok(format!("{}:0x{}", wallet.address(), signature)) -} - -#[cfg(test)] -mod tests { - use std::str::FromStr; - - use alloy::{ - primitives::{keccak256, Signature, B256}, - signers::local::PrivateKeySigner, - }; - - use crate::sign_request; - - #[tokio::test] - async fn test_sign_request() -> eyre::Result<()> { - let wallet = PrivateKeySigner::random(); - let tx_hash = - B256::from_str("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")?; - let target_slot = 42; - - let signature = sign_request(vec![tx_hash], target_slot, &wallet).await?; - let parts: Vec<&str> = signature.split(':').collect(); - - assert_eq!(parts.len(), 2); - assert_eq!(parts[0], wallet.address().to_string()); - assert_eq!(parts[1].len(), 130); - Ok(()) - } - - #[tokio::test] - async fn test_verify_signature() -> eyre::Result<()> { - // Randomly generated private key - let private_key = "0xfa4c3c87627a58684fb519f7b01a31ef31e56f414e8aa56a15f574381a5a7a9c"; - let tx_hash = "0x6938dbd0649ce26af79b0cca677b493257bd87c17d25ff717feba33c8b3920b3"; - let expected_signature = "0x10386a2aF29854954645C9710A038AcF4B2F1752:0x8db9bbcc1db5257c80138bd1df0185305918dbc8a607f63458ea885a6ccce5177a73417d693953b9f5c017a927e9c8acbf24c05b09a55f1f3fa83db57931ed9e1c"; - let target_slot = 254464; - - let wallet = PrivateKeySigner::from_str(private_key)?; - let tx_hash = B256::from_str(tx_hash)?; - - let signature = sign_request(vec![tx_hash], target_slot, &wallet).await?; - - assert_eq!(signature, expected_signature); - - let expected_signer = expected_signature.split(':').next().unwrap(); - let expected_sig = expected_signature.split(':').last().unwrap(); - let sig = Signature::from_str(expected_sig)?; - - // recompute the prehash again - let digest = { - let mut data = Vec::new(); - data.extend_from_slice(tx_hash.as_slice()); - data.extend_from_slice(target_slot.to_le_bytes().as_slice()); - keccak256(data) - }; - - let recovered_address = sig.recover_address_from_prehash(&digest)?; - assert_eq!(recovered_address, wallet.address()); - assert_eq!(recovered_address.to_string(), expected_signer); - - Ok(()) - } -} From 33394862d6addc007056dca082d4af401f68a43f Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Thu, 24 Oct 2024 18:03:25 +0200 Subject: [PATCH 03/85] feat(cli): refactor --- bolt-cli/Cargo.lock | 252 ++++++++++++++++-- bolt-cli/Cargo.toml | 2 + bolt-cli/src/cli.rs | 93 ++++--- .../{delegation.rs => commands/delegate.rs} | 85 +++++- bolt-cli/src/commands/mod.rs | 11 + bolt-cli/src/{ => commands}/pubkeys.rs | 39 ++- bolt-cli/src/commands/send.rs | 1 + bolt-cli/src/{utils => common}/dirk.rs | 0 bolt-cli/src/{utils => common}/keystore.rs | 0 bolt-cli/src/{utils => common}/mod.rs | 0 bolt-cli/src/{utils => common}/signing.rs | 6 +- bolt-cli/src/main.rs | 109 +------- 12 files changed, 429 insertions(+), 169 deletions(-) rename bolt-cli/src/{delegation.rs => commands/delegate.rs} (79%) create mode 100644 bolt-cli/src/commands/mod.rs rename bolt-cli/src/{ => commands}/pubkeys.rs (54%) create mode 100644 bolt-cli/src/commands/send.rs rename bolt-cli/src/{utils => common}/dirk.rs (100%) rename bolt-cli/src/{utils => common}/keystore.rs (100%) rename bolt-cli/src/{utils => common}/mod.rs (100%) rename bolt-cli/src/{utils => common}/signing.rs (94%) diff --git a/bolt-cli/Cargo.lock b/bolt-cli/Cargo.lock index 6fd80d826..e1c9d6df7 100644 --- a/bolt-cli/Cargo.lock +++ b/bolt-cli/Cargo.lock @@ -455,7 +455,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -494,7 +494,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags", + "bitflags 2.6.0", "cexpr", "clang-sys", "itertools 0.10.5", @@ -526,6 +526,12 @@ 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.6.0" @@ -605,6 +611,8 @@ dependencies = [ "ethereum-consensus", "eyre", "hex", + "inquire", + "nu-ansi-term 0.50.1", "prost", "reqwest", "rustls", @@ -827,6 +835,31 @@ dependencies = [ "libc", ] +[[package]] +name = "crossterm" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" +dependencies = [ + "bitflags 1.3.2", + "crossterm_winapi", + "libc", + "mio 0.8.11", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + [[package]] name = "crunchy" version = "0.2.2" @@ -1001,6 +1034,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + [[package]] name = "ecdsa" version = "0.14.8" @@ -1389,6 +1428,24 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "fuzzy-matcher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +dependencies = [ + "thread_local", +] + +[[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" @@ -1740,6 +1797,24 @@ dependencies = [ "hashbrown 0.15.0", ] +[[package]] +name = "inquire" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fddf93031af70e75410a2511ec04d49e758ed2f26dad3404a934e0fb45cc12a" +dependencies = [ + "bitflags 2.6.0", + "crossterm", + "dyn-clone", + "fuzzy-matcher", + "fxhash", + "newline-converter", + "once_cell", + "tempfile", + "unicode-segmentation", + "unicode-width", +] + [[package]] name = "integer-sqrt" version = "0.1.5" @@ -1875,7 +1950,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -1945,6 +2020,18 @@ dependencies = [ "adler2", ] +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + [[package]] name = "mio" version = "1.0.2" @@ -2031,6 +2118,15 @@ dependencies = [ "tempfile", ] +[[package]] +name = "newline-converter" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b6b097ecb1cbfed438542d16e84fd7ad9b0c76c8a65b7f9039212a3d14dc7f" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "nom" version = "7.1.3" @@ -2051,6 +2147,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "nu-ansi-term" +version = "0.50.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -2146,7 +2251,7 @@ version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags", + "bitflags 2.6.0", "cfg-if", "foreign-types", "libc", @@ -2236,7 +2341,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2431,7 +2536,7 @@ checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ "bit-set", "bit-vec", - "bitflags", + "bitflags 2.6.0", "lazy_static", "num-traits", "rand", @@ -2562,7 +2667,7 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "bitflags", + "bitflags 2.6.0", ] [[package]] @@ -2776,7 +2881,7 @@ version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ - "bitflags", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -2920,7 +3025,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -3087,6 +3192,27 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +dependencies = [ + "libc", + "mio 0.8.11", + "signal-hook", +] + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -3268,7 +3394,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags", + "bitflags 2.6.0", "core-foundation", "system-configuration-sys", ] @@ -3374,7 +3500,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio", + "mio 1.0.2", "parking_lot", "pin-project-lite", "signal-hook-registry", @@ -3606,7 +3732,7 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ - "nu-ansi-term", + "nu-ansi-term 0.46.0", "sharded-slab", "smallvec", "thread_local", @@ -3682,6 +3808,18 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -3894,7 +4032,7 @@ checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ "windows-result", "windows-strings", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3903,7 +4041,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3913,7 +4051,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ "windows-result", - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", ] [[package]] @@ -3922,7 +4069,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3931,7 +4078,22 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -3940,28 +4102,46 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -3974,24 +4154,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" diff --git a/bolt-cli/Cargo.toml b/bolt-cli/Cargo.toml index 526ffeec9..5898e813c 100644 --- a/bolt-cli/Cargo.toml +++ b/bolt-cli/Cargo.toml @@ -10,7 +10,9 @@ tokio = { version = "1.41.0", features = ["full"] } # cli clap = { version = "4.5.4", features = ["derive", "env"] } serde = { version = "1.0.197", features = ["derive"] } +inquire = { version = "0.7", features = ["editor"] } serde_json = "1.0.115" +nu-ansi-term = "0.50" # grpc rustls = { version = "0.23.15", features = ["ring"] } diff --git a/bolt-cli/src/cli.rs b/bolt-cli/src/cli.rs index 1f387988c..8458acd20 100644 --- a/bolt-cli/src/cli.rs +++ b/bolt-cli/src/cli.rs @@ -1,11 +1,14 @@ -use clap::{Parser, Subcommand, ValueEnum}; +use clap::{ + builder::styling::{AnsiColor, Color, Style}, + Parser, Subcommand, ValueEnum, +}; use serde::Deserialize; -use crate::utils::keystore::DEFAULT_KEYSTORE_PASSWORD; +use crate::common::keystore::DEFAULT_KEYSTORE_PASSWORD; -/// A CLI tool to interact with Bolt Protocol ✨ +/// `bolt` is a CLI tool to interact with Bolt Protocol ✨ #[derive(Parser, Debug, Clone, Deserialize)] -#[command(author, version, about, long_about = None)] +#[command(author, version, styles = cli_styles(), about, arg_required_else_help(true))] pub struct Opts { /// The subcommand to run. #[clap(subcommand)] @@ -15,39 +18,47 @@ pub struct Opts { #[derive(Subcommand, Debug, Clone, Deserialize)] pub enum Commands { /// Generate BLS delegation or revocation messages. - Delegate { - /// The BLS public key to which the delegation message should be signed. - #[clap(long, env = "DELEGATEE_PUBKEY")] - delegatee_pubkey: String, - - /// The output file for the delegations. - #[clap(long, env = "OUTPUT_FILE_PATH", default_value = "delegations.json")] - out: String, - - /// The chain for which the delegation message is intended. - #[clap(long, env = "CHAIN", default_value = "mainnet")] - chain: Chain, - - /// The action to perform. The tool can be used to generate - /// delegation or revocation messages (default: delegate). - #[clap(long, env = "ACTION", default_value = "delegate")] - action: Action, - - /// The source of the private key. - #[clap(subcommand)] - source: KeySource, - }, + Delegate(DelegateCommand), /// Output a list of pubkeys in JSON format. - Pubkeys { - /// The output file for the pubkeys. - #[clap(long, env = "OUTPUT_FILE_PATH", default_value = "pubkeys.json")] - out: String, - - /// The source of the private keys from which to extract the pubkeys. - #[clap(subcommand)] - source: KeySource, - }, + Pubkeys(PubkeysCommand), +} + +/// Command for generating BLS delegation or revocation messages. +#[derive(Debug, Clone, Deserialize, Parser)] +pub struct DelegateCommand { + /// The BLS public key to which the delegation message should be signed. + #[clap(long, env = "DELEGATEE_PUBKEY")] + pub delegatee_pubkey: String, + + /// The output file for the delegations. + #[clap(long, env = "OUTPUT_FILE_PATH", default_value = "delegations.json")] + pub out: String, + + /// The chain for which the delegation message is intended. + #[clap(long, env = "CHAIN", default_value = "mainnet")] + pub chain: Chain, + + /// The action to perform. The tool can be used to generate + /// delegation or revocation messages (default: delegate). + #[clap(long, env = "ACTION", default_value = "delegate")] + pub action: Action, + + /// The source of the private key. + #[clap(subcommand)] + pub source: KeySource, +} + +/// Command for outputting a list of pubkeys in JSON format. +#[derive(Debug, Clone, Deserialize, Parser)] +pub struct PubkeysCommand { + /// The output file for the pubkeys. + #[clap(long, env = "OUTPUT_FILE_PATH", default_value = "pubkeys.json")] + pub out: String, + + /// The source of the private keys from which to extract the pubkeys. + #[clap(subcommand)] + pub source: KeySource, } /// The action to perform. @@ -169,6 +180,18 @@ impl Chain { } } +/// Styles for the CLI application. +const fn cli_styles() -> clap::builder::Styles { + clap::builder::Styles::styled() + .usage(Style::new().bold().underline().fg_color(Some(Color::Ansi(AnsiColor::Yellow)))) + .header(Style::new().bold().underline().fg_color(Some(Color::Ansi(AnsiColor::Yellow)))) + .literal(Style::new().fg_color(Some(Color::Ansi(AnsiColor::Green)))) + .invalid(Style::new().bold().fg_color(Some(Color::Ansi(AnsiColor::Red)))) + .error(Style::new().bold().fg_color(Some(Color::Ansi(AnsiColor::Red)))) + .valid(Style::new().bold().underline().fg_color(Some(Color::Ansi(AnsiColor::Green)))) + .placeholder(Style::new().fg_color(Some(Color::Ansi(AnsiColor::White)))) +} + #[cfg(test)] mod tests { use super::Opts; diff --git a/bolt-cli/src/delegation.rs b/bolt-cli/src/commands/delegate.rs similarity index 79% rename from bolt-cli/src/delegation.rs rename to bolt-cli/src/commands/delegate.rs index 239c6871c..e821332ae 100644 --- a/bolt-cli/src/delegation.rs +++ b/bolt-cli/src/commands/delegate.rs @@ -9,16 +9,89 @@ use serde::Serialize; use tracing::{debug, warn}; use crate::{ - cli::{Action, Chain}, - utils::{ + cli::{Action, Chain, DelegateCommand, KeySource}, + common::{ dirk::Dirk, keystore::{keystore_paths, KeystoreError, KeystoreSecret}, + parse_bls_public_key, signing::{ compute_commit_boost_signing_root, compute_domain_from_mask, verify_commit_boost_root, }, + write_to_file, }, }; +impl DelegateCommand { + /// Run the `delegate` command. + pub async fn run(self) -> Result<()> { + match self.source { + KeySource::SecretKeys { secret_keys } => { + let delegatee_pubkey = parse_bls_public_key(&self.delegatee_pubkey)?; + let signed_messages = generate_from_local_keys( + &secret_keys, + delegatee_pubkey, + self.chain, + self.action, + )?; + debug!("Signed {} messages with local keys", signed_messages.len()); + + // Verify signatures + for message in &signed_messages { + verify_message_signature(message, self.chain)?; + } + + write_to_file(&self.out, &signed_messages)?; + println!("Signed delegation messages generated and saved to {}", self.out); + } + KeySource::LocalKeystore { opts } => { + let keystore_secret = KeystoreSecret::from_keystore_options(&opts)?; + let delegatee_pubkey = parse_bls_public_key(&self.delegatee_pubkey)?; + let signed_messages = generate_from_keystore( + &opts.path, + keystore_secret, + delegatee_pubkey, + self.chain, + self.action, + )?; + debug!("Signed {} messages with keystore", signed_messages.len()); + + // Verify signatures + for message in &signed_messages { + verify_message_signature(message, self.chain)?; + } + + write_to_file(&self.out, &signed_messages)?; + println!("Signed delegation messages generated and saved to {}", self.out); + } + KeySource::Dirk { opts } => { + let mut dirk = Dirk::connect(opts.url, opts.tls_credentials).await?; + + let delegatee_pubkey = parse_bls_public_key(&self.delegatee_pubkey)?; + let signed_messages = generate_from_dirk( + &mut dirk, + delegatee_pubkey, + opts.wallet_path, + opts.passphrases, + self.chain, + self.action, + ) + .await?; + debug!("Signed {} messages with Dirk", signed_messages.len()); + + // Verify signatures + for message in &signed_messages { + verify_message_signature(message, self.chain)?; + } + + write_to_file(&self.out, &signed_messages)?; + println!("Signed delegation messages generated and saved to {}", self.out); + } + } + + Ok(()) + } +} + /// Generate signed delegations/revocations using local BLS private keys /// /// - Use the provided private keys from either CLI or env variable @@ -28,7 +101,7 @@ use crate::{ pub fn generate_from_local_keys( secret_keys: &[String], delegatee_pubkey: BlsPublicKey, - chain: &Chain, + chain: Chain, action: Action, ) -> Result> { let mut signed_messages = Vec::with_capacity(secret_keys.len()); @@ -39,14 +112,14 @@ pub fn generate_from_local_keys( match action { Action::Delegate => { let message = DelegationMessage::new(sk.public_key(), delegatee_pubkey.clone()); - let signing_root = compute_commit_boost_signing_root(message.digest(), chain)?; + let signing_root = compute_commit_boost_signing_root(message.digest(), &chain)?; let signature = sk.sign(signing_root.0.as_ref()); let signed = SignedDelegation { message, signature }; signed_messages.push(SignedMessage::Delegation(signed)) } Action::Revoke => { let message = RevocationMessage::new(sk.public_key(), delegatee_pubkey.clone()); - let signing_root = compute_commit_boost_signing_root(message.digest(), chain)?; + let signing_root = compute_commit_boost_signing_root(message.digest(), &chain)?; let signature = sk.sign(signing_root.0.as_ref()); let signed = SignedRevocation { message, signature }; signed_messages.push(SignedMessage::Revocation(signed)); @@ -288,7 +361,7 @@ pub fn verify_message_signature(message: &SignedMessage, chain: Chain) -> Result mod tests { use crate::{ cli::{Action, Chain}, - utils::{keystore::KeystoreSecret, parse_bls_public_key}, + common::{keystore::KeystoreSecret, parse_bls_public_key}, }; use super::{generate_from_keystore, verify_message_signature}; diff --git a/bolt-cli/src/commands/mod.rs b/bolt-cli/src/commands/mod.rs new file mode 100644 index 000000000..e2467b1c9 --- /dev/null +++ b/bolt-cli/src/commands/mod.rs @@ -0,0 +1,11 @@ +/// Module for the bolt `delegate` command to create +/// signed delegation and revocation messages. +pub mod delegate; + +/// Module for the bolt `pubkeys` command to generate +/// lists of public keys from different key sources. +pub mod pubkeys; + +/// Module for the bolt `send` command to create and +/// broadcast preconfirmations in Bolt. +pub mod send; diff --git a/bolt-cli/src/pubkeys.rs b/bolt-cli/src/commands/pubkeys.rs similarity index 54% rename from bolt-cli/src/pubkeys.rs rename to bolt-cli/src/commands/pubkeys.rs index c06eef8de..ba10ff38a 100644 --- a/bolt-cli/src/pubkeys.rs +++ b/bolt-cli/src/commands/pubkeys.rs @@ -3,10 +3,47 @@ use eyre::Result; use lighthouse_eth2_keystore::Keystore; use crate::{ + cli::{KeySource, PubkeysCommand}, + common::{ + dirk::Dirk, + keystore::{keystore_paths, KeystoreError, KeystoreSecret}, + write_to_file, + }, pb::eth2_signer_api::Account, - utils::keystore::{keystore_paths, KeystoreError, KeystoreSecret}, }; +impl PubkeysCommand { + pub async fn run(self) -> Result<()> { + match self.source { + KeySource::SecretKeys { secret_keys } => { + let pubkeys = list_from_local_keys(&secret_keys)?; + + write_to_file(&self.out, &pubkeys)?; + println!("Pubkeys generated and saved to {}", self.out); + } + KeySource::LocalKeystore { opts } => { + let keystore_secret = KeystoreSecret::from_keystore_options(&opts)?; + let pubkeys = list_from_keystore(&opts.path, keystore_secret)?; + + write_to_file(&self.out, &pubkeys)?; + println!("Pubkeys generated and saved to {}", self.out); + } + KeySource::Dirk { opts } => { + // Note: we don't need to unlock wallets to list pubkeys + let mut dirk = Dirk::connect(opts.url, opts.tls_credentials).await?; + + let accounts = dirk.list_accounts(opts.wallet_path).await?; + let pubkeys = list_from_dirk_accounts(&accounts)?; + + write_to_file(&self.out, &pubkeys)?; + println!("Pubkeys generated and saved to {}", self.out); + } + } + + Ok(()) + } +} + /// Derive public keys from the provided secret keys. pub fn list_from_local_keys(secret_keys: &[String]) -> Result> { let mut pubkeys = Vec::with_capacity(secret_keys.len()); diff --git a/bolt-cli/src/commands/send.rs b/bolt-cli/src/commands/send.rs new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/bolt-cli/src/commands/send.rs @@ -0,0 +1 @@ + diff --git a/bolt-cli/src/utils/dirk.rs b/bolt-cli/src/common/dirk.rs similarity index 100% rename from bolt-cli/src/utils/dirk.rs rename to bolt-cli/src/common/dirk.rs diff --git a/bolt-cli/src/utils/keystore.rs b/bolt-cli/src/common/keystore.rs similarity index 100% rename from bolt-cli/src/utils/keystore.rs rename to bolt-cli/src/common/keystore.rs diff --git a/bolt-cli/src/utils/mod.rs b/bolt-cli/src/common/mod.rs similarity index 100% rename from bolt-cli/src/utils/mod.rs rename to bolt-cli/src/common/mod.rs diff --git a/bolt-cli/src/utils/signing.rs b/bolt-cli/src/common/signing.rs similarity index 94% rename from bolt-cli/src/utils/signing.rs rename to bolt-cli/src/common/signing.rs index daee353e1..07d3a6590 100644 --- a/bolt-cli/src/utils/signing.rs +++ b/bolt-cli/src/common/signing.rs @@ -4,7 +4,7 @@ use ethereum_consensus::{ crypto::PublicKey as BlsPublicKey, deneb::{compute_fork_data_root, compute_signing_root, Root}, }; -use eyre::Result; +use eyre::{eyre, Result}; use crate::cli::Chain; @@ -19,7 +19,7 @@ pub fn compute_commit_boost_signing_root(message: [u8; 32], chain: &Chain) -> Re compute_signing_root(&message, compute_domain_from_mask(chain.fork_version())) // Ethereum-consensus uses a different version of alloy so we need to do this cast .map(|r| B256::from_slice(r.to_vec().as_slice())) - .map_err(|e| eyre::eyre!("Failed to compute signing root: {}", e)) + .map_err(|e| eyre!("Failed to compute signing root: {}", e)) } /// Compute the commit boost domain from the fork version @@ -62,6 +62,6 @@ pub fn verify_root( if res == BLST_ERROR::BLST_SUCCESS { Ok(()) } else { - Err(eyre::eyre!("bls verification failed")) + Err(eyre!("bls verification failed")) } } diff --git a/bolt-cli/src/main.rs b/bolt-cli/src/main.rs index 6bdfecfc7..da5e9076f 100644 --- a/bolt-cli/src/main.rs +++ b/bolt-cli/src/main.rs @@ -1,20 +1,15 @@ use clap::Parser; use eyre::Result; -/// CLI commands and options. +/// CLI command definitions and options. mod cli; -use cli::{Commands, KeySource, Opts}; +use cli::{Commands, Opts}; -/// Module for generating delegation/revocation messages for BLS keys. -mod delegation; +/// CLI command implementations. +mod commands; -/// Module for listing BLS pubkeys from various sources. -mod pubkeys; - -/// Utility functions and helpers for the CLI. -mod utils; -use tracing::debug; -use utils::{dirk::Dirk, keystore::KeystoreSecret, parse_bls_public_key, write_to_file}; +/// Shared utility functions and helpers for the CLI. +mod common; /// Protocol Buffers definitions generated by `prost`. mod pb; @@ -23,99 +18,13 @@ mod pb; async fn main() -> Result<()> { let _ = dotenvy::dotenv(); let _ = tracing_subscriber::fmt::try_init(); + let _ = rustls::crypto::ring::default_provider().install_default(); let cli = Opts::parse(); - // Init the default rustls provider for Dirk - let _ = rustls::crypto::ring::default_provider().install_default(); - match cli.command { - Commands::Delegate { delegatee_pubkey, out, chain, source, action } => match source { - KeySource::SecretKeys { secret_keys } => { - let delegatee_pubkey = parse_bls_public_key(&delegatee_pubkey)?; - let signed_messages = delegation::generate_from_local_keys( - &secret_keys, - delegatee_pubkey, - &chain, - action, - )?; - - // Verify signatures - for message in &signed_messages { - delegation::verify_message_signature(message, chain)?; - } - - write_to_file(&out, &signed_messages)?; - println!("Signed delegation messages generated and saved to {}", out); - } - KeySource::LocalKeystore { opts } => { - let keystore_secret = KeystoreSecret::from_keystore_options(&opts)?; - let delegatee_pubkey = parse_bls_public_key(&delegatee_pubkey)?; - let signed_messages = delegation::generate_from_keystore( - &opts.path, - keystore_secret, - delegatee_pubkey, - chain, - action, - )?; - - // Verify signatures - for message in &signed_messages { - delegation::verify_message_signature(message, chain)?; - } - - write_to_file(&out, &signed_messages)?; - println!("Signed delegation messages generated and saved to {}", out); - } - KeySource::Dirk { opts } => { - let mut dirk = Dirk::connect(opts.url, opts.tls_credentials).await?; - let delegatee_pubkey = parse_bls_public_key(&delegatee_pubkey)?; - - let signed_messages = delegation::generate_from_dirk( - &mut dirk, - delegatee_pubkey, - opts.wallet_path, - opts.passphrases, - chain, - action, - ) - .await?; - debug!("Signed {} messages with Dirk", signed_messages.len()); - - // Verify signatures - for message in &signed_messages { - delegation::verify_message_signature(message, chain)?; - } - - write_to_file(&out, &signed_messages)?; - println!("Signed delegation messages generated and saved to {}", out); - } - }, - - Commands::Pubkeys { source, out } => match source { - KeySource::SecretKeys { secret_keys } => { - let pubkeys = pubkeys::list_from_local_keys(&secret_keys)?; - - write_to_file(&out, &pubkeys)?; - println!("Pubkeys generated and saved to {}", out); - } - KeySource::LocalKeystore { opts } => { - let keystore_secret = KeystoreSecret::from_keystore_options(&opts)?; - let pubkeys = pubkeys::list_from_keystore(&opts.path, keystore_secret)?; - - write_to_file(&out, &pubkeys)?; - println!("Pubkeys generated and saved to {}", out); - } - KeySource::Dirk { opts } => { - // Note: we don't need to unlock wallets to list pubkeys - let mut dirk = Dirk::connect(opts.url, opts.tls_credentials).await?; - let accounts = dirk.list_accounts(opts.wallet_path).await?; - let pubkeys = pubkeys::list_from_dirk_accounts(&accounts)?; - - write_to_file(&out, &pubkeys)?; - println!("Pubkeys generated and saved to {}", out); - } - }, + Commands::Delegate(cmd) => cmd.run().await?, + Commands::Pubkeys(cmd) => cmd.run().await?, } Ok(()) From 066f3c6976ceacc86664bb76d08ccd38401c2d57 Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Fri, 25 Oct 2024 10:42:39 +0200 Subject: [PATCH 04/85] chore: stash --- bolt-cli/Cargo.toml | 2 +- bolt-cli/src/cli.rs | 15 +++++++++++++++ bolt-cli/src/commands/send.rs | 9 +++++++++ bolt-cli/src/main.rs | 1 + 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/bolt-cli/Cargo.toml b/bolt-cli/Cargo.toml index 5898e813c..747b99575 100644 --- a/bolt-cli/Cargo.toml +++ b/bolt-cli/Cargo.toml @@ -35,10 +35,10 @@ thiserror = "1.0" hex = "0.4.3" tracing = "0.1.40" tracing-subscriber = "0.3.18" +reqwest = "0.12.8" [dev-dependencies] tempfile = "3.13.0" -reqwest = "0.12.8" [build-dependencies] tonic-build = "0.12.3" diff --git a/bolt-cli/src/cli.rs b/bolt-cli/src/cli.rs index 8458acd20..ca2019436 100644 --- a/bolt-cli/src/cli.rs +++ b/bolt-cli/src/cli.rs @@ -22,6 +22,9 @@ pub enum Commands { /// Output a list of pubkeys in JSON format. Pubkeys(PubkeysCommand), + + /// Send a preconfirmation request to a Bolt proposer. + Send(SendCommand), } /// Command for generating BLS delegation or revocation messages. @@ -61,6 +64,18 @@ pub struct PubkeysCommand { pub source: KeySource, } +/// Command for sending a preconfirmation request to a Bolt proposer. +#[derive(Debug, Clone, Deserialize, Parser)] +pub struct SendCommand { + /// Bolt Sidecar RPC URL to send requests to. + #[clap(long, env = "SIDECAR_RPC_URL")] + pub sidecar_rpc_url: String, + + /// The private key to sign the transaction with. + #[clap(long, env = "PRIVATE_KEY", hide_env_values = true)] + pub private_key: String, +} + /// The action to perform. #[derive(Debug, Clone, ValueEnum, Deserialize)] #[clap(rename_all = "kebab_case")] diff --git a/bolt-cli/src/commands/send.rs b/bolt-cli/src/commands/send.rs index 8b1378917..4ead19080 100644 --- a/bolt-cli/src/commands/send.rs +++ b/bolt-cli/src/commands/send.rs @@ -1 +1,10 @@ +use eyre::Result; +use crate::cli::SendCommand; + +impl SendCommand { + /// Run the `send` command. + pub async fn run(self) -> Result<()> { + Ok(()) + } +} diff --git a/bolt-cli/src/main.rs b/bolt-cli/src/main.rs index da5e9076f..b7ea0b910 100644 --- a/bolt-cli/src/main.rs +++ b/bolt-cli/src/main.rs @@ -25,6 +25,7 @@ async fn main() -> Result<()> { match cli.command { Commands::Delegate(cmd) => cmd.run().await?, Commands::Pubkeys(cmd) => cmd.run().await?, + Commands::Send(cmd) => cmd.run().await?, } Ok(()) From 178656bd0541cabc962e053a5fc111af92859771 Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Fri, 25 Oct 2024 14:27:18 +0200 Subject: [PATCH 05/85] feat: send preconfirmation requests to the rpc --- bolt-cli/Cargo.lock | 907 +++++++++++++++++++++++++++- bolt-cli/Cargo.toml | 4 +- bolt-cli/src/cli.rs | 30 +- bolt-cli/src/commands/delegate.rs | 6 +- bolt-cli/src/commands/send.rs | 134 +++- bolt-cli/src/common/bolt_manager.rs | 155 +++++ bolt-cli/src/common/dirk.rs | 2 +- bolt-cli/src/common/mod.rs | 3 + bolt-cli/src/common/signing.rs | 2 +- 9 files changed, 1219 insertions(+), 24 deletions(-) create mode 100644 bolt-cli/src/common/bolt_manager.rs diff --git a/bolt-cli/Cargo.lock b/bolt-cli/Cargo.lock index e1c9d6df7..5621db297 100644 --- a/bolt-cli/Cargo.lock +++ b/bolt-cli/Cargo.lock @@ -30,6 +30,19 @@ dependencies = [ "opaque-debug", ] +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -39,6 +52,228 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "alloy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea8ebf106e84a1c37f86244df7da0c7587e697b71a0d565cce079449b85ac6f8" +dependencies = [ + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-network", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-serde", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", +] + +[[package]] +name = "alloy-chains" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4932d790c723181807738cf1ac68198ab581cd699545b155601332541ee47bd" +dependencies = [ + "alloy-primitives 0.8.9", + "num_enum", + "strum", +] + +[[package]] +name = "alloy-consensus" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed961a48297c732a5d97ee321aa8bb5009ecadbcb077d8bec90cb54e651629" +dependencies = [ + "alloy-eips", + "alloy-primitives 0.8.9", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "c-kzg", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460ab80ce4bda1c80bcf96fe7460520476f2c7b734581c6567fac2708e2a60ef" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives 0.8.9", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "thiserror", +] + +[[package]] +name = "alloy-core" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cce174ca699ddee3bfb2ec1fbd99ad7efd05eca20c5c888d8320db41f7e8f04" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives 0.8.9", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5647fce5a168f9630f935bf7821c4207b1755184edaeba783cb4e11d35058484" +dependencies = [ + "alloy-json-abi", + "alloy-primitives 0.8.9", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow", +] + +[[package]] +name = "alloy-eip2930" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +dependencies = [ + "alloy-primitives 0.8.9", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ffc577390ce50234e02d841214b3dc0bea6aaaae8e04bbf3cb82e9a45da9eb" +dependencies = [ + "alloy-primitives 0.8.9", + "alloy-rlp", + "derive_more 1.0.0", + "k256 0.13.4", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b69e06cf9c37be824b9d26d6d101114fdde6af0c87de2828b414c05c4b3daa71" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives 0.8.9", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more 1.0.0", + "once_cell", + "serde", + "sha2 0.10.8", +] + +[[package]] +name = "alloy-genesis" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde15e14944a88bd6a57d325e9a49b75558746fe16aaccc79713ae50a6a9574c" +dependencies = [ + "alloy-primitives 0.8.9", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b5671117c38b1c2306891f97ad3828d85487087f54ebe2c7591a055ea5bcea7" +dependencies = [ + "alloy-primitives 0.8.9", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af5979e0d5a7bf9c7eb79749121e8256e59021af611322aee56e77e20776b4b3" +dependencies = [ + "alloy-primitives 0.8.9", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "204237129086ce5dc17a58025e93739b01b45313841f98fa339eb1d780511e57" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives 0.8.9", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "thiserror", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514f70ee2a953db21631cd817b13a1571474ec77ddc03d47616d5e8203489fde" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives 0.8.9", + "alloy-serde", + "serde", +] + [[package]] name = "alloy-primitives" version = "0.7.7" @@ -89,16 +324,172 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "alloy-provider" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4814d141ede360bb6cd1b4b064f1aab9de391e7c4d0d4d50ac89ea4bc1e25fbd" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives 0.8.9", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "reqwest", + "schnellru", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-pubsub" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ba46eb69ddf7a9925b81f15229cb74658e6eebe5dd30a5b74e2cd040380573" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives 0.8.9", + "alloy-transport", + "bimap", + "futures", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.1", + "tracing", +] + [[package]] name = "alloy-rlp" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" dependencies = [ + "alloy-rlp-derive", "arrayvec", "bytes", ] +[[package]] +name = "alloy-rlp-derive" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.82", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc2bd1e7403463a5f2c61e955bcc9d3072b63aa177442b0f9aa6a6d22a941e3" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives 0.8.9", + "alloy-pubsub", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.1", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea9bf1abdd506f985a53533f5ac01296bcd6102c5e139bbc5d40bc468d2c916" +dependencies = [ + "alloy-primitives 0.8.9", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-engine" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "886d22d41992287a235af2f3af4299b5ced2bcafb81eb835572ad35747476946" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives 0.8.9", + "alloy-rlp", + "alloy-serde", + "derive_more 1.0.0", + "serde", + "strum", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b034779a4850b4b03f5be5ea674a1cf7d746b2da762b34d1860ab45e48ca27" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives 0.8.9", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "derive_more 1.0.0", + "itertools 0.13.0", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-serde" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028e72eaa9703e4882344983cfe7636ce06d8cce104a78ea62fd19b46659efc4" +dependencies = [ + "alloy-primitives 0.8.9", + "serde", + "serde_json", +] + [[package]] name = "alloy-signer" version = "0.5.3" @@ -113,6 +504,167 @@ dependencies = [ "thiserror", ] +[[package]] +name = "alloy-signer-local" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6614f02fc1d5b079b2a4a5320018317b506fd0a6d67c1fd5542a71201724986c" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives 0.8.9", + "alloy-signer", + "async-trait", + "k256 0.13.4", + "rand", + "thiserror", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0900b83f4ee1f45c640ceee596afbc118051921b9438fdb5a3175c1a7e05f8b" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.82", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a41b1e78dde06b5e12e6702fa8c1d30621bf07728ba75b801fb801c9c6a0ba10" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap 2.6.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.82", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91dc311a561a306664393407b88d3e53ae58581624128afd8a15faa5de3627dc" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.82", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45d1fbee9e698f3ba176b6e7a145f4aefe6d2b746b611e8bb246fe11a0e9f6c4" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "086f41bc6ebcd8cb15f38ba20e47be38dd03692149681ce8061c35d960dbf850" +dependencies = [ + "alloy-json-abi", + "alloy-primitives 0.8.9", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be77579633ebbc1266ae6fd7694f75c408beb1aeb6865d0b18f22893c265a061" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower 0.5.1", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91fd1a5d0827939847983b46f2f79510361f901dc82f8e3c38ac7397af142c6e" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower 0.5.1", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-ipc" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8073d1186bfeeb8fbdd1292b6f1a0731f3aed8e21e1463905abfae0b96a887a6" +dependencies = [ + "alloy-json-rpc", + "alloy-pubsub", + "alloy-transport", + "bytes", + "futures", + "interprocess", + "pin-project", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "alloy-transport-ws" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61f27837bb4a1d6c83a28231c94493e814882f0e9058648a97e908a5f3fc9fcf" +dependencies = [ + "alloy-pubsub", + "alloy-transport", + "futures", + "http", + "rustls", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "ws_stream_wasm", +] + [[package]] name = "anstream" version = "0.6.15" @@ -346,6 +898,17 @@ dependencies = [ "syn 2.0.82", ] +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version 0.4.1", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -488,6 +1051,12 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + [[package]] name = "bindgen" version = "0.69.5" @@ -602,8 +1171,7 @@ dependencies = [ name = "bolt" version = "0.1.0" dependencies = [ - "alloy-primitives 0.8.9", - "alloy-signer", + "alloy", "blst", "clap", "dotenvy", @@ -614,6 +1182,7 @@ dependencies = [ "inquire", "nu-ansi-term 0.50.1", "prost", + "rand", "reqwest", "rustls", "serde", @@ -835,6 +1404,12 @@ dependencies = [ "libc", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + [[package]] name = "crossterm" version = "0.25.0" @@ -919,6 +1494,20 @@ dependencies = [ "cipher", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" version = "2.6.0" @@ -1022,6 +1611,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "doctest-file" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" + [[package]] name = "dotenvy" version = "0.15.7" @@ -1389,6 +1984,21 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -1396,6 +2006,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -1404,6 +2015,34 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.82", +] + [[package]] name = "futures-sink" version = "0.3.31" @@ -1422,12 +2061,24 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", + "futures-io", + "futures-macro", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", + "slab", ] +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + [[package]] name = "fuzzy-matcher" version = "0.3.7" @@ -1527,13 +2178,28 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" dependencies = [ + "allocator-api2", + "equivalent", "foldhash", + "serde", ] [[package]] @@ -1795,6 +2461,7 @@ checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown 0.15.0", + "serde", ] [[package]] @@ -1824,6 +2491,21 @@ dependencies = [ "num-traits", ] +[[package]] +name = "interprocess" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f4e4a06d42fab3e85ab1b419ad32b09eab58b901d40c57935ff92db3287a13" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + [[package]] name = "ipnet" version = "2.10.1" @@ -1987,6 +2669,15 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.0", +] + [[package]] name = "matchit" version = "0.7.3" @@ -2224,6 +2915,26 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.82", +] + [[package]] name = "object" version = "0.36.5" @@ -2386,6 +3097,16 @@ dependencies = [ "indexmap 2.6.0", ] +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + [[package]] name = "pin-project" version = "1.1.6" @@ -2519,6 +3240,28 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.82", +] + [[package]] name = "proc-macro2" version = "1.0.87" @@ -2631,6 +3374,7 @@ dependencies = [ "libc", "rand_chacha", "rand_core", + "serde", ] [[package]] @@ -2661,6 +3405,12 @@ dependencies = [ "rand_core", ] +[[package]] +name = "recvmsg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" + [[package]] name = "redox_syscall" version = "0.5.7" @@ -2973,6 +3723,17 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "schnellru" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9a8ef13a93c54d20580de1e5c413e624e53121d42fc7e2c11d10ef7f8b02367" +dependencies = [ + "ahash", + "cfg-if", + "hashbrown 0.13.2", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -3066,6 +3827,12 @@ dependencies = [ "pest", ] +[[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.210" @@ -3133,6 +3900,17 @@ dependencies = [ "yaml-rust", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + [[package]] name = "sha2" version = "0.9.9" @@ -3333,6 +4111,28 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.82", +] + [[package]] name = "subtle" version = "2.6.1" @@ -3361,6 +4161,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5e0c2ea8db64b2898b62ea2fbd60204ca95e0b2c6bdf53ff768bbe916fbe4d" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.82", +] + [[package]] name = "sync_wrapper" version = "0.1.2" @@ -3550,6 +4362,23 @@ dependencies = [ "futures-core", "pin-project-lite", "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots", ] [[package]] @@ -3757,6 +4586,26 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror", + "utf-8", +] + [[package]] name = "typenum" version = "1.17.0" @@ -3855,6 +4704,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.2" @@ -3980,6 +4835,20 @@ version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +[[package]] +name = "wasmtimer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7ed9d8b15c7fb594d72bfb4b5a276f3d2029333cd93a932f376f5937f6f80ee" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + [[package]] name = "web-sys" version = "0.3.72" @@ -3990,6 +4859,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.26.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "which" version = "4.4.2" @@ -4002,6 +4880,12 @@ dependencies = [ "rustix", ] +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + [[package]] name = "winapi" version = "0.3.9" @@ -4211,6 +5095,25 @@ dependencies = [ "memchr", ] +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "wyz" version = "0.5.1" diff --git a/bolt-cli/Cargo.toml b/bolt-cli/Cargo.toml index 747b99575..d40c45d09 100644 --- a/bolt-cli/Cargo.toml +++ b/bolt-cli/Cargo.toml @@ -25,8 +25,7 @@ blst = "0.3.12" # ethereum ethereum-consensus = { git = "https://github.com/ralexstokes/ethereum-consensus", rev = "cf3c404" } lighthouse_eth2_keystore = { package = "eth2_keystore", git = "https://github.com/sigp/lighthouse", rev = "a87f19d" } -alloy-primitives = "0.8.9" -alloy-signer = "0.5.2" +alloy = { version = "0.5.2", features = ["full"] } # utils dotenvy = "0.15.7" @@ -36,6 +35,7 @@ hex = "0.4.3" tracing = "0.1.40" tracing-subscriber = "0.3.18" reqwest = "0.12.8" +rand = "0.8.5" [dev-dependencies] tempfile = "3.13.0" diff --git a/bolt-cli/src/cli.rs b/bolt-cli/src/cli.rs index ca2019436..287c14465 100644 --- a/bolt-cli/src/cli.rs +++ b/bolt-cli/src/cli.rs @@ -2,12 +2,12 @@ use clap::{ builder::styling::{AnsiColor, Color, Style}, Parser, Subcommand, ValueEnum, }; -use serde::Deserialize; +use reqwest::Url; use crate::common::keystore::DEFAULT_KEYSTORE_PASSWORD; /// `bolt` is a CLI tool to interact with Bolt Protocol ✨ -#[derive(Parser, Debug, Clone, Deserialize)] +#[derive(Parser, Debug, Clone)] #[command(author, version, styles = cli_styles(), about, arg_required_else_help(true))] pub struct Opts { /// The subcommand to run. @@ -15,7 +15,7 @@ pub struct Opts { pub command: Commands, } -#[derive(Subcommand, Debug, Clone, Deserialize)] +#[derive(Subcommand, Debug, Clone)] pub enum Commands { /// Generate BLS delegation or revocation messages. Delegate(DelegateCommand), @@ -28,7 +28,7 @@ pub enum Commands { } /// Command for generating BLS delegation or revocation messages. -#[derive(Debug, Clone, Deserialize, Parser)] +#[derive(Debug, Clone, Parser)] pub struct DelegateCommand { /// The BLS public key to which the delegation message should be signed. #[clap(long, env = "DELEGATEE_PUBKEY")] @@ -53,7 +53,7 @@ pub struct DelegateCommand { } /// Command for outputting a list of pubkeys in JSON format. -#[derive(Debug, Clone, Deserialize, Parser)] +#[derive(Debug, Clone, Parser)] pub struct PubkeysCommand { /// The output file for the pubkeys. #[clap(long, env = "OUTPUT_FILE_PATH", default_value = "pubkeys.json")] @@ -65,11 +65,11 @@ pub struct PubkeysCommand { } /// Command for sending a preconfirmation request to a Bolt proposer. -#[derive(Debug, Clone, Deserialize, Parser)] +#[derive(Debug, Clone, Parser)] pub struct SendCommand { - /// Bolt Sidecar RPC URL to send requests to. - #[clap(long, env = "SIDECAR_RPC_URL")] - pub sidecar_rpc_url: String, + /// Bolt RPC URL to send requests to and fetch lookahead info from. + #[clap(long, env = "BOLT_RPC_URL", default_value = "http://135.181.191.125:58017")] + pub bolt_rpc_url: Url, /// The private key to sign the transaction with. #[clap(long, env = "PRIVATE_KEY", hide_env_values = true)] @@ -77,7 +77,7 @@ pub struct SendCommand { } /// The action to perform. -#[derive(Debug, Clone, ValueEnum, Deserialize)] +#[derive(Debug, Clone, ValueEnum)] #[clap(rename_all = "kebab_case")] pub enum Action { /// Create a delegation message. @@ -86,7 +86,7 @@ pub enum Action { Revoke, } -#[derive(Debug, Clone, Parser, Deserialize)] +#[derive(Debug, Clone, Parser)] pub enum KeySource { /// Use local secret keys to generate the signed messages. SecretKeys { @@ -112,7 +112,7 @@ pub enum KeySource { } /// Options for reading a keystore folder. -#[derive(Debug, Clone, Deserialize, Parser)] +#[derive(Debug, Clone, Parser)] pub struct LocalKeystoreOpts { /// The path to the keystore file. #[clap(long, env = "KEYSTORE_PATH", default_value = "validators")] @@ -139,7 +139,7 @@ pub struct LocalKeystoreOpts { } /// Options for connecting to a DIRK keystore. -#[derive(Debug, Clone, Deserialize, Parser)] +#[derive(Debug, Clone, Parser)] pub struct DirkOpts { /// The URL of the DIRK keystore. #[clap(long, env = "DIRK_URL")] @@ -160,7 +160,7 @@ pub struct DirkOpts { } /// TLS credentials for connecting to a remote server. -#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Parser)] +#[derive(Debug, Clone, PartialEq, Eq, Parser)] pub struct TlsCredentials { /// Path to the client certificate file. (.crt) #[clap(long, env = "CLIENT_CERT_PATH")] @@ -174,7 +174,7 @@ pub struct TlsCredentials { } /// Supported chains for the CLI -#[derive(Debug, Clone, Copy, ValueEnum, Deserialize)] +#[derive(Debug, Clone, Copy, ValueEnum)] #[clap(rename_all = "kebab_case")] pub enum Chain { Mainnet, diff --git a/bolt-cli/src/commands/delegate.rs b/bolt-cli/src/commands/delegate.rs index e821332ae..4f1d9721d 100644 --- a/bolt-cli/src/commands/delegate.rs +++ b/bolt-cli/src/commands/delegate.rs @@ -1,5 +1,7 @@ -use alloy_primitives::B256; -use alloy_signer::k256::sha2::{Digest, Sha256}; +use alloy::{ + primitives::B256, + signers::k256::sha2::{Digest, Sha256}, +}; use ethereum_consensus::crypto::{ PublicKey as BlsPublicKey, SecretKey as BlsSecretKey, Signature as BlsSignature, }; diff --git a/bolt-cli/src/commands/send.rs b/bolt-cli/src/commands/send.rs index 4ead19080..ecfc53134 100644 --- a/bolt-cli/src/commands/send.rs +++ b/bolt-cli/src/commands/send.rs @@ -1,10 +1,142 @@ -use eyre::Result; +use alloy::{ + eips::eip2718::Encodable2718, + network::{EthereumWallet, TransactionBuilder}, + primitives::{keccak256, B256, U256}, + providers::{ProviderBuilder, SendableTx}, + rpc::types::TransactionRequest, + signers::{local::PrivateKeySigner, Signer}, +}; +use eyre::{bail, Context, Result}; +use rand::Rng; +use reqwest::Url; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use tracing::info; use crate::cli::SendCommand; +/// Path to the lookahead endpoint on the Bolt RPC server. +const BOLT_LOOKAHEAD_PATH: &str = "proposers/lookahead?activeOnly=true&futureOnly=true"; + impl SendCommand { /// Run the `send` command. pub async fn run(self) -> Result<()> { + let wallet: PrivateKeySigner = self.private_key.parse().wrap_err("invalid private key")?; + let transaction_signer = EthereumWallet::from(wallet.clone()); + + let provider = ProviderBuilder::new() + .with_recommended_fillers() + .wallet(transaction_signer) + .on_http(self.bolt_rpc_url.clone()); + + // Fetch the lookahead info from the Bolt RPC server + let lookahead_url = self.bolt_rpc_url.join(BOLT_LOOKAHEAD_PATH)?; + let lookahead_res = reqwest::get(lookahead_url).await?.json::>().await?; + if lookahead_res.is_empty() { + println!("no bolt proposer found in the lookahead, try again later 🥲"); + return Ok(()); + } + + // Extract the next preconfirmer slot from the lookahead info + let next_preconfirmer_slot = lookahead_res[0].slot; + info!("Next preconfirmer slot: {}", next_preconfirmer_slot); + + // generate a simple self-transfer of ETH + let random_data = rand::thread_rng().gen::<[u8; 32]>(); + let req = TransactionRequest::default() + .with_to(wallet.address()) + .with_value(U256::from(100_000)) + .with_input(random_data); + + let raw_tx = match provider.fill(req).await? { + SendableTx::Builder(_) => bail!("expected a raw transaction"), + SendableTx::Envelope(raw) => raw.encoded_2718(), + }; + let tx_hash = B256::from(keccak256(&raw_tx)); + + send_rpc_request( + vec![hex::encode(&raw_tx)], + vec![tx_hash], + next_preconfirmer_slot, + self.bolt_rpc_url, + &wallet, + ) + .await?; + Ok(()) } } + +async fn send_rpc_request( + txs_rlp: Vec, + tx_hashes: Vec, + target_slot: u64, + target_sidecar_url: Url, + wallet: &PrivateKeySigner, +) -> Result<()> { + let request = prepare_rpc_request( + "bolt_requestInclusion", + serde_json::json!({ + "slot": target_slot, + "txs": txs_rlp, + }), + ); + + info!(?tx_hashes, target_slot, %target_sidecar_url); + let signature = sign_request(tx_hashes, target_slot, wallet).await?; + + let response = reqwest::Client::new() + .post(target_sidecar_url) + .header("content-type", "application/json") + .header("x-bolt-signature", signature) + .body(serde_json::to_string(&request)?) + .send() + .await?; + + let response = response.text().await?; + + // strip out long series of zeros in the response (to avoid spamming blob contents) + let response = response.replace(&"0".repeat(32), ".").replace(&".".repeat(4), ""); + info!("Response: {:?}", response); + Ok(()) +} + +async fn sign_request( + tx_hashes: Vec, + target_slot: u64, + wallet: &PrivateKeySigner, +) -> eyre::Result { + let digest = { + let mut data = Vec::new(); + let hashes = tx_hashes.iter().map(|hash| hash.as_slice()).collect::>().concat(); + data.extend_from_slice(&hashes); + data.extend_from_slice(target_slot.to_le_bytes().as_slice()); + keccak256(data) + }; + + let signature = hex::encode(wallet.sign_hash(&digest).await?.as_bytes()); + + Ok(format!("{}:0x{}", wallet.address(), signature)) +} + +fn prepare_rpc_request(method: &str, params: Value) -> Value { + serde_json::json!({ + "id": "1", + "jsonrpc": "2.0", + "method": method, + "params": vec![params], + }) +} + +/// Info about a specific slot in the beacon chain lookahead. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct LookaheadSlot { + /// Slot number in the beacon chain + pub slot: u64, + /// Validator index that will propose in this slot + pub validator_index: u64, + /// Validator pubkey that will propose in this slot + pub validator_pubkey: String, + /// Optional URL of the Bolt sidecar associated with the proposer + pub sidecar_url: Option, +} diff --git a/bolt-cli/src/common/bolt_manager.rs b/bolt-cli/src/common/bolt_manager.rs new file mode 100644 index 000000000..78550494b --- /dev/null +++ b/bolt-cli/src/common/bolt_manager.rs @@ -0,0 +1,155 @@ +use std::str::FromStr; + +use alloy::{ + contract::{Error as ContractError, Result as ContractResult}, + primitives::{Address, Bytes, B256}, + providers::{ProviderBuilder, RootProvider}, + sol, + sol_types::{Error as SolError, SolInterface}, + transports::{http::Http, TransportError}, +}; +use reqwest::{Client, Url}; +use serde::Serialize; + +use BoltManagerContract::{BoltManagerContractErrors, BoltManagerContractInstance, ProposerStatus}; + +/// Bolt Manager contract bindings. +#[derive(Debug, Clone)] +pub struct BoltManager(BoltManagerContractInstance, RootProvider>>); + +impl BoltManager { + /// Creates a new BoltManager instance. + pub fn new>(execution_client_url: U, manager_address: Address) -> Self { + let provider = ProviderBuilder::new().on_http(execution_client_url.into()); + let manager = BoltManagerContract::new(manager_address, provider); + + Self(manager) + } + + /// Gets the sidecar RPC URL for a given validator index. + /// + /// Returns Ok(None) if the operator is not found in the registry. + pub async fn get_sidecar_rpc_url_for_validator( + &self, + pubkey_hash: B256, + ) -> ContractResult> { + let registrant = self.get_proposer_status(pubkey_hash).await?; + Ok(registrant.and_then(|r| if r.active { Some(r.operatorRPC) } else { None })) + } + + /// Gets the proposer status for a given pubkeyhash. + /// + /// Returns Ok(None) if the proposer is not found in the registry. + pub async fn get_proposer_status( + &self, + pubkey_hash: B256, + ) -> ContractResult> { + let returndata = self.0.getProposerStatus(pubkey_hash).call().await; + + // TODO: clean this after https://github.com/alloy-rs/alloy/issues/787 is merged + let error = match returndata.map(|data| data._0) { + Ok(proposer) => return Ok(Some(proposer)), + Err(error) => match error { + ContractError::TransportError(TransportError::ErrorResp(err)) => { + let data = err.data.unwrap_or_default(); + let data = data.get().trim_matches('"'); + let data = Bytes::from_str(data).unwrap_or_default(); + + BoltManagerContractErrors::abi_decode(&data, true)? + } + e => return Err(e), + }, + }; + + if matches!(error, BoltManagerContractErrors::ValidatorDoesNotExist(_)) { + Ok(None) + } else { + Err(SolError::custom(format!( + "unexpected Solidity error selector: {:?}", + error.selector() + )) + .into()) + } + } +} + +sol! { + #[sol(rpc)] + interface BoltManagerContract { + #[derive(Debug, Default, Serialize)] + struct ProposerStatus { + bytes32 pubkeyHash; + bool active; + address operator; + string operatorRPC; + address[] collaterals; + uint256[] amounts; + } + + function getProposerStatus(bytes32 pubkeyHash) external view returns (ProposerStatus memory); + + error InvalidQuery(); + error ValidatorDoesNotExist(); + } +} + +#[cfg(test)] +mod tests { + use std::str::FromStr; + + use alloy::primitives::U256; + + use super::*; + + #[tokio::test] + async fn test_get_operators_helder() -> eyre::Result<()> { + let registry = BoltManager::new( + Url::parse("http://remotebeast:4485")?, + Address::from_str("0xdF11D829eeC4C192774F3Ec171D822f6Cb4C14d9")?, + ); + + let sample_pubkey = B256::from_str("0xsamplepubkeyhash").expect("invalid pubkey"); + + let registrant = registry.get_proposer_status(sample_pubkey).await; + assert!(matches!(registrant, Ok(None))); + + let invalid_pubkey = B256::from_str("0xinvalidsamplepubkeyhash").expect("invalid pubkey"); + let registrant = match registry.get_proposer_status(invalid_pubkey).await { + Ok(Some(registrant)) => registrant, + e => panic!("unexpected error reading from registry: {:?}", e), + }; + + let expected = ProposerStatus { + pubkeyHash: sample_pubkey, + active: true, + operator: Address::from_str("0xad3cd1b81c80f4a495d6552ae6423508492a27f8")?, + operatorRPC: "http://sampleoperatorrpc:8000".to_string(), + collaterals: vec![Address::from_str("0xsamplecollateral1")?], + amounts: vec![U256::from(10000000000000000000u128)], + }; + + assert_eq!(registrant.pubkeyHash, expected.pubkeyHash); + assert_eq!(registrant.active, expected.active); + assert_eq!(registrant.operator, expected.operator); + assert_eq!(registrant.operatorRPC, expected.operatorRPC); + assert_eq!(registrant.collaterals, expected.collaterals); + assert_eq!(registrant.amounts, expected.amounts); + + Ok(()) + } + + #[tokio::test] + async fn test_check_validator_helder() -> eyre::Result<()> { + let registry = BoltManager::new( + Url::parse("http://remotebeast:48545")?, + Address::from_str("0xdF11D829eeC4C192774F3Ec171D822f6Cb4C14d9")?, + ); + + let pubkey_hash = B256::from_str("0xsamplepubkeyhash").expect("invalid pubkey"); + let registrant = registry.get_sidecar_rpc_url_for_validator(pubkey_hash).await?; + assert!(registrant.is_some()); + + dbg!(®istrant); + Ok(()) + } +} diff --git a/bolt-cli/src/common/dirk.rs b/bolt-cli/src/common/dirk.rs index dc5e594eb..75148bab8 100644 --- a/bolt-cli/src/common/dirk.rs +++ b/bolt-cli/src/common/dirk.rs @@ -1,6 +1,6 @@ use std::fs; -use alloy_primitives::B256; +use alloy::primitives::B256; use ethereum_consensus::crypto::bls::Signature as BlsSignature; use eyre::{bail, Context, Result}; use tonic::transport::{Certificate, Channel, ClientTlsConfig, Identity}; diff --git a/bolt-cli/src/common/mod.rs b/bolt-cli/src/common/mod.rs index efee3e63e..b152a4614 100644 --- a/bolt-cli/src/common/mod.rs +++ b/bolt-cli/src/common/mod.rs @@ -4,6 +4,9 @@ use ethereum_consensus::crypto::PublicKey as BlsPublicKey; use eyre::{Context, Result}; use serde::Serialize; +/// BoltManager contract bindings. +pub mod bolt_manager; + /// Utilities for working with DIRK remote keystores. pub mod dirk; diff --git a/bolt-cli/src/common/signing.rs b/bolt-cli/src/common/signing.rs index 07d3a6590..59c70a220 100644 --- a/bolt-cli/src/common/signing.rs +++ b/bolt-cli/src/common/signing.rs @@ -1,4 +1,4 @@ -use alloy_primitives::B256; +use alloy::primitives::B256; use blst::{min_pk::Signature, BLST_ERROR}; use ethereum_consensus::{ crypto::PublicKey as BlsPublicKey, From 6477a5b8a9ce6fe19cec4e11552445baa814a998 Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Fri, 25 Oct 2024 14:27:57 +0200 Subject: [PATCH 06/85] chore: add sidecar url override --- bolt-cli/src/cli.rs | 7 +++++++ bolt-cli/src/commands/send.rs | 11 ++++++++++- bolt-cli/src/common/bolt_manager.rs | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/bolt-cli/src/cli.rs b/bolt-cli/src/cli.rs index 287c14465..5657fcb96 100644 --- a/bolt-cli/src/cli.rs +++ b/bolt-cli/src/cli.rs @@ -74,6 +74,13 @@ pub struct SendCommand { /// The private key to sign the transaction with. #[clap(long, env = "PRIVATE_KEY", hide_env_values = true)] pub private_key: String, + + /// The Bolt Sidecar URL to send requests to. If provided, this will override + /// the canonical bolt RPC URL and disregard any registration information. + /// + /// This is useful for testing and development purposes. + #[clap(long, env = "OVERRIDE_BOLT_SIDECAR_URL")] + pub override_bolt_sidecar_url: Option, } /// The action to perform. diff --git a/bolt-cli/src/commands/send.rs b/bolt-cli/src/commands/send.rs index ecfc53134..a076cf474 100644 --- a/bolt-cli/src/commands/send.rs +++ b/bolt-cli/src/commands/send.rs @@ -54,11 +54,20 @@ impl SendCommand { }; let tx_hash = B256::from(keccak256(&raw_tx)); + // Note: it's possible for users to override the target sidecar URL + // for testing and development purposes. In most cases, the sidecar will + // reject a request for a slot that it is not responsible for. + let target_url = if let Some(sidecar_url) = self.override_bolt_sidecar_url { + sidecar_url.clone() + } else { + self.bolt_rpc_url.clone() + }; + send_rpc_request( vec![hex::encode(&raw_tx)], vec![tx_hash], next_preconfirmer_slot, - self.bolt_rpc_url, + target_url, &wallet, ) .await?; diff --git a/bolt-cli/src/common/bolt_manager.rs b/bolt-cli/src/common/bolt_manager.rs index 78550494b..ae4e0a720 100644 --- a/bolt-cli/src/common/bolt_manager.rs +++ b/bolt-cli/src/common/bolt_manager.rs @@ -1,3 +1,5 @@ +#![allow(dead_code)] // TODO: rm this + use std::str::FromStr; use alloy::{ From 2d116deaf44235ce2b55760858e093705bfa4429 Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Fri, 25 Oct 2024 14:28:45 +0200 Subject: [PATCH 07/85] chore: rm unused tests --- bolt-cli/src/common/bolt_manager.rs | 61 ----------------------------- 1 file changed, 61 deletions(-) diff --git a/bolt-cli/src/common/bolt_manager.rs b/bolt-cli/src/common/bolt_manager.rs index ae4e0a720..261347ab3 100644 --- a/bolt-cli/src/common/bolt_manager.rs +++ b/bolt-cli/src/common/bolt_manager.rs @@ -94,64 +94,3 @@ sol! { error ValidatorDoesNotExist(); } } - -#[cfg(test)] -mod tests { - use std::str::FromStr; - - use alloy::primitives::U256; - - use super::*; - - #[tokio::test] - async fn test_get_operators_helder() -> eyre::Result<()> { - let registry = BoltManager::new( - Url::parse("http://remotebeast:4485")?, - Address::from_str("0xdF11D829eeC4C192774F3Ec171D822f6Cb4C14d9")?, - ); - - let sample_pubkey = B256::from_str("0xsamplepubkeyhash").expect("invalid pubkey"); - - let registrant = registry.get_proposer_status(sample_pubkey).await; - assert!(matches!(registrant, Ok(None))); - - let invalid_pubkey = B256::from_str("0xinvalidsamplepubkeyhash").expect("invalid pubkey"); - let registrant = match registry.get_proposer_status(invalid_pubkey).await { - Ok(Some(registrant)) => registrant, - e => panic!("unexpected error reading from registry: {:?}", e), - }; - - let expected = ProposerStatus { - pubkeyHash: sample_pubkey, - active: true, - operator: Address::from_str("0xad3cd1b81c80f4a495d6552ae6423508492a27f8")?, - operatorRPC: "http://sampleoperatorrpc:8000".to_string(), - collaterals: vec![Address::from_str("0xsamplecollateral1")?], - amounts: vec![U256::from(10000000000000000000u128)], - }; - - assert_eq!(registrant.pubkeyHash, expected.pubkeyHash); - assert_eq!(registrant.active, expected.active); - assert_eq!(registrant.operator, expected.operator); - assert_eq!(registrant.operatorRPC, expected.operatorRPC); - assert_eq!(registrant.collaterals, expected.collaterals); - assert_eq!(registrant.amounts, expected.amounts); - - Ok(()) - } - - #[tokio::test] - async fn test_check_validator_helder() -> eyre::Result<()> { - let registry = BoltManager::new( - Url::parse("http://remotebeast:48545")?, - Address::from_str("0xdF11D829eeC4C192774F3Ec171D822f6Cb4C14d9")?, - ); - - let pubkey_hash = B256::from_str("0xsamplepubkeyhash").expect("invalid pubkey"); - let registrant = registry.get_sidecar_rpc_url_for_validator(pubkey_hash).await?; - assert!(registrant.is_some()); - - dbg!(®istrant); - Ok(()) - } -} From a58f853893ae5c7149f242f31489401220bf13ae Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:01:51 +0200 Subject: [PATCH 08/85] fix: use next proposer slot when overriding rpc --- bolt-cli/src/cli.rs | 2 +- bolt-cli/src/commands/send.rs | 44 +++++++++++++++++++++-------------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/bolt-cli/src/cli.rs b/bolt-cli/src/cli.rs index 5657fcb96..c222ab4fd 100644 --- a/bolt-cli/src/cli.rs +++ b/bolt-cli/src/cli.rs @@ -68,7 +68,7 @@ pub struct PubkeysCommand { #[derive(Debug, Clone, Parser)] pub struct SendCommand { /// Bolt RPC URL to send requests to and fetch lookahead info from. - #[clap(long, env = "BOLT_RPC_URL", default_value = "http://135.181.191.125:58017")] + #[clap(long, env = "BOLT_RPC_URL", default_value = "http://135.181.191.125:58017/rpc")] pub bolt_rpc_url: Url, /// The private key to sign the transaction with. diff --git a/bolt-cli/src/commands/send.rs b/bolt-cli/src/commands/send.rs index a076cf474..91ac27a43 100644 --- a/bolt-cli/src/commands/send.rs +++ b/bolt-cli/src/commands/send.rs @@ -16,7 +16,7 @@ use tracing::info; use crate::cli::SendCommand; /// Path to the lookahead endpoint on the Bolt RPC server. -const BOLT_LOOKAHEAD_PATH: &str = "proposers/lookahead?activeOnly=true&futureOnly=true"; +const BOLT_LOOKAHEAD_PATH: &str = "proposers/lookahead"; impl SendCommand { /// Run the `send` command. @@ -30,7 +30,22 @@ impl SendCommand { .on_http(self.bolt_rpc_url.clone()); // Fetch the lookahead info from the Bolt RPC server - let lookahead_url = self.bolt_rpc_url.join(BOLT_LOOKAHEAD_PATH)?; + let mut lookahead_url = self.bolt_rpc_url.join(BOLT_LOOKAHEAD_PATH)?; + + // Note: it's possible for users to override the target sidecar URL + // for testing and development purposes. In most cases, the sidecar will + // reject a request for a slot that it is not responsible for. + let target_url = if let Some(sidecar_url) = self.override_bolt_sidecar_url { + // If using the override URL, we don't need to fetch the active proposers only. + // we will set the next slot as the target slot. + sidecar_url.clone() + } else { + // Filter out slots that are not active or in the past, to fetch the next + // active proposer slot. + lookahead_url.set_query(Some("activeOnly=true&futureOnly=true")); + self.bolt_rpc_url.clone() + }; + let lookahead_res = reqwest::get(lookahead_url).await?.json::>().await?; if lookahead_res.is_empty() { println!("no bolt proposer found in the lookahead, try again later 🥲"); @@ -38,8 +53,8 @@ impl SendCommand { } // Extract the next preconfirmer slot from the lookahead info - let next_preconfirmer_slot = lookahead_res[0].slot; - info!("Next preconfirmer slot: {}", next_preconfirmer_slot); + let target_slot = lookahead_res[0].slot; + info!("Target slot: {}", target_slot); // generate a simple self-transfer of ETH let random_data = rand::thread_rng().gen::<[u8; 32]>(); @@ -48,25 +63,16 @@ impl SendCommand { .with_value(U256::from(100_000)) .with_input(random_data); - let raw_tx = match provider.fill(req).await? { + let raw_tx = match provider.fill(req).await.wrap_err("failed to fill transaction")? { SendableTx::Builder(_) => bail!("expected a raw transaction"), SendableTx::Envelope(raw) => raw.encoded_2718(), }; let tx_hash = B256::from(keccak256(&raw_tx)); - // Note: it's possible for users to override the target sidecar URL - // for testing and development purposes. In most cases, the sidecar will - // reject a request for a slot that it is not responsible for. - let target_url = if let Some(sidecar_url) = self.override_bolt_sidecar_url { - sidecar_url.clone() - } else { - self.bolt_rpc_url.clone() - }; - send_rpc_request( vec![hex::encode(&raw_tx)], vec![tx_hash], - next_preconfirmer_slot, + target_slot, target_url, &wallet, ) @@ -100,7 +106,8 @@ async fn send_rpc_request( .header("x-bolt-signature", signature) .body(serde_json::to_string(&request)?) .send() - .await?; + .await + .wrap_err("failed to send POST request")?; let response = response.text().await?; @@ -144,8 +151,9 @@ pub struct LookaheadSlot { pub slot: u64, /// Validator index that will propose in this slot pub validator_index: u64, - /// Validator pubkey that will propose in this slot - pub validator_pubkey: String, + // TODO: add pubkey back once it's added in the rpc + // /// Validator pubkey that will propose in this slot + // pub validator_pubkey: String, /// Optional URL of the Bolt sidecar associated with the proposer pub sidecar_url: Option, } From 659d43bae9f6f3b69a926e7d9be0e83a91c70138 Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:11:08 +0200 Subject: [PATCH 09/85] fix: rm unused deps, smol cleanup --- bolt-cli/Cargo.lock | 252 +++++-------------------------------------- bolt-cli/Cargo.toml | 2 - bolt-cli/src/cli.rs | 15 ++- bolt-cli/src/main.rs | 15 +-- 4 files changed, 41 insertions(+), 243 deletions(-) diff --git a/bolt-cli/Cargo.lock b/bolt-cli/Cargo.lock index 5621db297..2339a5251 100644 --- a/bolt-cli/Cargo.lock +++ b/bolt-cli/Cargo.lock @@ -1018,7 +1018,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -1063,7 +1063,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.6.0", + "bitflags", "cexpr", "clang-sys", "itertools 0.10.5", @@ -1095,12 +1095,6 @@ 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.6.0" @@ -1179,8 +1173,6 @@ dependencies = [ "ethereum-consensus", "eyre", "hex", - "inquire", - "nu-ansi-term 0.50.1", "prost", "rand", "reqwest", @@ -1410,31 +1402,6 @@ version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" -[[package]] -name = "crossterm" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" -dependencies = [ - "bitflags 1.3.2", - "crossterm_winapi", - "libc", - "mio 0.8.11", - "parking_lot", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm_winapi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] - [[package]] name = "crunchy" version = "0.2.2" @@ -1629,12 +1596,6 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" -[[package]] -name = "dyn-clone" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" - [[package]] name = "ecdsa" version = "0.14.8" @@ -2079,24 +2040,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" -[[package]] -name = "fuzzy-matcher" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" -dependencies = [ - "thread_local", -] - -[[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" @@ -2464,24 +2407,6 @@ dependencies = [ "serde", ] -[[package]] -name = "inquire" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fddf93031af70e75410a2511ec04d49e758ed2f26dad3404a934e0fb45cc12a" -dependencies = [ - "bitflags 2.6.0", - "crossterm", - "dyn-clone", - "fuzzy-matcher", - "fxhash", - "newline-converter", - "once_cell", - "tempfile", - "unicode-segmentation", - "unicode-width", -] - [[package]] name = "integer-sqrt" version = "0.1.5" @@ -2632,7 +2557,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2711,18 +2636,6 @@ dependencies = [ "adler2", ] -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.48.0", -] - [[package]] name = "mio" version = "1.0.2" @@ -2809,15 +2722,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "newline-converter" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b6b097ecb1cbfed438542d16e84fd7ad9b0c76c8a65b7f9039212a3d14dc7f" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "nom" version = "7.1.3" @@ -2838,15 +2742,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "nu-ansi-term" -version = "0.50.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "num-bigint" version = "0.4.6" @@ -2962,7 +2857,7 @@ version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags 2.6.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -3052,7 +2947,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -3279,7 +3174,7 @@ checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.6.0", + "bitflags", "lazy_static", "num-traits", "rand", @@ -3417,7 +3312,7 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "bitflags 2.6.0", + "bitflags", ] [[package]] @@ -3631,7 +3526,7 @@ version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ - "bitflags 2.6.0", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -3786,7 +3681,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -3970,27 +3865,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signal-hook" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" -dependencies = [ - "libc", - "mio 0.8.11", - "signal-hook", -] - [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -4206,7 +4080,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", + "bitflags", "core-foundation", "system-configuration-sys", ] @@ -4312,7 +4186,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.2", + "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", @@ -4561,7 +4435,7 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ - "nu-ansi-term 0.46.0", + "nu-ansi-term", "sharded-slab", "smallvec", "thread_local", @@ -4657,18 +4531,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - [[package]] name = "unicode-xid" version = "0.2.6" @@ -4916,7 +4778,7 @@ checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ "windows-result", "windows-strings", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -4925,7 +4787,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -4935,16 +4797,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ "windows-result", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", + "windows-targets", ] [[package]] @@ -4953,7 +4806,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -4962,22 +4815,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets", ] [[package]] @@ -4986,46 +4824,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -5038,48 +4858,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" diff --git a/bolt-cli/Cargo.toml b/bolt-cli/Cargo.toml index d40c45d09..64882c203 100644 --- a/bolt-cli/Cargo.toml +++ b/bolt-cli/Cargo.toml @@ -10,9 +10,7 @@ tokio = { version = "1.41.0", features = ["full"] } # cli clap = { version = "4.5.4", features = ["derive", "env"] } serde = { version = "1.0.197", features = ["derive"] } -inquire = { version = "0.7", features = ["editor"] } serde_json = "1.0.115" -nu-ansi-term = "0.50" # grpc rustls = { version = "0.23.15", features = ["ring"] } diff --git a/bolt-cli/src/cli.rs b/bolt-cli/src/cli.rs index c222ab4fd..445b70683 100644 --- a/bolt-cli/src/cli.rs +++ b/bolt-cli/src/cli.rs @@ -12,11 +12,11 @@ use crate::common::keystore::DEFAULT_KEYSTORE_PASSWORD; pub struct Opts { /// The subcommand to run. #[clap(subcommand)] - pub command: Commands, + pub command: Cmd, } #[derive(Subcommand, Debug, Clone)] -pub enum Commands { +pub enum Cmd { /// Generate BLS delegation or revocation messages. Delegate(DelegateCommand), @@ -27,6 +27,17 @@ pub enum Commands { Send(SendCommand), } +impl Cmd { + /// Run the command. + pub async fn run(self) -> eyre::Result<()> { + match self { + Cmd::Delegate(cmd) => cmd.run().await, + Cmd::Pubkeys(cmd) => cmd.run().await, + Cmd::Send(cmd) => cmd.run().await, + } + } +} + /// Command for generating BLS delegation or revocation messages. #[derive(Debug, Clone, Parser)] pub struct DelegateCommand { diff --git a/bolt-cli/src/main.rs b/bolt-cli/src/main.rs index b7ea0b910..dc59ec8ad 100644 --- a/bolt-cli/src/main.rs +++ b/bolt-cli/src/main.rs @@ -1,9 +1,7 @@ use clap::Parser; -use eyre::Result; /// CLI command definitions and options. mod cli; -use cli::{Commands, Opts}; /// CLI command implementations. mod commands; @@ -15,18 +13,13 @@ mod common; mod pb; #[tokio::main] -async fn main() -> Result<()> { +async fn main() -> eyre::Result<()> { let _ = dotenvy::dotenv(); let _ = tracing_subscriber::fmt::try_init(); - let _ = rustls::crypto::ring::default_provider().install_default(); - let cli = Opts::parse(); - - match cli.command { - Commands::Delegate(cmd) => cmd.run().await?, - Commands::Pubkeys(cmd) => cmd.run().await?, - Commands::Send(cmd) => cmd.run().await?, + if let Err(err) = rustls::crypto::ring::default_provider().install_default() { + eprintln!("Failed to install default TLS provider: {:?}", err); } - Ok(()) + cli::Opts::parse().command.run().await } From 288ea0b6758d43762aa6f98b3d9c5765222bd9da Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:36:45 +0200 Subject: [PATCH 10/85] feat: send n transactions at once --- bolt-cli/src/cli.rs | 4 ++++ bolt-cli/src/commands/send.rs | 44 ++++++++++++++++++----------------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/bolt-cli/src/cli.rs b/bolt-cli/src/cli.rs index 445b70683..42a69eb52 100644 --- a/bolt-cli/src/cli.rs +++ b/bolt-cli/src/cli.rs @@ -92,6 +92,10 @@ pub struct SendCommand { /// This is useful for testing and development purposes. #[clap(long, env = "OVERRIDE_BOLT_SIDECAR_URL")] pub override_bolt_sidecar_url: Option, + + /// How many transactions to send. + #[clap(long, env = "TRANSACTION_COUNT", default_value = "1")] + pub count: u32, } /// The action to perform. diff --git a/bolt-cli/src/commands/send.rs b/bolt-cli/src/commands/send.rs index 91ac27a43..c598a37b3 100644 --- a/bolt-cli/src/commands/send.rs +++ b/bolt-cli/src/commands/send.rs @@ -56,27 +56,29 @@ impl SendCommand { let target_slot = lookahead_res[0].slot; info!("Target slot: {}", target_slot); - // generate a simple self-transfer of ETH - let random_data = rand::thread_rng().gen::<[u8; 32]>(); - let req = TransactionRequest::default() - .with_to(wallet.address()) - .with_value(U256::from(100_000)) - .with_input(random_data); - - let raw_tx = match provider.fill(req).await.wrap_err("failed to fill transaction")? { - SendableTx::Builder(_) => bail!("expected a raw transaction"), - SendableTx::Envelope(raw) => raw.encoded_2718(), - }; - let tx_hash = B256::from(keccak256(&raw_tx)); - - send_rpc_request( - vec![hex::encode(&raw_tx)], - vec![tx_hash], - target_slot, - target_url, - &wallet, - ) - .await?; + for _ in 0..self.count { + // generate a simple self-transfer of ETH + let random_data = rand::thread_rng().gen::<[u8; 32]>(); + let req = TransactionRequest::default() + .with_to(wallet.address()) + .with_value(U256::from(100_000)) + .with_input(random_data); + + let raw_tx = match provider.fill(req).await.wrap_err("failed to fill transaction")? { + SendableTx::Builder(_) => bail!("expected a raw transaction"), + SendableTx::Envelope(raw) => raw.encoded_2718(), + }; + let tx_hash = B256::from(keccak256(&raw_tx)); + + send_rpc_request( + vec![hex::encode(&raw_tx)], + vec![tx_hash], + target_slot, + target_url.clone(), + &wallet, + ) + .await?; + } Ok(()) } From ed30e675600a823f5b0fea9d92d8e768a71e9e6c Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:47:33 +0200 Subject: [PATCH 11/85] chore: updated readme --- bolt-cli/README.md | 82 ++++++++++++++++++++++++++++++++--- bolt-cli/src/cli.rs | 4 ++ bolt-cli/src/commands/send.rs | 25 ++++++++--- 3 files changed, 97 insertions(+), 14 deletions(-) diff --git a/bolt-cli/README.md b/bolt-cli/README.md index 6f40376d0..00d51a8c4 100644 --- a/bolt-cli/README.md +++ b/bolt-cli/README.md @@ -31,12 +31,7 @@ Available commands: - [`delegate`](#delegate) - Generate BLS delegation messages for the Constraints API. - [`pubkeys`](#pubkeys) - List available BLS public keys from various key sources. - -All above commands support three key sources: - -- Local BLS secret keys (as hex-encoded strings) via `secret-keys` -- Local EIP-2335 filesystem keystore directories via `local-keystore` -- Remote Dirk keystore via `dirk` (requires TLS credentials) +- [`send`](#send) - Send a preconfirmation request to a Bolt sidecar. --- @@ -45,6 +40,12 @@ All above commands support three key sources: The `delegate` command generates signed delegation messages for the Constraints API. To learn more about the Constraints API, please refer to the [Bolt documentation][bolt-docs]. +The `delegate` command supports three key sources: + +- Local BLS secret keys (as hex-encoded strings) via `secret-keys` +- Local EIP-2335 filesystem keystore directories via `local-keystore` +- Remote Dirk keystore via `dirk` (requires TLS credentials) +
Usage @@ -136,7 +137,11 @@ bolt delegate \ ### `Pubkeys` -The `pubkeys` command lists available BLS public keys from different key sources. +The `pubkeys` command lists available BLS public keys from different key sources: + +- Local BLS secret keys (as hex-encoded strings) via `secret-keys` +- Local EIP-2335 filesystem keystore directories via `local-keystore` +- Remote Dirk keystore via `dirk` (requires TLS credentials)
Usage @@ -192,6 +197,69 @@ bolt pubkeys dirk --url https://localhost:9091 \ --- +### `Send` + +The `send` command sends a preconfirmation request to a Bolt sidecar. + +
+Usage + +```text +❯ bolt send --help + +Send a preconfirmation request to a Bolt proposer + +Usage: bolt send [OPTIONS] --private-key + +Options: + --bolt-rpc-url + Bolt RPC URL to send requests to and fetch lookahead info from + + [env: BOLT_RPC_URL=] + [default: http://135.181.191.125:58017/rpc] + + --private-key + The private key to sign the transaction with + + [env: PRIVATE_KEY] + + --override-bolt-sidecar-url + The Bolt Sidecar URL to send requests to. If provided, this will override the canonical bolt RPC URL and disregard any registration information. + + This is useful for testing and development purposes. + + [env: OVERRIDE_BOLT_SIDECAR_URL=] + + --count + How many transactions to send + + [env: TRANSACTION_COUNT=] + [default: 1] + + --blob + If set, the transaction will be blob-carrying (type 3) + + [env: BLOB=] + + -h, --help + Print help (see a summary with '-h') +``` + +
+ +
+Examples + +1. Sending a preconfirmation request to a Bolt sidecar + +```text +bolt send --private-key $(openssl rand -hex 32) +``` + +
+ +--- + ## Security The Bolt CLI is designed to be used offline. It does not require any network connections diff --git a/bolt-cli/src/cli.rs b/bolt-cli/src/cli.rs index 42a69eb52..4a43b67f2 100644 --- a/bolt-cli/src/cli.rs +++ b/bolt-cli/src/cli.rs @@ -96,6 +96,10 @@ pub struct SendCommand { /// How many transactions to send. #[clap(long, env = "TRANSACTION_COUNT", default_value = "1")] pub count: u32, + + /// If set, the transaction will be blob-carrying (type 3) + #[clap(long, env = "BLOB", default_value = "false")] + pub blob: bool, } /// The action to perform. diff --git a/bolt-cli/src/commands/send.rs b/bolt-cli/src/commands/send.rs index c598a37b3..3e2c9e53d 100644 --- a/bolt-cli/src/commands/send.rs +++ b/bolt-cli/src/commands/send.rs @@ -1,7 +1,8 @@ use alloy::{ + consensus::{BlobTransactionSidecar, SidecarBuilder, SimpleCoder}, eips::eip2718::Encodable2718, - network::{EthereumWallet, TransactionBuilder}, - primitives::{keccak256, B256, U256}, + network::{EthereumWallet, TransactionBuilder, TransactionBuilder4844}, + primitives::{keccak256, Address, B256, U256}, providers::{ProviderBuilder, SendableTx}, rpc::types::TransactionRequest, signers::{local::PrivateKeySigner, Signer}, @@ -58,11 +59,7 @@ impl SendCommand { for _ in 0..self.count { // generate a simple self-transfer of ETH - let random_data = rand::thread_rng().gen::<[u8; 32]>(); - let req = TransactionRequest::default() - .with_to(wallet.address()) - .with_value(U256::from(100_000)) - .with_input(random_data); + let req = create_tx_request(wallet.address(), self.blob); let raw_tx = match provider.fill(req).await.wrap_err("failed to fill transaction")? { SendableTx::Builder(_) => bail!("expected a raw transaction"), @@ -84,6 +81,20 @@ impl SendCommand { } } +fn create_tx_request(to: Address, with_blob: bool) -> TransactionRequest { + let mut req = TransactionRequest::default(); + req = req.with_to(to).with_value(U256::from(100_000)); + req = req.with_input(rand::thread_rng().gen::<[u8; 32]>()); + + if with_blob { + let sidecar = SidecarBuilder::::from_slice(b"Blobs are fun!"); + let sidecar: BlobTransactionSidecar = sidecar.build().unwrap(); + req = req.with_blob_sidecar(sidecar) + } + + req +} + async fn send_rpc_request( txs_rlp: Vec, tx_hashes: Vec, From 4f02c6e5f8a3211bbf7c79a2f1c52a4af49c186e Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:49:55 +0200 Subject: [PATCH 12/85] feat: added devnet preconf support --- bolt-cli/src/cli.rs | 19 ++++++++++- bolt-cli/src/commands/send.rs | 61 ++++++++++++++++++++++++++++++++--- justfile | 30 ++++++++--------- 3 files changed, 90 insertions(+), 20 deletions(-) diff --git a/bolt-cli/src/cli.rs b/bolt-cli/src/cli.rs index 4a43b67f2..646c0a546 100644 --- a/bolt-cli/src/cli.rs +++ b/bolt-cli/src/cli.rs @@ -24,7 +24,7 @@ pub enum Cmd { Pubkeys(PubkeysCommand), /// Send a preconfirmation request to a Bolt proposer. - Send(SendCommand), + Send(Box), } impl Cmd { @@ -100,6 +100,23 @@ pub struct SendCommand { /// If set, the transaction will be blob-carrying (type 3) #[clap(long, env = "BLOB", default_value = "false")] pub blob: bool, + + /// If set, the transaction will target the devnet environment. + /// This is only used in Kurtosis for internal testing purposes + #[clap(long, hide = true, env = "DEVNET", default_value = "false")] + pub devnet: bool, + + /// The URL of the devnet execution client for filling transactions + #[clap(long = "devnet.execution_url", hide = true)] + pub devnet_execution_url: Option, + + /// The URL of the devnet beacon node for fetching slot numbers + #[clap(long = "devnet.beacon_url", hide = true)] + pub devnet_beacon_url: Option, + + /// The URL of the devnet sidecar for sending transactions + #[clap(long = "devnet.sidecar_url", hide = true)] + pub devnet_sidecar_url: Option, } /// The action to perform. diff --git a/bolt-cli/src/commands/send.rs b/bolt-cli/src/commands/send.rs index 3e2c9e53d..fdd2e12e0 100644 --- a/bolt-cli/src/commands/send.rs +++ b/bolt-cli/src/commands/send.rs @@ -7,7 +7,7 @@ use alloy::{ rpc::types::TransactionRequest, signers::{local::PrivateKeySigner, Signer}, }; -use eyre::{bail, Context, Result}; +use eyre::{bail, Context, ContextCompat, Result}; use rand::Rng; use reqwest::Url; use serde::{Deserialize, Serialize}; @@ -23,8 +23,17 @@ impl SendCommand { /// Run the `send` command. pub async fn run(self) -> Result<()> { let wallet: PrivateKeySigner = self.private_key.parse().wrap_err("invalid private key")?; - let transaction_signer = EthereumWallet::from(wallet.clone()); + if self.devnet { + self.send_devnet_transaction(&wallet).await + } else { + self.send_transaction(&wallet).await + } + } + + /// Send a transaction. + async fn send_transaction(self, wallet: &PrivateKeySigner) -> Result<()> { + let transaction_signer = EthereumWallet::from(wallet.clone()); let provider = ProviderBuilder::new() .with_recommended_fillers() .wallet(transaction_signer) @@ -36,7 +45,7 @@ impl SendCommand { // Note: it's possible for users to override the target sidecar URL // for testing and development purposes. In most cases, the sidecar will // reject a request for a slot that it is not responsible for. - let target_url = if let Some(sidecar_url) = self.override_bolt_sidecar_url { + let target_url = if let Some(sidecar_url) = &self.override_bolt_sidecar_url { // If using the override URL, we don't need to fetch the active proposers only. // we will set the next slot as the target slot. sidecar_url.clone() @@ -72,13 +81,57 @@ impl SendCommand { vec![tx_hash], target_slot, target_url.clone(), - &wallet, + wallet, ) .await?; } Ok(()) } + + /// Send a transaction on the Kurtosis devnet. + async fn send_devnet_transaction(self, wallet: &PrivateKeySigner) -> Result<()> { + let transaction_signer = EthereumWallet::from(wallet.clone()); + let el_url = self.devnet_execution_url.clone().wrap_err("missing devnet execution URL")?; + let cl_url = self.devnet_beacon_url.clone().wrap_err("missing devnet beacon URL")?; + let sidecar_url = self.devnet_sidecar_url.clone().wrap_err("missing devnet sidecar URL")?; + + let provider = ProviderBuilder::new() + .with_recommended_fillers() + .wallet(transaction_signer) + .on_http(el_url); + + // Fetch the current slot from the devnet beacon node + let slot = request_current_slot_number(&cl_url).await?; + + // Send the transaction to the devnet sidecar + for _ in 0..self.count { + let req = create_tx_request(wallet.address(), self.blob); + let raw_tx = match provider.fill(req).await.wrap_err("failed to fill transaction")? { + SendableTx::Builder(_) => bail!("expected a raw transaction"), + SendableTx::Envelope(raw) => raw.encoded_2718(), + }; + let tx_hash = B256::from(keccak256(&raw_tx)); + + send_rpc_request( + vec![hex::encode(&raw_tx)], + vec![tx_hash], + slot + 2, + sidecar_url.clone(), + wallet, + ) + .await?; + } + + Ok(()) + } +} + +async fn request_current_slot_number(beacon_url: &Url) -> Result { + let res = reqwest::get(beacon_url.join("eth/v1/beacon/headers/head")?).await?; + let res = res.json::().await?; + let slot = res.pointer("/header/message/slot").wrap_err("missing slot")?; + slot.as_u64().wrap_err("slot is not a number") } fn create_tx_request(to: Address, with_blob: bool) -> TransactionRequest { diff --git a/justfile b/justfile index 8708fd7be..83e1ea3f3 100644 --- a/justfile +++ b/justfile @@ -124,24 +124,24 @@ grafana: # manually send a preconfirmation to the bolt devnet send-preconf count='1': - cd bolt-kurtosis-client && RUST_LOG=info cargo run -- \ - --provider-url $(kurtosis port print bolt-devnet el-1-geth-lighthouse rpc) \ - --beacon-client-url $(kurtosis port print bolt-devnet cl-1-lighthouse-geth http) \ - --bolt-sidecar-url http://$(kurtosis port print bolt-devnet bolt-sidecar-1-lighthouse-geth api) \ - --private-key 53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710 \ - --slot head \ - --count {{count}} + cd bolt-cli && RUST_LOG=info cargo run -- \ + --devnet \ + --devnet.execution_url $(kurtosis port print bolt-devnet el-1-geth-lighthouse rpc) \ + --devnet.beacon_url $(kurtosis port print bolt-devnet cl-1-lighthouse-geth http) \ + --devnet.sidecar_url http://$(kurtosis port print bolt-devnet bolt-sidecar-1-lighthouse-geth api) \ + --private_key 53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710 \ + --count {{count}} # manually send a blob preconfirmation to the bolt devnet send-blob-preconf count='1': - cd bolt-kurtosis-client && RUST_LOG=info cargo run -- \ - --provider-url $(kurtosis port print bolt-devnet el-1-geth-lighthouse rpc) \ - --beacon-client-url $(kurtosis port print bolt-devnet cl-1-lighthouse-geth http) \ - --bolt-sidecar-url http://$(kurtosis port print bolt-devnet bolt-sidecar-1-lighthouse-geth api) \ - --private-key 53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710 \ - --slot head \ - --blob \ - --count {{count}} \ + cd bolt-cli && RUST_LOG=info cargo run -- \ + --devnet \ + --devnet.execution_url $(kurtosis port print bolt-devnet el-1-geth-lighthouse rpc) \ + --devnet.beacon_url $(kurtosis port print bolt-devnet cl-1-lighthouse-geth http) \ + --devnet.sidecar_url http://$(kurtosis port print bolt-devnet bolt-sidecar-1-lighthouse-geth api) \ + --private_key 53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710 \ + --blob \ + --count {{count}} # build all the docker images locally build-images: From efedd73c97f8c9e8a66d85e0100f72edfba8f070 Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Fri, 25 Oct 2024 17:26:23 +0200 Subject: [PATCH 13/85] fix for sending preconfs in devnet --- bolt-cli/src/commands/send.rs | 49 +++++++++++++++++++++++++---------- justfile | 8 +++--- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/bolt-cli/src/commands/send.rs b/bolt-cli/src/commands/send.rs index fdd2e12e0..c2b7367eb 100644 --- a/bolt-cli/src/commands/send.rs +++ b/bolt-cli/src/commands/send.rs @@ -1,5 +1,7 @@ +use std::time::Duration; + use alloy::{ - consensus::{BlobTransactionSidecar, SidecarBuilder, SimpleCoder}, + consensus::{BlobTransactionSidecar, SidecarBuilder, SimpleCoder, Transaction}, eips::eip2718::Encodable2718, network::{EthereumWallet, TransactionBuilder, TransactionBuilder4844}, primitives::{keccak256, Address, B256, U256}, @@ -66,15 +68,22 @@ impl SendCommand { let target_slot = lookahead_res[0].slot; info!("Target slot: {}", target_slot); + // Send the transactions to the Bolt sidecar + let mut next_nonce = None; for _ in 0..self.count { // generate a simple self-transfer of ETH - let req = create_tx_request(wallet.address(), self.blob); + let mut req = create_tx_request(wallet.address(), self.blob); + if let Some(next_nonce) = next_nonce { + req.set_nonce(next_nonce); + } - let raw_tx = match provider.fill(req).await.wrap_err("failed to fill transaction")? { + let (raw_tx, tx_hash) = match provider.fill(req).await.wrap_err("failed to fill")? { SendableTx::Builder(_) => bail!("expected a raw transaction"), - SendableTx::Envelope(raw) => raw.encoded_2718(), + SendableTx::Envelope(raw) => { + next_nonce = Some(raw.nonce() + 1); + (raw.encoded_2718(), *raw.tx_hash()) + } }; - let tx_hash = B256::from(keccak256(&raw_tx)); send_rpc_request( vec![hex::encode(&raw_tx)], @@ -84,6 +93,9 @@ impl SendCommand { wallet, ) .await?; + + // Sleep for a bit to avoid spamming + tokio::time::sleep(Duration::from_millis(200)).await; } Ok(()) @@ -104,14 +116,21 @@ impl SendCommand { // Fetch the current slot from the devnet beacon node let slot = request_current_slot_number(&cl_url).await?; - // Send the transaction to the devnet sidecar + // Send the transactions to the devnet sidecar + let mut next_nonce = None; for _ in 0..self.count { - let req = create_tx_request(wallet.address(), self.blob); - let raw_tx = match provider.fill(req).await.wrap_err("failed to fill transaction")? { + let mut req = create_tx_request(wallet.address(), self.blob); + if let Some(next_nonce) = next_nonce { + req.set_nonce(next_nonce); + } + + let (raw_tx, tx_hash) = match provider.fill(req).await.wrap_err("failed to fill")? { SendableTx::Builder(_) => bail!("expected a raw transaction"), - SendableTx::Envelope(raw) => raw.encoded_2718(), + SendableTx::Envelope(raw) => { + next_nonce = Some(raw.nonce() + 1); + (raw.encoded_2718(), *raw.tx_hash()) + } }; - let tx_hash = B256::from(keccak256(&raw_tx)); send_rpc_request( vec![hex::encode(&raw_tx)], @@ -121,6 +140,9 @@ impl SendCommand { wallet, ) .await?; + + // Sleep for a bit to avoid spamming + tokio::time::sleep(Duration::from_millis(200)).await; } Ok(()) @@ -130,8 +152,8 @@ impl SendCommand { async fn request_current_slot_number(beacon_url: &Url) -> Result { let res = reqwest::get(beacon_url.join("eth/v1/beacon/headers/head")?).await?; let res = res.json::().await?; - let slot = res.pointer("/header/message/slot").wrap_err("missing slot")?; - slot.as_u64().wrap_err("slot is not a number") + let slot = res.pointer("/data/header/message/slot").wrap_err("missing slot")?; + Ok(slot.as_u64().unwrap_or(slot.as_str().wrap_err("invalid slot type")?.parse()?)) } fn create_tx_request(to: Address, with_blob: bool) -> TransactionRequest { @@ -142,7 +164,8 @@ fn create_tx_request(to: Address, with_blob: bool) -> TransactionRequest { if with_blob { let sidecar = SidecarBuilder::::from_slice(b"Blobs are fun!"); let sidecar: BlobTransactionSidecar = sidecar.build().unwrap(); - req = req.with_blob_sidecar(sidecar) + req = req.with_blob_sidecar(sidecar); + req = req.with_max_fee_per_blob_gas(3_000_000); } req diff --git a/justfile b/justfile index 83e1ea3f3..8527eb23e 100644 --- a/justfile +++ b/justfile @@ -124,22 +124,22 @@ grafana: # manually send a preconfirmation to the bolt devnet send-preconf count='1': - cd bolt-cli && RUST_LOG=info cargo run -- \ + cd bolt-cli && RUST_LOG=info cargo run -- send \ --devnet \ --devnet.execution_url $(kurtosis port print bolt-devnet el-1-geth-lighthouse rpc) \ --devnet.beacon_url $(kurtosis port print bolt-devnet cl-1-lighthouse-geth http) \ --devnet.sidecar_url http://$(kurtosis port print bolt-devnet bolt-sidecar-1-lighthouse-geth api) \ - --private_key 53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710 \ + --private-key 53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710 \ --count {{count}} # manually send a blob preconfirmation to the bolt devnet send-blob-preconf count='1': - cd bolt-cli && RUST_LOG=info cargo run -- \ + cd bolt-cli && RUST_LOG=info cargo run -- send \ --devnet \ --devnet.execution_url $(kurtosis port print bolt-devnet el-1-geth-lighthouse rpc) \ --devnet.beacon_url $(kurtosis port print bolt-devnet cl-1-lighthouse-geth http) \ --devnet.sidecar_url http://$(kurtosis port print bolt-devnet bolt-sidecar-1-lighthouse-geth api) \ - --private_key 53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710 \ + --private-key 53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710 \ --blob \ --count {{count}} From 516f5f720e9d048e77225e90725c0b453a647a35 Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Mon, 28 Oct 2024 09:04:14 +0100 Subject: [PATCH 14/85] chore: rm bolt-kurtosis-client binary --- bolt-kurtosis-client/.gitignore | 2 - bolt-kurtosis-client/Cargo.lock | 4747 ---------------------- bolt-kurtosis-client/Cargo.toml | 21 - bolt-kurtosis-client/README.md | 21 - bolt-kurtosis-client/rust-toolchain.toml | 3 - bolt-kurtosis-client/rustfmt.toml | 11 - bolt-kurtosis-client/src/constants.rs | 4 - bolt-kurtosis-client/src/main.rs | 107 - bolt-kurtosis-client/src/utils.rs | 60 - 9 files changed, 4976 deletions(-) delete mode 100644 bolt-kurtosis-client/.gitignore delete mode 100644 bolt-kurtosis-client/Cargo.lock delete mode 100644 bolt-kurtosis-client/Cargo.toml delete mode 100644 bolt-kurtosis-client/README.md delete mode 100644 bolt-kurtosis-client/rust-toolchain.toml delete mode 100644 bolt-kurtosis-client/rustfmt.toml delete mode 100644 bolt-kurtosis-client/src/constants.rs delete mode 100644 bolt-kurtosis-client/src/main.rs delete mode 100644 bolt-kurtosis-client/src/utils.rs diff --git a/bolt-kurtosis-client/.gitignore b/bolt-kurtosis-client/.gitignore deleted file mode 100644 index 14ee5009d..000000000 --- a/bolt-kurtosis-client/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target/ -.env diff --git a/bolt-kurtosis-client/Cargo.lock b/bolt-kurtosis-client/Cargo.lock deleted file mode 100644 index e6bafb7c9..000000000 --- a/bolt-kurtosis-client/Cargo.lock +++ /dev/null @@ -1,4747 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "alloy" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45855eb65e9cc70294ebea1279f6d8ee0636bf2ed3897683ebbae2739975ae8c" -dependencies = [ - "alloy-consensus", - "alloy-contract", - "alloy-core", - "alloy-eips", - "alloy-genesis", - "alloy-network", - "alloy-provider", - "alloy-pubsub", - "alloy-rpc-client", - "alloy-rpc-types", - "alloy-serde", - "alloy-signer", - "alloy-signer-local", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", -] - -[[package]] -name = "alloy-chains" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1752d7d62e2665da650a36d84abbf239f812534475d51f072a49a533513b7cdd" -dependencies = [ - "num_enum", - "strum", -] - -[[package]] -name = "alloy-consensus" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58047cc851e58c26224521d1ecda466e3d746ebca0274cd5427aa660a88c353" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "serde", -] - -[[package]] -name = "alloy-contract" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa5d42d9f87896536234b0fac1a84ad9d9dc7a4b27839cac35d0899e64ddf083" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-network", - "alloy-primitives", - "alloy-provider", - "alloy-pubsub", - "alloy-rpc-types-eth", - "alloy-sol-types", - "alloy-transport", - "futures", - "futures-util", - "thiserror", -] - -[[package]] -name = "alloy-core" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "529fc6310dc1126c8de51c376cbc59c79c7f662bd742be7dc67055d5421a81b4" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-types", -] - -[[package]] -name = "alloy-dyn-abi" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413902aa18a97569e60f679c23f46a18db1656d87ab4d4e49d0e1e52042f66df" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-type-parser", - "alloy-sol-types", - "const-hex", - "itoa", - "serde", - "serde_json", - "winnow 0.6.13", -] - -[[package]] -name = "alloy-eips" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a3e14fa0d152d00bd8daf605eb74ad397efb0f54bd7155585823dddb4401e" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "derive_more", - "k256 0.13.3", - "once_cell", - "serde", - "sha2 0.10.8", -] - -[[package]] -name = "alloy-genesis" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cb76c8a3913f2466c5488f3a915e3a15d15596bdc935558c1a9be75e9ec508" -dependencies = [ - "alloy-primitives", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-json-abi" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc05b04ac331a9f07e3a4036ef7926e49a8bf84a99a1ccfc7e2ab55a5fcbb372" -dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-rpc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e76a9feec2352c78545d1a37415699817bae8dc41654bd1bfe57d6cdd5433bd" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3223d71dc78f464b2743418d0be8b5c894313e272105a6206ad5e867d67b3ce2" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "auto_impl", - "futures-utils-wasm", - "thiserror", -] - -[[package]] -name = "alloy-primitives" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "hex-literal", - "itoa", - "k256 0.13.3", - "keccak-asm", - "proptest", - "rand 0.8.5", - "ruint", - "serde", - "tiny-keccak", -] - -[[package]] -name = "alloy-provider" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29da7457d853cb8199ec04b227d5d2ef598be3e59fc2bbad70c8be213292f32" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network", - "alloy-primitives", - "alloy-pubsub", - "alloy-rpc-client", - "alloy-rpc-types-eth", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru", - "pin-project", - "reqwest 0.12.5", - "serde", - "serde_json", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "alloy-pubsub" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64acfec654ade392cecfa9bba0408eb2a337d55f1b857925da79970cb70f3d6" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "bimap", - "futures", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a43b18702501396fa9bcdeecd533bc85fac75150d308fc0f6800a01e6234a003" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83524c1f6162fcb5b0decf775498a125066c86dda6066ed609531b0e912f85a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a9e609524fa31c2c70eb24c0da60796809193ad4787a6dfe6d0db0d3ac112d" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-pubsub", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", - "futures", - "pin-project", - "reqwest 0.12.5", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-rpc-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e5d76f1e8b22f48b7b8f985782b68e7eb3938780e50e8b646a53e41a598cdf5" -dependencies = [ - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-rpc-types-engine" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73445fbc5c02258e3d0d977835c92366a4d91545fd456c3fc8601c61810bc9f6" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-eth", - "alloy-serde", - "jsonwebtoken", - "rand 0.8.5", - "serde", - "thiserror", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "605fa8462732bb8fd0645a9941e12961e079d45ae6a44634c826f8229c187bdf" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "itertools 0.13.0", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "alloy-serde" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c5b9057acc02aee1b8aac2b5a0729cb0f73d080082c111313e5d1f92a96630" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37f10592696f4ab8b687d5a8ab55e998a14ea0ca5f8eb20ad74a96ad671bb54a" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "elliptic-curve 0.13.8", - "k256 0.13.3", - "thiserror", -] - -[[package]] -name = "alloy-signer-local" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b537f3e55f30753578f4623d5f66ddad8fa582af3fa6b15bad23dd1b9775228" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "async-trait", - "k256 0.13.3", - "rand 0.8.5", - "thiserror", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" -dependencies = [ - "alloy-json-abi", - "alloy-sol-macro-input", - "const-hex", - "heck", - "indexmap 2.2.6", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.71", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" -dependencies = [ - "alloy-json-abi", - "const-hex", - "dunce", - "heck", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.71", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-type-parser" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbcba3ca07cf7975f15d871b721fb18031eec8bce51103907f6dcce00b255d98" -dependencies = [ - "serde", - "winnow 0.6.13", -] - -[[package]] -name = "alloy-sol-types" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-macro", - "const-hex", - "serde", -] - -[[package]] -name = "alloy-transport" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b44b0f6f4a2593b258fa7b6cae8968e6a4c404d9ef4f5bc74401f2d04fa23fa" -dependencies = [ - "alloy-json-rpc", - "base64 0.22.1", - "futures-util", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror", - "tokio", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport-http" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d8f1eefa8cb9e7550740ee330feba4fed303a77ad3085707546f9152a88c380" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "reqwest 0.12.5", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport-ipc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31007c56dc65bd81392112dda4a14c20ac7e30bb4cb2e9176192e8d9fab1983f" -dependencies = [ - "alloy-json-rpc", - "alloy-pubsub", - "alloy-transport", - "bytes", - "futures", - "interprocess", - "pin-project", - "serde_json", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "alloy-transport-ws" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15ccc1c8f8ae415e93ec0e7851bd4cdf4afdd48793d13a91b860317da1f36104" -dependencies = [ - "alloy-pubsub", - "alloy-transport", - "futures", - "http 1.1.0", - "rustls", - "serde_json", - "tokio", - "tokio-tungstenite", - "tracing", - "ws_stream_wasm", -] - -[[package]] -name = "anstream" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" - -[[package]] -name = "anstyle-parse" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "anyhow" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" - -[[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" -dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.0", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-std" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-sse" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6fa871e4334a622afd6bb2f611635e8083a6f5e2936c0f90f37c7ef9856298" -dependencies = [ - "async-channel", - "futures-lite", - "http-types", - "log", - "memchr", - "pin-project-lite", -] - -[[package]] -name = "async-stream" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "async-trait" -version = "0.1.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version 0.4.0", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "auto_impl" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "backtrace" -version = "0.3.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "beacon-api-client" -version = "0.1.0" -source = "git+https://github.com/ralexstokes/ethereum-consensus?rev=cf3c404#cf3c404043230559660810bc0c9d6d5a8498d819" -dependencies = [ - "clap", - "ethereum-consensus", - "http 0.2.12", - "itertools 0.10.5", - "mev-share-sse", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "bimap" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" - -[[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.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[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.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blst" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "bolt-spammer" -version = "0.1.0" -dependencies = [ - "alloy", - "beacon-api-client", - "clap", - "dotenvy", - "eyre", - "rand 0.8.5", - "reqwest 0.12.5", - "serde", - "serde_json", - "tokio", - "tracing", - "tracing-subscriber", - "url", -] - -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[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.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf100c4cea8f207e883ff91ca886d621d8a166cb04971dfaa9bb8fd99ed95df" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "serde", -] - -[[package]] -name = "cc" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "num-traits", -] - -[[package]] -name = "clap" -version = "4.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64acc1846d54c1fe936a78dc189c34e28d3f5afc348403f28ecf53660b9b8462" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8393d67ba2e7bfaf28a23458e4e2b543cc73a99595511eb207fdb8aede942" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "clap_lex" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" - -[[package]] -name = "colorchoice" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-hex" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" -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 = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "core2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" -dependencies = [ - "memchr", -] - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[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.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "0.99.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.4.0", - "syn 2.0.71", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "doctest-file" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der 0.7.9", - "digest 0.10.7", - "elliptic-curve 0.13.8", - "rfc6979 0.4.0", - "signature 2.2.0", - "spki 0.7.3", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.7", - "ff 0.12.1", - "generic-array", - "group 0.12.1", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle", - "zeroize", -] - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.5", - "digest 0.10.7", - "ff 0.13.0", - "generic-array", - "group 0.13.0", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sec1 0.7.3", - "subtle", - "zeroize", -] - -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enr" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fa0a0be8915790626d5759eb51fe47435a8eac92c2f212bd2da9aa7f30ea56" -dependencies = [ - "base64 0.13.1", - "bs58", - "bytes", - "hex", - "k256 0.11.6", - "log", - "rand 0.8.5", - "rlp", - "serde", - "sha3", - "zeroize", -] - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-consensus" -version = "0.1.1" -source = "git+https://github.com/ralexstokes/ethereum-consensus?rev=cf3c404#cf3c404043230559660810bc0c9d6d5a8498d819" -dependencies = [ - "blst", - "bs58", - "c-kzg", - "enr", - "hex", - "integer-sqrt", - "multiaddr", - "multihash", - "rand 0.8.5", - "serde", - "serde_json", - "serde_yaml", - "sha2 0.10.8", - "ssz_rs", - "thiserror", - "tokio", - "tokio-stream", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec", - "bytes", - "chrono", - "const-hex", - "elliptic-curve 0.13.8", - "ethabi", - "generic-array", - "k256 0.13.3", - "num_enum", - "open-fastrlp", - "rand 0.8.5", - "rlp", - "serde", - "serde_json", - "strum", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[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 = "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 = "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-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[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.71", -] - -[[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-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 = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "gimli" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff 0.13.0", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.2.6", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.1.0", - "indexmap 2.2.6", - "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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.1.0", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "pin-project-lite", -] - -[[package]] -name = "http-types" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad" -dependencies = [ - "anyhow", - "async-channel", - "base64 0.13.1", - "futures-lite", - "infer", - "pin-project-lite", - "rand 0.7.3", - "serde", - "serde_json", - "serde_qs", - "serde_urlencoded", - "url", -] - -[[package]] -name = "httparse" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.5", - "http 1.1.0", - "http-body 1.0.1", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" -dependencies = [ - "futures-util", - "http 1.1.0", - "hyper 1.4.1", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.30", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.4.1", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[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", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown 0.14.5", -] - -[[package]] -name = "infer" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac" - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "integer-sqrt" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" -dependencies = [ - "num-traits", -] - -[[package]] -name = "interprocess" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67bafc2f5dbdad79a6d925649758d5472647b416028099f0b829d1b67fdd47d3" -dependencies = [ - "doctest-file", - "futures-core", - "libc", - "recvmsg", - "tokio", - "widestring", - "windows-sys 0.52.0", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonwebtoken" -version = "9.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" -dependencies = [ - "base64 0.21.7", - "js-sys", - "pem", - "ring", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if", - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.8", -] - -[[package]] -name = "k256" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" -dependencies = [ - "cfg-if", - "ecdsa 0.16.9", - "elliptic-curve 0.13.8", - "once_cell", - "sha2 0.10.8", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.155" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "lru" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "mev-share-sse" -version = "0.1.6" -source = "git+https://github.com/paradigmxyz/mev-share-rs?rev=9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8#9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8" -dependencies = [ - "async-sse", - "bytes", - "ethers-core", - "futures-util", - "http-types", - "pin-project-lite", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", -] - -[[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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - -[[package]] -name = "multiaddr" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c580bfdd8803cce319b047d239559a22f809094aaea4ac13902a1fdcfcd4261" -dependencies = [ - "arrayref", - "bs58", - "byteorder", - "data-encoding", - "multihash", - "percent-encoding", - "serde", - "static_assertions", - "unsigned-varint", - "url", -] - -[[package]] -name = "multihash" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc" -dependencies = [ - "core2", - "digest 0.10.7", - "multihash-derive", - "sha2 0.10.8", - "unsigned-varint", -] - -[[package]] -name = "multihash-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" -dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", -] - -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "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.71", -] - -[[package]] -name = "object" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[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.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" -dependencies = [ - "bitflags 2.6.0", - "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.71", -] - -[[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.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parity-scale-codec" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" -dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pem" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" -dependencies = [ - "base64 0.22.1", - "serde", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pest" -version = "2.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version 0.4.0", -] - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[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.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der 0.7.9", - "spki 0.7.3", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[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 = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" -dependencies = [ - "thiserror", - "toml", -] - -[[package]] -name = "proc-macro-crate" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.6.0", - "lazy_static", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -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.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[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 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -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 = "recvmsg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" - -[[package]] -name = "redox_syscall" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "regex" -version = "1.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" - -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "winreg 0.50.0", -] - -[[package]] -name = "reqwest" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.4.5", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.4.1", - "hyper-rustls", - "hyper-tls 0.6.0", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 2.1.2", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.1", - "system-configuration", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg 0.52.0", -] - -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac", - "zeroize", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.15", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[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 = "ruint" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp", - "num-bigint", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand 0.8.5", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver 1.0.23", -] - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.23.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.102.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "scale-info" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" -dependencies = [ - "cfg-if", - "derive_more", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" -dependencies = [ - "proc-macro-crate 3.1.0", - "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 = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array", - "pkcs8 0.9.0", - "subtle", - "zeroize", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct 0.2.0", - "der 0.7.9", - "generic-array", - "pkcs8 0.10.2", - "subtle", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - -[[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.204" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.204" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "serde_json" -version = "1.0.120" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_qs" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6" -dependencies = [ - "percent-encoding", - "serde", - "thiserror", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" -dependencies = [ - "indexmap 1.9.3", - "ryu", - "serde", - "yaml-rust", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "sha3-asm" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" -dependencies = [ - "cc", - "cfg-if", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 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", - "num-traits", - "thiserror", - "time", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der 0.7.9", -] - -[[package]] -name = "ssz_rs" -version = "0.9.0" -source = "git+https://github.com/ralexstokes/ssz-rs?rev=84ef2b71aa004f6767420badb42c902ad56b8b72#84ef2b71aa004f6767420badb42c902ad56b8b72" -dependencies = [ - "alloy-primitives", - "bitvec", - "serde", - "sha2 0.9.9", - "ssz_rs_derive", -] - -[[package]] -name = "ssz_rs_derive" -version = "0.9.0" -source = "git+https://github.com/ralexstokes/ssz-rs?rev=84ef2b71aa004f6767420badb42c902ad56b8b72#84ef2b71aa004f6767420badb42c902ad56b8b72" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.71", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[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.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" - -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", -] - -[[package]] -name = "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.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand 2.1.0", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "thiserror" -version = "1.0.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -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.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -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.38.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" -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.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[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.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" -dependencies = [ - "futures-util", - "log", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" - -[[package]] -name = "toml_edit" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" -dependencies = [ - "indexmap 2.2.6", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "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.71", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "nu-ansi-term", - "sharded-slab", - "smallvec", - "thread_local", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 1.1.0", - "httparse", - "log", - "rand 0.8.5", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "unsigned-varint" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - -[[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.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[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.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.71", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-streams" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "widestring" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" -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 = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -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 0.4.0", - "send_wrapper", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", -] diff --git a/bolt-kurtosis-client/Cargo.toml b/bolt-kurtosis-client/Cargo.toml deleted file mode 100644 index 538305403..000000000 --- a/bolt-kurtosis-client/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "bolt-spammer" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -tokio = { version = "1.37.0", features = ["full"] } -eyre = "0.6.12" -rand = "0.8.5" -clap = { version = "4.5.4", features = ["derive", "env"] } -tracing = "0.1.40" -tracing-subscriber = "0.3.18" -serde = { version = "1.0.197", features = ["derive"] } -serde_json = "1.0.115" -reqwest = "0.12.3" -beacon-api-client = { git = "https://github.com/ralexstokes/ethereum-consensus", rev = "cf3c404" } -dotenvy = "0.15.7" -alloy = { version = "0.2.0", features = ["full"] } -url = "2.5.2" diff --git a/bolt-kurtosis-client/README.md b/bolt-kurtosis-client/README.md deleted file mode 100644 index 743a65f9e..000000000 --- a/bolt-kurtosis-client/README.md +++ /dev/null @@ -1,21 +0,0 @@ -## A preconfirmation sender for the Kurtosis devnet - -To run the tool, make sure to set the following environment variables in a `.env` file: - -```text -EL_PROVIDER_URL=https://rpc.helder-devnets.xyz -BEACON_CLIENT_URL= -REGISTRY_ADDRESS=0xdF11D829eeC4C192774F3Ec171D822f6Cb4C14d9 -PRIVATE_KEY= -REGISTRY_ABI_PATH=./registry_abi.json -``` - -This template can be found in the `env.example` file. - -Then, just run the tool with `cargo run`. - -It will fetch all the validators of the current epoch, and try to send a -preconfirmation to the first one registered on the Bolt registry. - -If no validators are found, the program will gracefully exit. -Please try again in the next epoch! diff --git a/bolt-kurtosis-client/rust-toolchain.toml b/bolt-kurtosis-client/rust-toolchain.toml deleted file mode 100644 index bbf217f21..000000000 --- a/bolt-kurtosis-client/rust-toolchain.toml +++ /dev/null @@ -1,3 +0,0 @@ -[toolchain] -channel = "1.81.0" -profile = "default" diff --git a/bolt-kurtosis-client/rustfmt.toml b/bolt-kurtosis-client/rustfmt.toml deleted file mode 100644 index 68c3c9303..000000000 --- a/bolt-kurtosis-client/rustfmt.toml +++ /dev/null @@ -1,11 +0,0 @@ -reorder_imports = true -imports_granularity = "Crate" -use_small_heuristics = "Max" -comment_width = 100 -wrap_comments = true -binop_separator = "Back" -trailing_comma = "Vertical" -trailing_semicolon = false -use_field_init_shorthand = true -format_code_in_doc_comments = true -doc_comment_code_block_width = 100 diff --git a/bolt-kurtosis-client/src/constants.rs b/bolt-kurtosis-client/src/constants.rs deleted file mode 100644 index 4491cdaed..000000000 --- a/bolt-kurtosis-client/src/constants.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub const SLOTS_PER_EPOCH: u64 = 32; -pub const NOICE_GAS_PRICE: u128 = 6_942_000_000u128; // 6.9420 gwei -pub const DEAD_ADDRESS: &str = "0xdeaDDeADDEaDdeaDdEAddEADDEAdDeadDEADDEaD"; -pub const KURTOSIS_CHAIN_ID: u64 = 3151908; diff --git a/bolt-kurtosis-client/src/main.rs b/bolt-kurtosis-client/src/main.rs deleted file mode 100644 index dae9b84b6..000000000 --- a/bolt-kurtosis-client/src/main.rs +++ /dev/null @@ -1,107 +0,0 @@ -use alloy::{ - eips::eip2718::Encodable2718, - hex, - network::{EthereumWallet, TransactionBuilder}, - primitives::keccak256, - providers::{Provider, ProviderBuilder}, - signers::{local::PrivateKeySigner, Signer}, -}; -use beacon_api_client::mainnet::Client as BeaconApiClient; -use clap::Parser; -use eyre::Result; -use reqwest::Url; -use tracing::info; - -pub mod constants; -pub mod utils; - -use utils::{current_slot, generate_random_blob_tx, generate_random_tx, prepare_rpc_request}; - -#[derive(Parser)] -struct Opts { - #[clap(short = 'p', long, default_value = "http://localhost:8545")] - provider_url: Url, - #[clap(short = 'c', long, default_value = "http://localhost:4000")] - beacon_client_url: Url, - #[clap(short = 'b', long)] - bolt_sidecar_url: String, - #[clap(short = 'k', long)] - private_key: String, - #[clap(short = 'n', long)] - nonce: Option, - #[clap(short = 'B', long, default_value_t = false)] - blob: bool, - #[clap(short = 's', long, default_value = "head")] - slot: String, - #[clap(short = 'C', long, default_value_t = 1)] - count: u64, -} - -#[tokio::main] -async fn main() -> Result<()> { - tracing_subscriber::fmt::init(); - info!("starting bolt-spammer"); - - let opts = Opts::parse(); - - let wallet: PrivateKeySigner = opts.private_key.parse().expect("should parse private key"); - - let sender = wallet.address(); - let transaction_signer: EthereumWallet = wallet.clone().into(); - let provider = ProviderBuilder::new().on_http(opts.provider_url); - - let beacon_api_client = BeaconApiClient::new(opts.beacon_client_url); - - let current_slot = current_slot(&beacon_api_client).await?; - let target_slot = if opts.slot == "head" { current_slot + 2 } else { opts.slot.parse()? }; - - for i in 0..opts.count { - let mut tx = if opts.blob { generate_random_blob_tx() } else { generate_random_tx() }; - tx.set_from(sender); - tx.set_nonce(provider.get_transaction_count(sender).await? + i); - - let tx_signed = tx.build(&transaction_signer).await?; - let tx_hash = tx_signed.tx_hash(); - let tx_rlp = hex::encode(tx_signed.encoded_2718()); - - let message_digest = { - let mut data = Vec::new(); - data.extend_from_slice(tx_hash.as_slice()); - data.extend_from_slice(&target_slot.to_le_bytes()); - keccak256(data) - }; - - let signature = wallet.sign_hash(&message_digest).await?; - let signature = hex::encode(signature.as_bytes()); - let signature_header = format!("{}:0x{}", wallet.address(), &signature); - - let request = prepare_rpc_request( - "bolt_requestInclusion", - vec![serde_json::json!({ - "slot": target_slot, - "txs": vec![tx_rlp], - })], - ); - - info!("Transaction hash: {}", tx_hash); - info!("body: {}", trim_zeroes(serde_json::to_string(&request)?)); - - let client = reqwest::Client::new(); - let response = client - .post(&opts.bolt_sidecar_url) - .header("content-type", "application/json") - .header("x-bolt-signature", signature_header) - .body(serde_json::to_string(&request)?) - .send() - .await?; - - let res = trim_zeroes(response.text().await?); - info!("Response: {:?}", res); - } - - Ok(()) -} - -fn trim_zeroes(s: impl Into) -> String { - s.into().replace(&"0".repeat(32), ".").replace(&".".repeat(4), "") -} diff --git a/bolt-kurtosis-client/src/utils.rs b/bolt-kurtosis-client/src/utils.rs deleted file mode 100644 index 1d9f2a7a1..000000000 --- a/bolt-kurtosis-client/src/utils.rs +++ /dev/null @@ -1,60 +0,0 @@ -use std::str::FromStr; - -use alloy::{ - consensus::{BlobTransactionSidecar, SidecarBuilder, SimpleCoder}, - network::TransactionBuilder, - primitives::{Address, U256}, - rpc::types::TransactionRequest, -}; -use beacon_api_client::{mainnet::Client as BeaconApiClient, BlockId}; -use eyre::Result; -use rand::{thread_rng, Rng}; -use serde_json::Value; - -use crate::constants::{DEAD_ADDRESS, KURTOSIS_CHAIN_ID, NOICE_GAS_PRICE}; - -/// Generates random ETH transfer to `DEAD_ADDRESS` with a random payload. -pub fn generate_random_tx() -> TransactionRequest { - TransactionRequest::default() - .with_to(Address::from_str(DEAD_ADDRESS).unwrap()) - .with_chain_id(KURTOSIS_CHAIN_ID) - .with_value(U256::from(thread_rng().gen_range(1..100))) - .with_gas_limit(21_000u128) - .with_gas_price(NOICE_GAS_PRICE) -} - -/// Generate random transaction with blob (eip4844) -pub fn generate_random_blob_tx() -> TransactionRequest { - let random_bytes = thread_rng().gen::<[u8; 32]>(); - let sidecar: SidecarBuilder = SidecarBuilder::from_slice(random_bytes.as_slice()); - let sidecar: BlobTransactionSidecar = sidecar.build().unwrap(); - - let dead_address = Address::from_str(DEAD_ADDRESS).unwrap(); - - TransactionRequest::default() - .with_to(dead_address) - .with_chain_id(KURTOSIS_CHAIN_ID) - .with_value(U256::from(100)) - .with_max_fee_per_blob_gas(100u128) - .max_fee_per_gas(NOICE_GAS_PRICE) - .max_priority_fee_per_gas(NOICE_GAS_PRICE) - .with_gas_limit(42_000u128) - .with_blob_sidecar(sidecar) - .with_input(random_bytes) -} - -pub fn prepare_rpc_request(method: &str, params: Vec) -> Value { - serde_json::json!({ - "id": "1", - "jsonrpc": "2.0", - "method": method, - "params": params, - }) -} - -/// Returns the current slot -pub async fn current_slot(beacon_api_client: &BeaconApiClient) -> Result { - let current_slot = - beacon_api_client.get_beacon_header(BlockId::Head).await?.header.message.slot; - Ok(current_slot) -} From 4470c95c55b06470095f02ef57b3b5a75a4e0125 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Mon, 28 Oct 2024 11:04:58 +0100 Subject: [PATCH 15/85] fix: avs.json --- bolt-contracts/docs/admin/avs.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bolt-contracts/docs/admin/avs.json b/bolt-contracts/docs/admin/avs.json index 8461c6510..0ec66cdf1 100644 --- a/bolt-contracts/docs/admin/avs.json +++ b/bolt-contracts/docs/admin/avs.json @@ -2,6 +2,6 @@ "name": "Bolt Protocol", "website": "https://boltprotocol.xyz", "description": "Bolt Protocol enables proposers to make credible commitments about their blocks.", - "logo": "http://boltprotocol.xyz/wp-content/uploads/2024/07/Bolt-Logo.png", + "logo": "https://boltprotocol.xyz/wp-content/uploads/2024/07/Bolt-Logo.png", "twitter": "https://twitter.com/boltprotocol_" -} \ No newline at end of file +} From b5f67ba8d8d8b0548118698b45ebd3c6f853cf27 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 15 Oct 2024 12:13:09 +0200 Subject: [PATCH 16/85] chore(testnet): holesky launch folder stub --- testnets/holesky/README.md | 106 +++ testnets/holesky/cb-bolt-config.toml | 158 ++++ .../grafana/dashboards/bolt_dashboard.json | 238 +++++ .../holesky/grafana/dashboards/dashboard.json | 803 +++++++++++++++++ .../holesky/grafana/dashboards/dashboards.yml | 13 + .../grafana/dashboards/system_metrics.json | 853 ++++++++++++++++++ .../grafana/datasources/datasources.yml | 11 + testnets/holesky/keys.json | 4 + testnets/holesky/prometheus.yml | 8 + testnets/holesky/targets.json | 34 + testnets/holesky/update-grafana.sh | 5 + 11 files changed, 2233 insertions(+) create mode 100644 testnets/holesky/README.md create mode 100644 testnets/holesky/cb-bolt-config.toml create mode 100644 testnets/holesky/grafana/dashboards/bolt_dashboard.json create mode 100644 testnets/holesky/grafana/dashboards/dashboard.json create mode 100644 testnets/holesky/grafana/dashboards/dashboards.yml create mode 100644 testnets/holesky/grafana/dashboards/system_metrics.json create mode 100644 testnets/holesky/grafana/datasources/datasources.yml create mode 100644 testnets/holesky/keys.json create mode 100644 testnets/holesky/prometheus.yml create mode 100644 testnets/holesky/targets.json create mode 100755 testnets/holesky/update-grafana.sh diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md new file mode 100644 index 000000000..c031285f3 --- /dev/null +++ b/testnets/holesky/README.md @@ -0,0 +1,106 @@ +# Holesky Launch Instructions + +## Components + +The components that need to run to test Bolt on Holesky are: + +- A synced execution client +- A synced beacon node +- Active validators +- Commit-Boost with Bolt configuration + +## Setup + +### Commit-Boost + +#### Installation + +To install the `commit-boost` CLI with `cargo`: + +```bash +# Use specific commit hash to ensure compatibility +cargo install --locked --git https://github.com/Commit-Boost/commit-boost-client --rev aed00e8 commit-boost + +# Test installation +commit-boost --version +``` + +#### Configuration + +A commit-boost configuration file with Bolt support is provided at +[`cb-bolt-config.toml`](./cb-bolt-config.toml). This file has support for the +custom PBS module ([bolt-boost](../../bolt-boost)) that implements the +[constraints-API](https://chainbound.github.io/bolt-docs/api/builder), as well +as the [bolt-sidecar](../../bolt-sidecar) module. This file can be used as a +template for your own configuration. + +The important fields to configure are under the `[modules.env]` section of the +`BOLT` module, which contain the environment variables to configure the bolt +sidecar: + +```toml +[modules.env] +BOLT_SIDECAR_CHAIN = "holesky" + +BOLT_SIDECAR_CONSTRAINTS_API = "http://cb_pbs:18550" # The address of the PBS module (static) +BOLT_SIDECAR_BEACON_API = "" +BOLT_SIDECAR_EXECUTION_API = "" +BOLT_SIDECAR_ENGINE_API = "" # The execution layer engine API endpoint +BOLT_SIDECAR_JWT_HEX = "" # The engine JWT used to authenticate with the engine API +BOLT_SIDECAR_BUILDER_PROXY_PORT = "18551" # The port on which the sidecar builder-API will listen on. This is what your beacon node should connect to. +BOLT_SIDECAR_FEE_RECIPIENT = "" # The fee recipient +BOLT_SIDECAR_VALIDATOR_INDEXES = "" # The active validator indexes (can be defined as a comma-separated list, or a range) + # e.g. "0,1,2,3,4" or "0..4", or a combination of both +``` + +To initialize commit-boost, run the following command: + +```bash +commit-boost init --config cb-bolt-config.toml +``` + +This will create 3 files: + +- `cb.docker-compose.yml`: which contains the full setup of the Commit-Boost services +- `.cb.env`: with local env variables, including JWTs for modules +- `target.json`: which enables dynamic discovery of services for metrics scraping via Prometheus + +#### Running + +The final step is to run the Commit-Boost services. This can be done with the following command: + +```bash +commit-boost start --docker cb.docker-compose.yml --env .cb.env +``` + +This will run all modules in Docker containers. + +> [!IMPORTANT] +> bolt-boost will be exposed at `pbs.port` (18551 by default, set with `BOLT_SIDECAR_BUILDER_PROXY_PORT`), and your beacon node MUST be configured +> to point the `builder-api` to this port for Bolt to work. + +### Bolt Sidecar + +WIP + +### Observability + +commit-boost comes with various observability tools, such as Prometheus, cadvisor, and Grafana. It also comes with some pre-built dashboards, +which can be found in the `grafana` directory. + +To update these dashboards, run the following command: + +```bash +./update-grafana.sh +``` + +In this directory, you can also find a Bolt dashboard, which will be launched alongside the other dashboards. + +### Validators + +Validators must be configured to always prefer builder proposals over their own. Refer to client documentation for the specific configuration flags. +**If this is not set, it could lead to commitment faults**. + +#### Registration + +WIP diff --git a/testnets/holesky/cb-bolt-config.toml b/testnets/holesky/cb-bolt-config.toml new file mode 100644 index 000000000..be4e35002 --- /dev/null +++ b/testnets/holesky/cb-bolt-config.toml @@ -0,0 +1,158 @@ +# The main configuration file for the Commit-Boost sidecar. +# Some fields are optional and can be omitted, in which case the default value, if present, will be used. + +# Chain spec id. Supported values: Mainnet, Holesky, Helder +chain = "Holesky" + +# Configuration for the PBS module +[pbs] +# Docker image to use for the PBS module. +# BOLT: We use the bolt-boost PBS module here. +docker_image = "ghcr.io/chainbound/bolt-boost:v0.3.0-alpha-rc.1" +# Whether to enable the PBS module to request signatures from the Signer module (not used in the default PBS image) +# OPTIONAL, DEFAULT: false +with_signer = false +# Port to receive BuilderAPI calls from beacon node +port = 18550 +# Whether to forward `status` calls to relays or skip and return 200 +# OPTIONAL, DEFAULT: true +relay_check = true +# Timeout in milliseconds for the `get_header` call to relays. Note that the CL has also a timeout (e.g. 1 second) so +# this should be lower than that, leaving some margin for overhead +# OPTIONAL, DEFAULT: 950 +timeout_get_header_ms = 950 +# Timeout in milliseconds for the `submit_blinded_block` call to relays. +# OPTIONAL, DEFAULT: 4000 +timeout_get_payload_ms = 4000 +# Timeout in milliseconds for the `register_validator` call to relays. +# OPTIONAL, DEFAULT: 3000 +timeout_register_validator_ms = 3000 +# Whether to skip signature verification of headers against the relay pubkey +# OPTIONAL, DEFAULT: false +skip_sigverify = false +# Minimum bid in ETH that will be accepted from `get_header` +# OPTIONAL, DEFAULT: 0.0 +min_bid_eth = 0.0 +# List of URLs of relay monitors to send registrations to +# OPTIONAL +relay_monitors = [] +# How late in milliseconds in the slot is "late". This impacts the `get_header` requests, by shortening timeouts for `get_header` calls to +# relays and make sure a header is returned within this deadline. If the request from the CL comes later in the slot, then fetching headers is skipped +# to force local building and miniminzing the risk of missed slots. See also the timing games section below +# OPTIONAL, DEFAULT: 2000 +late_in_slot_time_ms = 1000 + +# The PBS module needs one or more [[relays]] as defined below. +[[relays]] +# Relay ID to use in telemetry +# OPTIONAL, DEFAULT: URL hostname +id = "example-relay" +# Relay URL in the format scheme://pubkey@host +url = "http://0xa1cec75a3f0661e99299274182938151e8433c61a19222347ea1313d839229cb4ce4e3e5aa2bdeb71c8fcf1b084963c2@abc.xyz" +# Headers to send with each request for this relay +# OPTIONAL +# headers = { X-MyCustomHeader = "MyCustomValue" } +# Whether to enable timing games, as tuned by `target_first_request_ms` and `frequency_get_header_ms`. +# These values should be carefully chosen for each relay, as each relay has different latency and timing games setups. +# They should only be used by advanced users, and if mis-configured can result in unforeseen effects, e.g. fetching a lower header value, +# or getting a temporary IP ban. +# +# EXAMPLES +# Assuming: timeout_get_header_ms = 950, frequency_get_header_ms = 300, target_first_request_ms = 200, late_in_slot_time_ms = 2000 +# +# 1) CL request comes at 100ms in the slot (max timeout 1050ms in the slot), then: +# - sleep for 100ms +# - send request at 200ms with 850ms timeout +# - send request at 500ms with 550ms timeout +# - send request at 800ms with 250ms timeout +# 2) CL request comes at 1500ms in the slot (max timeout 2000ms in the slot), then: +# - send request at 1500ms with 500ms timeout +# - send request at 1800ms with 200ms timeout +# 3) CL request comes 2500ms in the slot then: +# - return 204 and force local build +# +# OPTIONAL, DEFAULT: false +enable_timing_games = false +# Target time in slot when to send the first header request +# OPTIONAL +target_first_request_ms = 200 +# Frequency in ms to send get_header requests +# OPTIONAL +frequency_get_header_ms = 300 + +# Configuration for the Signer Module, only required if any `commit` module is present, or if `pbs.with_signer = true` +# OPTIONAL +[signer] +# Docker image to use for the Signer module. +# OPTIONAL, DEFAULT: ghcr.io/commit-boost/signer:latest +docker_image = "commitboost_signer" +# Configuration for how the Signer module should load validator keys. Currently two types of loaders are supported: +# - File: load keys from a plain text file (unsafe, use only for testing purposes) +# - ValidatorsDir: load keys from a `keys` and `secrets` folder (ERC-2335 style keystores as used in Lighthouse) +[signer.loader] +# File: path to the keys file +key_path = "./keys.json" +# ValidatorsDir: path to the keys directory +# keys_path = "" +# ValidatorsDir: path to the secrets directory +# secrets_path = "" + +# Commit-Boost can optionally run "modules" which extend the capabilities of the sidecar. +# Currently, two types of modules are supported: +# - "commit": modules which request commitment signatures from the validator keys +# - "events": modules which callback to BuilderAPI events as triggered from the PBS modules, used e.g. for monitoring +# If any "commit" module is present, then the [signer] section should also be configured +# OPTIONAL +[[modules]] +# Unique ID of the module +id = "BOLT" +# Type of the module. Supported values: commit, events +type = "commit" +# Docker image of the module +docker_image = "ghcr.io/chainbound/bolt-sidecar:v0.3.0-alpha-rc.1" + +[modules.env] +BOLT_SIDECAR_CHAIN = "holesky" + +BOLT_SIDECAR_CONSTRAINTS_API = "http://cb_pbs:18550" # The address of the PBS module +BOLT_SIDECAR_BEACON_API = "http://100.85.200.41:4400" +BOLT_SIDECAR_EXECUTION_API = "http://100.85.200.41:4485" +BOLT_SIDECAR_ENGINE_API = "http://100.85.200.41:4451" # The execution layer engine API endpoint +BOLT_SIDECAR_JWT_HEX = "89732cef77d7e9a20021ee8f419dbbb51bdf7f60586932c272ddef02e70cb755" # The engine JWT +BOLT_SIDECAR_BUILDER_PROXY_PORT = "18551" # The port on which the sidecar builder-API will listen on. This is what your beacon node should connect to. +BOLT_SIDECAR_FEE_RECIPIENT = "0x0000000000000000000000000000000000000000" # The fee recipient +BOLT_SIDECAR_VALIDATOR_INDEXES = "1..2" # The active validator indexes + +BOLT_SIDECAR_METRICS_PORT = "10000" + +# Configuration for how metrics should be collected and scraped +# OPTIONAL, skip metrics collection if missing +[metrics] +# Path to a `prometheus.yml` file to use in Prometheus. If using a custom config file, be sure to add a +# file discovery section as follows: +# ```yml +# file_sd_configs: +# - files: +# - /etc/prometheus/targets.json +# ``` +# and use the `targets.json` file generated by `commit-boost init` +prometheus_config = "./prometheus.yml" +# Whether to start Grafana with built-in dashboards +# OPTIONAL, DEFAULT: true +use_grafana = true +# Whether to start cadvisor for system monitoring +# OPTIONAL, DEFAULT: true +use_cadvisor = true + +# Configuration for how logs should be collected and stored +# OPTIONAL, info to stdout if missing +[logs] +# Path to the log directory +# OPTIONAL, DEFAULT: /var/logs/commit-boost +log_dir_path = "./logs" +# Log level. Supported values: trace, debug, info, warn, error +# OPTIONAL, DEFAULT: debug to file, info to stdout +log_level = "debug" +# Maximum number of log files to keep +# OPTIONAL +max_log_files = 30 diff --git a/testnets/holesky/grafana/dashboards/bolt_dashboard.json b/testnets/holesky/grafana/dashboards/bolt_dashboard.json new file mode 100644 index 000000000..886ddfe02 --- /dev/null +++ b/testnets/holesky/grafana/dashboards/bolt_dashboard.json @@ -0,0 +1,238 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Metrics related to the bolt-sidecar and bolt-boost.", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 3, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 2, + "panels": [], + "title": "Bolt sidecar", + "type": "row" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 1, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "bolt_sidecar_latest_head", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Latest head", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 4, + "panels": [], + "title": "Bolt boost", + "type": "row" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 10 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "cb_pbs_constraints_cache_size", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Constraints cache size", + "type": "timeseries" + } + ], + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Bolt Metrics", + "uid": "edxnwlpgaw934c", + "version": 3, + "weekStart": "" +} diff --git a/testnets/holesky/grafana/dashboards/dashboard.json b/testnets/holesky/grafana/dashboards/dashboard.json new file mode 100644 index 000000000..f903affb2 --- /dev/null +++ b/testnets/holesky/grafana/dashboards/dashboard.json @@ -0,0 +1,803 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "liveNow": true, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 12, + "panels": [], + "repeat": "endpoint", + "repeatDirection": "h", + "title": "$endpoint calls", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 0, + "y": 1 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(cb_pbs_relay_status_code_total{http_status_code=~\"2..\", endpoint=\"$endpoint\"}[1h])) by (relay_id)", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "$endpoint Relay Success QPH", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 6, + "y": 1 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(cb_pbs_relay_status_code_total{http_status_code=~\"4..|5..\", endpoint=\"$endpoint\"}[1h])) by (relay_id)", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "$endpoint Relay Error QPH", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 12, + "y": 1 + }, + "id": 43, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(cb_pbs_beacon_node_status_code_total{http_status_code=~\"2..\", endpoint=\"$endpoint\"}[1h]))", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "$endpoint Beacon Node Success QPH", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 18, + "y": 1 + }, + "id": 44, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(cb_pbs_beacon_node_status_code_total{http_status_code=~\"4..|5..\", endpoint=\"$endpoint\"}[1h]))", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "$endpoint Beacon Node Error QPH", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 0, + "y": 12 + }, + "id": 20, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.50, sum(rate(cb_pbs_relay_latency_bucket{endpoint=\"$endpoint\"}[1m])) by (le, relay_id))", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "$endpoint Relay P50", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 6, + "y": 12 + }, + "id": 29, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.90, sum(rate(cb_pbs_relay_latency_bucket{endpoint=\"$endpoint\"}[1m])) by (le, relay_id))", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "$endpoint Relay P90", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 12, + "y": 12 + }, + "id": 30, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.99, sum(rate(cb_pbs_relay_latency_bucket{endpoint=\"$endpoint\"}[1m])) by (le, relay_id))", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "$endpoint Relay P99", + "type": "timeseries" + } + ], + "refresh": "5m", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": "All", + "value": "$__all" + }, + "description": "BuilderAPI endpoint", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "endpoint", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "get_header", + "value": "get_header" + }, + { + "selected": false, + "text": "submit_blinded_block", + "value": "submit_blinded_block" + }, + { + "selected": false, + "text": "register_validator", + "value": "register_validator" + } + ], + "query": "register_validator, get_header, submit_blinded_block", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-2d", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "PBS Metrics", + "uid": "cb_prometheus", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/testnets/holesky/grafana/dashboards/dashboards.yml b/testnets/holesky/grafana/dashboards/dashboards.yml new file mode 100644 index 000000000..db50699f9 --- /dev/null +++ b/testnets/holesky/grafana/dashboards/dashboards.yml @@ -0,0 +1,13 @@ +apiVersion: 1 + +providers: + - name: "default" + orgId: 1 + folder: "" + folderUid: "" + type: file + disableDeletion: false + editable: true + allowUiUpdates: true + options: + path: /etc/grafana/provisioning/dashboards diff --git a/testnets/holesky/grafana/dashboards/system_metrics.json b/testnets/holesky/grafana/dashboards/system_metrics.json new file mode 100644 index 000000000..93b649d80 --- /dev/null +++ b/testnets/holesky/grafana/dashboards/system_metrics.json @@ -0,0 +1,853 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "Prometheus as the datasource is obligatory", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "7.4.5" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": 14282, + "graphTooltip": 0, + "id": null, + "iteration": 1617715580880, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 8, + "panels": [], + "title": "CPU", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 15, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.4.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(container_cpu_usage_seconds_total{instance=~\"$host\",name=~\"$container\",name=~\".+\"}[5m])) by (name) *100", + "hide": false, + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:606", + "format": "percent", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:607", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 11, + "panels": [], + "title": "Memory", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 9 + }, + "hiddenSeries": false, + "id": 9, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.4.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_rss{instance=~\"$host\",name=~\"$container\",name=~\".+\"}) by (name)", + "hide": false, + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:606", + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:607", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 9 + }, + "hiddenSeries": false, + "id": 14, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.4.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_cache{instance=~\"$host\",name=~\"$container\",name=~\".+\"}) by (name)", + "hide": false, + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Cached", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:606", + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:607", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 2, + "panels": [], + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 18 + }, + "hiddenSeries": false, + "id": 4, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.4.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(container_network_receive_bytes_total[5m])) by (instance)", + "hide": false, + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Received Network Traffic", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:674", + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:675", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 18 + }, + "hiddenSeries": false, + "id": 6, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.4.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(container_network_transmit_bytes_total[5m])) by (instance)", + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Sent Network Traffic", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:832", + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:833", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 19, + "panels": [], + "title": "Misc", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": { + "align": null, + "filterable": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "id" + }, + "properties": [ + { + "id": "custom.width", + "value": 260 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Running" + }, + "properties": [ + { + "id": "unit", + "value": "d" + }, + { + "id": "decimals", + "value": 1 + }, + { + "id": "custom.displayMode", + "value": "color-text" + }, + { + "id": "color", + "value": { + "fixedColor": "dark-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 27 + }, + "id": 17, + "options": { + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "7.4.5", + "targets": [ + { + "expr": "(time() - container_start_time_seconds{instance=~\"$host\",name=~\"$container\",name=~\".+\"})/86400", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Containers Info", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "container_label_com_docker_compose_project", + "container_label_com_docker_compose_project_working_dir", + "image", + "instance", + "name", + "Value", + "container_label_com_docker_compose_service" + ] + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "indexByName": {}, + "renameByName": { + "Value": "Running", + "container_label_com_docker_compose_project": "Label", + "container_label_com_docker_compose_project_working_dir": "Working dir", + "container_label_com_docker_compose_service": "Service", + "image": "Registry Image", + "instance": "Instance", + "name": "Name" + } + } + } + ], + "type": "table" + } + ], + "schemaVersion": 27, + "style": "dark", + "tags": [ + "cadvisor", + "docker" + ], + "templating": { + "list": [ + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "definition": "label_values({__name__=~\"container.*\"},instance)", + "description": null, + "error": null, + "hide": 0, + "includeAll": true, + "label": "Host", + "multi": false, + "name": "host", + "options": [], + "query": { + "query": "label_values({__name__=~\"container.*\"},instance)", + "refId": "Prometheus-host-Variable-Query" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "definition": "label_values({__name__=~\"container.*\", instance=~\"$host\"},name)", + "description": null, + "error": null, + "hide": 0, + "includeAll": true, + "label": "Container", + "multi": false, + "name": "container", + "options": [], + "query": { + "query": "label_values({__name__=~\"container.*\", instance=~\"$host\"},name)", + "refId": "Prometheus-container-Variable-Query" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Commit-Boost System Metrics", + "uid": "pMEd7m0Mz", + "version": 1, + "description": "Simple exporter for cadvisor only" +} \ No newline at end of file diff --git a/testnets/holesky/grafana/datasources/datasources.yml b/testnets/holesky/grafana/datasources/datasources.yml new file mode 100644 index 000000000..6d29d617b --- /dev/null +++ b/testnets/holesky/grafana/datasources/datasources.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +datasources: + - name: cb-prometheus + type: prometheus + uid: cb_prometheus + access: proxy + orgId: 1 + url: http://cb_prometheus:9090 + isDefault: true + editable: true diff --git a/testnets/holesky/keys.json b/testnets/holesky/keys.json new file mode 100644 index 000000000..4689c5d75 --- /dev/null +++ b/testnets/holesky/keys.json @@ -0,0 +1,4 @@ +[ + "0088e364a5396a81b50febbdc8784663fb9089b5e67cbdc173991a00c587673f", + "0x16f3bec1b7f4f1b87c5e1930f944a6dda76ad211a89bc98e8c8e88b5069f8a04" +] diff --git a/testnets/holesky/prometheus.yml b/testnets/holesky/prometheus.yml new file mode 100644 index 000000000..91b5d5905 --- /dev/null +++ b/testnets/holesky/prometheus.yml @@ -0,0 +1,8 @@ +global: + scrape_interval: 15s + +scrape_configs: + - job_name: "commit-boost" + file_sd_configs: + - files: + - /etc/prometheus/targets.json diff --git a/testnets/holesky/targets.json b/testnets/holesky/targets.json new file mode 100644 index 000000000..6eb23eea1 --- /dev/null +++ b/testnets/holesky/targets.json @@ -0,0 +1,34 @@ +[ + { + "targets": [ + "cb_bolt:10000" + ], + "labels": { + "job": "cb_bolt" + } + }, + { + "targets": [ + "cb_pbs:10000" + ], + "labels": { + "job": "pbs" + } + }, + { + "targets": [ + "cb_signer:10000" + ], + "labels": { + "job": "signer" + } + }, + { + "targets": [ + "cb_cadvisor:8080" + ], + "labels": { + "job": "cadvisor" + } + } +] \ No newline at end of file diff --git a/testnets/holesky/update-grafana.sh b/testnets/holesky/update-grafana.sh new file mode 100755 index 000000000..4e5a16695 --- /dev/null +++ b/testnets/holesky/update-grafana.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +# Fetches the latest dashboards from commit-boost main +curl https://raw.githubusercontent.com/Commit-Boost/commit-boost-client/main/grafana/dashboards/dashboard.json -o ./grafana/dashboards/dashboard.json +curl https://raw.githubusercontent.com/Commit-Boost/commit-boost-client/main/grafana/dashboards/system_metrics.json -o ./grafana/dashboards/system_metrics.json From 4afe62060b0479537cfc2aa8a58f42e696afd5f7 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Wed, 16 Oct 2024 10:25:01 +0200 Subject: [PATCH 17/85] git(sidecar): add bolt-sidecar binaries to .gitignore --- bolt-sidecar/.gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bolt-sidecar/.gitignore b/bolt-sidecar/.gitignore index 55509a805..2e73cb821 100644 --- a/bolt-sidecar/.gitignore +++ b/bolt-sidecar/.gitignore @@ -1,4 +1,4 @@ target/ -.env -.env.* +.env* !.env.example +bolt-sidecar* From 54160326dc438c7bba187dcd254cfecbfc73a5f4 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Wed, 16 Oct 2024 10:25:35 +0200 Subject: [PATCH 18/85] docker(sidecar): remove redundant dependencies during build --- bolt-sidecar/Dockerfile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/bolt-sidecar/Dockerfile b/bolt-sidecar/Dockerfile index 99c0f839c..fd3e55d37 100644 --- a/bolt-sidecar/Dockerfile +++ b/bolt-sidecar/Dockerfile @@ -23,10 +23,7 @@ FROM base AS builder RUN apt-get update && apt-get install -y \ pkg-config \ libssl-dev \ - build-essential \ - perl \ - gcc \ - make + build-essential # Copy the generated recipe from the planner stage COPY --from=planner /app/recipe.json recipe.json From d3f9b0cb1f9e1fced48fb621ecc18a65b604ea32 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Wed, 16 Oct 2024 11:12:48 +0200 Subject: [PATCH 19/85] chore!(sidecar): rename env for telemetry options --- bolt-sidecar/src/config/telemetry.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bolt-sidecar/src/config/telemetry.rs b/bolt-sidecar/src/config/telemetry.rs index 33a2f3ac8..b0ef87da4 100644 --- a/bolt-sidecar/src/config/telemetry.rs +++ b/bolt-sidecar/src/config/telemetry.rs @@ -4,9 +4,9 @@ use serde::Deserialize; #[derive(Parser, Debug, Clone, Deserialize)] pub struct TelemetryOpts { /// The port on which to expose Prometheus metrics - #[clap(short, long, env = "METRICS_PORT", default_value_t = 3300)] + #[clap(short, long, env = "BOLT_SIDECAR_METRICS_PORT", default_value_t = 3300)] metrics_port: u16, - #[clap(short, long, env = "DISABLE_METRICS", default_value_t = false)] + #[clap(short, long, env = "BOLT_SIDECAR_DISABLE_METRICS", default_value_t = false)] disable_metrics: bool, } From 82aac7f8d15fd924d60a0be3f3b5e17dac00d7d6 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Wed, 16 Oct 2024 11:17:20 +0200 Subject: [PATCH 20/85] chore(sidecar): update .env.example --- bolt-sidecar/.env.example | 43 ++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/bolt-sidecar/.env.example b/bolt-sidecar/.env.example index cb234a599..98bf60852 100644 --- a/bolt-sidecar/.env.example +++ b/bolt-sidecar/.env.example @@ -1,33 +1,34 @@ -# Ethereum node connections +# Ethereum Node Connections + PBS URLs +BOLT_SIDECAR_PORT=8000 BOLT_SIDECAR_EXECUTION_API_URL=http://localhost:4485 BOLT_SIDECAR_BEACON_API_URL=http://localhost:4400 BOLT_SIDECAR_ENGINE_API_URL=http://localhost:4451 -BOLT_SIDECAR_ENGINE_JWT_HEX= - -# Constraint URL: should point to the constraint API sidecar. -# Usually this corresponds to `mev-boost` or `bolt-boost` BOLT_SIDECAR_CONSTRAINTS_URL=http://localhost:19550 - -# Commit-boost specific options (optional) -BOLT_SIDECAR_CB_SIGNER_URL=http://localhost:19551 -BOLT_SIDECAR_CB_JWT_HEX= - -# server ports -BOLT_SIDECAR_PORT=8000 BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT=18551 +BOLT_SIDECAR_VALIDATOR_INDEXES=0..64 +BOLT_SIDECAR_JWT_HEX= +BOLT_SIDECAR_FEE_RECIPIENT= +BOLT_SIDECAR_BUILDER_PRIVATE_KEY= -# commitment limits +# Commitments configs BOLT_SIDECAR_MAX_COMMITMENTS=128 -BOLT_SIDECAR_MAX_COMMITTED_GAS=10000000 - -# chain configs -BOLT_SIDECAR_CHAIN=holesky +BOLT_SIDECAR_MAX_COMMITTED_GAS= +BOLT_SIDECAR_MIN_PRIORITY_FEE= BOLT_SIDECAR_COMMITMENT_DEADLINE=8000 + +# Chain configs +BOLT_SIDECAR_CHAIN=Holesky BOLT_SIDECAR_SLOT_TIME=12 -# sidecar security configs -BOLT_SIDECAR_VALIDATOR_INDEXES= -BOLT_SIDECAR_FEE_RECIPIENT= -BOLT_SIDECAR_BUILDER_PRIVATE_KEY= +# Signing options BOLT_SIDECAR_CONSTRAINT_PRIVATE_KEY= BOLT_SIDECAR_COMMITMENT_PRIVATE_KEY= +BOLT_SIDECAR_CB_SIGNER_URL= +BOLT_SIDECAR_CB_JWT_HEX= +BOLT_SIDECAR_KEYSTORE_PASSWORD= +BOLT_SIDECAR_KEYSTORE_PATH= +BOLT_SIDECAR_DELEGATIONS_PATH= + +# Metrics +BOLT_SIDECAR_METRICS_PORT= +BOLT_SIDECAR_DISABLE_METRICS= From cc83818463ccea448b43f73f5262ef81db3f8be7 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Wed, 16 Oct 2024 11:46:16 +0200 Subject: [PATCH 21/85] chore(sidecar): update Config.example.toml --- bolt-sidecar/Config.example.toml | 51 +++++++++++++++++--------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/bolt-sidecar/Config.example.toml b/bolt-sidecar/Config.example.toml index b73e925da..e6caad16e 100644 --- a/bolt-sidecar/Config.example.toml +++ b/bolt-sidecar/Config.example.toml @@ -1,34 +1,37 @@ -# ports +# Ethereum Node Connections + PBS URLs port = 8000 -metrics_port = 3300 - -# node urls -execution_api_url = "http://localhost:8545" -beacon_api_url = "http://localhost:5052" -engine_api_url = "http://localhost:8551" -engine_jwt_hex = "0x573300d0cd9a8e253429998a3ceecf358aa4868d96772d1344a80144d3b7b593" - -# constraints options -constraints_api_url = "http://localhost:3030" +execution_api_url = "http://localhost:4485" +beacon_api_url = "http://localhost:4400" +engine_api_url = "http://localhost:4451" +constraints_url = "http://localhost:19550" constraints_proxy_port = 18551 - validator_indexes = "0..64" -fee_recipient = "0x0155ef0C0fE550C297c1216585e0DE1478EA30e4" +jwt_hex = "0x0000000000000000000000000000000000000000000000000000000000000000" +fee_recipient = "0x0000000000000000000000000000000000000000" +builder_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" -builder_private_key = "0x359c156600e1f5715a58c9e09f17c8d04e7ee3a9f88b39f6e489ffca0148fabe" -commitment_private_key = "0x359c156600e1f5715a58c9e09f17c8d04e7ee3a9f88b39f6e489ffca0148fabe" +# Commitments configs +max_commitments = 128 +max_committed_gas = 10000000 +min_priority_fee = 5000000 -# chain options +# Chain configs [chain] -chain = "Kurtosis" -slot_time = 2 +chain = "Holesky" +slot_time = 12 commitment_deadline = 8000 -[telemetry] -metrics_port = 3300 -disable_metrics = false - -# signing options +# Signing options [constraint_signing] -constraint_private_key = "0x359c156600e1f5715a58c9e09f17c8d04e7ee3a9f88b39f6e489ffca0148fabe" +constraint_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" +commitment_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" +cb_signer_url = "http://localhost:18550" +cb_jwt_hex = "0x0000000000000000000000000000000000000000000000000000000000000000" +keystore_password = "password" +keystore_path = "./keys" delegations_path = "./delegations.json" + +# Metrics +[telemetry] +metrics_port = 8001 +disable_metrics = false From 91b44ae0a0ae0dc1a91e5051f0229d7992d4d151 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Wed, 16 Oct 2024 14:03:17 +0200 Subject: [PATCH 22/85] chore!(sidecar): remove short options from telemetry config --- bolt-sidecar/src/config/telemetry.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bolt-sidecar/src/config/telemetry.rs b/bolt-sidecar/src/config/telemetry.rs index b0ef87da4..01bc179d6 100644 --- a/bolt-sidecar/src/config/telemetry.rs +++ b/bolt-sidecar/src/config/telemetry.rs @@ -4,9 +4,9 @@ use serde::Deserialize; #[derive(Parser, Debug, Clone, Deserialize)] pub struct TelemetryOpts { /// The port on which to expose Prometheus metrics - #[clap(short, long, env = "BOLT_SIDECAR_METRICS_PORT", default_value_t = 3300)] + #[clap(long, env = "BOLT_SIDECAR_METRICS_PORT", default_value_t = 3300)] metrics_port: u16, - #[clap(short, long, env = "BOLT_SIDECAR_DISABLE_METRICS", default_value_t = false)] + #[clap(long, env = "BOLT_SIDECAR_DISABLE_METRICS", default_value_t = false)] disable_metrics: bool, } From 3701587871566c9456bcf2b896e5a39bcb17bd4d Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 17 Oct 2024 10:38:24 +0200 Subject: [PATCH 23/85] chore(holesky): add .gitignore --- testnets/holesky/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 testnets/holesky/.gitignore diff --git a/testnets/holesky/.gitignore b/testnets/holesky/.gitignore new file mode 100644 index 000000000..ef456d924 --- /dev/null +++ b/testnets/holesky/.gitignore @@ -0,0 +1,2 @@ +*.env* +!*.env.example From e22156d55950ff59003d30e5f545ae14859953fe Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 17 Oct 2024 11:00:17 +0200 Subject: [PATCH 24/85] chore(mev-boost): add .env.example --- mev-boost/.env.example | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 mev-boost/.env.example diff --git a/mev-boost/.env.example b/mev-boost/.env.example new file mode 100644 index 000000000..447b2fab8 --- /dev/null +++ b/mev-boost/.env.example @@ -0,0 +1,32 @@ +# Logging settings +LOG_JSON=false # Set to true to log in JSON format +LOG_LEVEL=info # Log level: trace, debug, info, warn, error, fatal, panic +DEBUG=false # Set to true to enable debug mode +LOG_SERVICE_TAG= # Optional: Add a custom service tag to all log entries +DISABLE_LOG_VERSION=false # Set to true to disable logging the version + +# Server settings +BOOST_LISTEN_ADDR=localhost:18550 # Address for mev-boost server to listen on +RELAY_STARTUP_CHECK=false # Set to true to check relay status on startup + +# Relay settings +RELAYS= # Relay URLs: single or comma-separated list (scheme://pubkey@host) +RELAY_MONITORS= # Relay monitor URLs: single or comma-separated list (scheme://host) +MIN_BID_ETH=0 # Minimum bid to accept from relay (in ETH) + +# Relay timeout settings (in ms) +RELAY_TIMEOUT_MS_GETHEADER=950 # Timeout for getHeader requests to the relay +RELAY_TIMEOUT_MS_GETPAYLOAD=4000 # Timeout for getPayload requests to the relay +RELAY_TIMEOUT_MS_REGVAL=3000 # Timeout for registerValidator requests + +# Genesis settings +GENESIS_FORK_VERSION= # Custom genesis fork version +GENESIS_TIMESTAMP=-1 # Custom genesis timestamp (in unix seconds) + +# Network settings +SEPOLIA=false # Set to true to use Sepolia network +GOERLI=false # Set to true to use Goerli network +HOLESKY=false # Set to true to use Holesky network + +# Retry settings +REQUEST_MAX_RETRIES=5 # Max retries for relay get payload request From 31ac432b8dab1c9643e8179f6776053cd346801b Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 17 Oct 2024 11:23:12 +0200 Subject: [PATCH 25/85] chore(mev-boost): update .gitignore --- mev-boost/.env.example | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 mev-boost/.env.example diff --git a/mev-boost/.env.example b/mev-boost/.env.example deleted file mode 100644 index 447b2fab8..000000000 --- a/mev-boost/.env.example +++ /dev/null @@ -1,32 +0,0 @@ -# Logging settings -LOG_JSON=false # Set to true to log in JSON format -LOG_LEVEL=info # Log level: trace, debug, info, warn, error, fatal, panic -DEBUG=false # Set to true to enable debug mode -LOG_SERVICE_TAG= # Optional: Add a custom service tag to all log entries -DISABLE_LOG_VERSION=false # Set to true to disable logging the version - -# Server settings -BOOST_LISTEN_ADDR=localhost:18550 # Address for mev-boost server to listen on -RELAY_STARTUP_CHECK=false # Set to true to check relay status on startup - -# Relay settings -RELAYS= # Relay URLs: single or comma-separated list (scheme://pubkey@host) -RELAY_MONITORS= # Relay monitor URLs: single or comma-separated list (scheme://host) -MIN_BID_ETH=0 # Minimum bid to accept from relay (in ETH) - -# Relay timeout settings (in ms) -RELAY_TIMEOUT_MS_GETHEADER=950 # Timeout for getHeader requests to the relay -RELAY_TIMEOUT_MS_GETPAYLOAD=4000 # Timeout for getPayload requests to the relay -RELAY_TIMEOUT_MS_REGVAL=3000 # Timeout for registerValidator requests - -# Genesis settings -GENESIS_FORK_VERSION= # Custom genesis fork version -GENESIS_TIMESTAMP=-1 # Custom genesis timestamp (in unix seconds) - -# Network settings -SEPOLIA=false # Set to true to use Sepolia network -GOERLI=false # Set to true to use Goerli network -HOLESKY=false # Set to true to use Holesky network - -# Retry settings -REQUEST_MAX_RETRIES=5 # Max retries for relay get payload request From ce27645b9ba57dbf3fbad1c00db875db2a4f6bca Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 17 Oct 2024 11:57:00 +0200 Subject: [PATCH 26/85] chore(holesky): update docker compose setup --- testnets/holesky/docker-compose.yml | 58 +++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 testnets/holesky/docker-compose.yml diff --git a/testnets/holesky/docker-compose.yml b/testnets/holesky/docker-compose.yml new file mode 100644 index 000000000..52ef4da0c --- /dev/null +++ b/testnets/holesky/docker-compose.yml @@ -0,0 +1,58 @@ +services: + bolt-sidecar: + image: ghcr.io/chainbound/bolt-sidecar:v0.3.0-alpha-rc.1 + container_name: bolt-sidecar + restart: unless-stopped + ports: + - "${BOLT_SIDECAR_PORT}:${BOLT_SIDECAR_PORT}" # Bolt RPC port (this should be opened on your firewall!) + - "${BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT}:${BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT}" + env_file: ./bolt-sidecar.env + entrypoint: /bin/sh -c /bolt-sidecar + + mev-boost: + image: ghcr.io/chainbound/bolt-mev-boost:v0.3.0-alpha-rc.1 + container_name: mev-boost + restart: unless-stopped + env_file: ./mev-boost.env + entrypoint: /bin/sh -c '/app/mev-boost' + + prometheus: + image: prom/prometheus:latest + container_name: prometheus + ports: + - 9090:9090 + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml + - ./targets.json:/etc/prometheus/targets.json + - prometheus-data:/prometheus + networks: + - monitoring_network + + grafana: + image: grafana/grafana:latest + container_name: cb_grafana + ports: + - 3000:3000 + environment: + - GF_SECURITY_ADMIN_PASSWORD=admin + volumes: + - ./grafana/dashboards:/etc/grafana/provisioning/dashboards + - ./grafana/datasources:/etc/grafana/provisioning/datasources + - grafana-data:/var/lib/grafana + networks: + - monitoring_network + depends_on: + - prometheus + logging: + driver: none + +volumes: + prometheus-data: + driver: local + grafana-data: + driver: local +networks: + monitoring_network: + driver: bridge + signer_network: + driver: bridge From a02f72554d3710a86cd04cdd3e82a02aeb15d356 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 17 Oct 2024 11:57:36 +0200 Subject: [PATCH 27/85] chore(holesky): move commit-boost config in separate directory --- testnets/holesky/{ => commit-boost}/cb-bolt-config.toml | 2 +- testnets/holesky/commit-boost/cb-prometheus.yml | 8 ++++++++ testnets/holesky/{ => commit-boost}/keys.json | 0 testnets/holesky/{ => commit-boost}/targets.json | 0 testnets/holesky/{ => commit-boost}/update-grafana.sh | 4 ++-- testnets/holesky/prometheus.yml | 4 ++-- 6 files changed, 13 insertions(+), 5 deletions(-) rename testnets/holesky/{ => commit-boost}/cb-bolt-config.toml (99%) create mode 100644 testnets/holesky/commit-boost/cb-prometheus.yml rename testnets/holesky/{ => commit-boost}/keys.json (100%) rename testnets/holesky/{ => commit-boost}/targets.json (100%) rename testnets/holesky/{ => commit-boost}/update-grafana.sh (51%) diff --git a/testnets/holesky/cb-bolt-config.toml b/testnets/holesky/commit-boost/cb-bolt-config.toml similarity index 99% rename from testnets/holesky/cb-bolt-config.toml rename to testnets/holesky/commit-boost/cb-bolt-config.toml index be4e35002..f78b0fc8d 100644 --- a/testnets/holesky/cb-bolt-config.toml +++ b/testnets/holesky/commit-boost/cb-bolt-config.toml @@ -136,7 +136,7 @@ BOLT_SIDECAR_METRICS_PORT = "10000" # - /etc/prometheus/targets.json # ``` # and use the `targets.json` file generated by `commit-boost init` -prometheus_config = "./prometheus.yml" +prometheus_config = "./cb-prometheus.yml" # Whether to start Grafana with built-in dashboards # OPTIONAL, DEFAULT: true use_grafana = true diff --git a/testnets/holesky/commit-boost/cb-prometheus.yml b/testnets/holesky/commit-boost/cb-prometheus.yml new file mode 100644 index 000000000..91b5d5905 --- /dev/null +++ b/testnets/holesky/commit-boost/cb-prometheus.yml @@ -0,0 +1,8 @@ +global: + scrape_interval: 15s + +scrape_configs: + - job_name: "commit-boost" + file_sd_configs: + - files: + - /etc/prometheus/targets.json diff --git a/testnets/holesky/keys.json b/testnets/holesky/commit-boost/keys.json similarity index 100% rename from testnets/holesky/keys.json rename to testnets/holesky/commit-boost/keys.json diff --git a/testnets/holesky/targets.json b/testnets/holesky/commit-boost/targets.json similarity index 100% rename from testnets/holesky/targets.json rename to testnets/holesky/commit-boost/targets.json diff --git a/testnets/holesky/update-grafana.sh b/testnets/holesky/commit-boost/update-grafana.sh similarity index 51% rename from testnets/holesky/update-grafana.sh rename to testnets/holesky/commit-boost/update-grafana.sh index 4e5a16695..1f832d32b 100755 --- a/testnets/holesky/update-grafana.sh +++ b/testnets/holesky/commit-boost/update-grafana.sh @@ -1,5 +1,5 @@ #!/bin/bash # Fetches the latest dashboards from commit-boost main -curl https://raw.githubusercontent.com/Commit-Boost/commit-boost-client/main/grafana/dashboards/dashboard.json -o ./grafana/dashboards/dashboard.json -curl https://raw.githubusercontent.com/Commit-Boost/commit-boost-client/main/grafana/dashboards/system_metrics.json -o ./grafana/dashboards/system_metrics.json +curl https://raw.githubusercontent.com/Commit-Boost/commit-boost-client/main/grafana/dashboards/dashboard.json -o ../grafana/dashboards/dashboard.json +curl https://raw.githubusercontent.com/Commit-Boost/commit-boost-client/main/grafana/dashboards/system_metrics.json -o ../grafana/dashboards/system_metrics.json diff --git a/testnets/holesky/prometheus.yml b/testnets/holesky/prometheus.yml index 91b5d5905..bce41074a 100644 --- a/testnets/holesky/prometheus.yml +++ b/testnets/holesky/prometheus.yml @@ -1,8 +1,8 @@ global: - scrape_interval: 15s + scrape_interval: 5s scrape_configs: - - job_name: "commit-boost" + - job_name: "bolt-sidecar" file_sd_configs: - files: - /etc/prometheus/targets.json From 022ef5a090827f0a96536cebb132818f0ab31b38 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Mon, 21 Oct 2024 12:34:06 +0200 Subject: [PATCH 28/85] fix(delegations-cli): non-descriptive error message --- bolt-cli/src/common/keystore.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/bolt-cli/src/common/keystore.rs b/bolt-cli/src/common/keystore.rs index 26810e11b..464a1e5cd 100644 --- a/bolt-cli/src/common/keystore.rs +++ b/bolt-cli/src/common/keystore.rs @@ -51,7 +51,9 @@ impl KeystoreSecret { /// Load the keystore passwords from a directory containing individual password files. pub fn from_directory(root_dir: &str) -> Result { let mut secrets = HashMap::new(); - for entry in fs::read_dir(root_dir)? { + for entry in fs::read_dir(&root_dir) + .wrap_err(format!("failed to read secrets directory. path: {}", &root_dir))? + { let entry = entry.wrap_err("Failed to read secrets directory entry")?; let path = entry.path(); @@ -108,12 +110,14 @@ impl Drop for KeystoreSecret { /// -- ... /// Reference: https://github.com/chainbound/bolt/blob/4634ff905561009e4e74f9921dfdabf43717010f/bolt-sidecar/src/signer/keystore.rs#L109 pub fn keystore_paths(keys_path: &str) -> Result> { - let keys_path = Path::new(keys_path).to_path_buf(); + let keys_path_buf = Path::new(keys_path).to_path_buf(); let json_extension = OsString::from("json"); let mut keystores_paths = vec![]; // Iter over the `keys` directory - for entry in read_dir(keys_path)? { + for entry in read_dir(keys_path_buf) + .wrap_err(format!("failed to read keys directory. path: {keys_path}"))? + { let path = read_path(entry)?; if path.is_dir() { for entry in read_dir(path)? { From e0208ad957d08bd24c4d941ea6b90d761c6f74f8 Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:45:07 +0200 Subject: [PATCH 29/85] wip: pbs configs --- testnets/holesky/docker-compose.pbs.yml | 69 +++++++++++++++++++++++++ testnets/holesky/docker-compose.yml | 4 +- testnets/holesky/helix-config.yml | 17 ++++++ testnets/holesky/scripts/run-bn.sh | 28 ++++++++++ testnets/holesky/scripts/run-builder.sh | 32 ++++++++++++ 5 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 testnets/holesky/docker-compose.pbs.yml create mode 100644 testnets/holesky/helix-config.yml create mode 100644 testnets/holesky/scripts/run-bn.sh create mode 100644 testnets/holesky/scripts/run-builder.sh diff --git a/testnets/holesky/docker-compose.pbs.yml b/testnets/holesky/docker-compose.pbs.yml new file mode 100644 index 000000000..be3a3a003 --- /dev/null +++ b/testnets/holesky/docker-compose.pbs.yml @@ -0,0 +1,69 @@ +volumes: + psql_data: + driver: local + chaindata: + driver: local + +services: + redis: + image: redis + restart: unless-stopped + + db: + image: timescale/timescaledb-ha:pg16 + restart: unless-stopped + volumes: + - "psql_data:/var/lib/postgresql/data" + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: helixdb + + adminer: + image: adminer + restart: unless-stopped + depends_on: + - db + ports: + - "48093:8080" + environment: + ADMINER_PLUGINS: tables-filter tinymce + + builder: + image: ghcr.io/chainbound/bolt-builder:v0.3.0-alpha.rc1 + restart: unless-stopped + volumes: + - "chaindata:/var/lib/chaindata" + - "./shared:/var/lib/shared" + - "./scripts/run-builder.sh:/scripts/run-builder.sh" + environment: + BUILDER_TX_SIGNING_KEY: "0x53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710" + ports: + - "30367:30303/tcp" + - "30367:30303/udp" + # entrypoint is builder + entrypoint: /scripts/run-builder.sh + + beacon: + image: sigp/lighthouse:latest + restart: unless-stopped + volumes: + - "chaindata:/var/lib/chaindata" + - "./shared:/var/lib/shared" + - "./scripts/run-bn.sh:/scripts/run-bn.sh" + ports: + - "41050:50050/tcp" + - "41050:50050/udp" + entrypoint: /scripts/run-bn.sh + + helix-relay: + image: ghcr.io/chainbound/helix:v0.3.0-alpha.rc1 + restart: unless-stopped + volumes: + - "./helix-config.yml:/helix-config.yml" + ports: + - "44040:4040" + environment: + - RELAY_KEY=0x607a11b45a7219cc61a3d9c5fd08c7eebd602a6a19a977f8d3771d5711a550f2 + - RUST_LOG=helix_cmd=debug,helix_api=debug,helix_common=debug,helix_datastore=debug,helix_housekeeper=debug,helix_database=debug,helix_beacon_client=debug + command: --config /helix-config.yml diff --git a/testnets/holesky/docker-compose.yml b/testnets/holesky/docker-compose.yml index 52ef4da0c..2751212df 100644 --- a/testnets/holesky/docker-compose.yml +++ b/testnets/holesky/docker-compose.yml @@ -1,6 +1,6 @@ services: bolt-sidecar: - image: ghcr.io/chainbound/bolt-sidecar:v0.3.0-alpha-rc.1 + image: ghcr.io/chainbound/bolt-sidecar:v0.3.0-alpha.rc1 container_name: bolt-sidecar restart: unless-stopped ports: @@ -10,7 +10,7 @@ services: entrypoint: /bin/sh -c /bolt-sidecar mev-boost: - image: ghcr.io/chainbound/bolt-mev-boost:v0.3.0-alpha-rc.1 + image: ghcr.io/chainbound/bolt-mev-boost:v0.3.0-alpha.rc1 container_name: mev-boost restart: unless-stopped env_file: ./mev-boost.env diff --git a/testnets/holesky/helix-config.yml b/testnets/holesky/helix-config.yml new file mode 100644 index 000000000..edeff326e --- /dev/null +++ b/testnets/holesky/helix-config.yml @@ -0,0 +1,17 @@ +postgres: + hostname: db + port: 5432 + db_name: helixdb + user: postgres + password: postgres + +redis: + url: redis://redis:6379 + +simulator: + url: http://builder:8545 + +beacon_clients: + - url: http://beacon:50050 + +network_config: !Holesky diff --git a/testnets/holesky/scripts/run-bn.sh b/testnets/holesky/scripts/run-bn.sh new file mode 100644 index 000000000..5fe326129 --- /dev/null +++ b/testnets/holesky/scripts/run-bn.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +lighthouse beacon_node \ + --network=holesky \ + --debug-level=info \ + --datadir=/var/lib/chaindata \ + --disable-enr-auto-update \ + --enr-udp-port=50050 \ + --enr-tcp-port=50050 \ + --listen-address=0.0.0.0 \ + --port=50050 \ + --http \ + --http-address=0.0.0.0 \ + --http-port=4000 \ + --http-allow-sync-stalled \ + --always-prepare-payload \ + --prepare-payload-lookahead=12000 \ + --slots-per-restore-point=32 \ + --disable-packet-filter \ + --checkpoint-sync-url=https://holesky.beaconstate.info \ + --execution-endpoints=http://builder:8551 \ + --subscribe-all-subnets \ + --metrics \ + --metrics-address=0.0.0.0 \ + --metrics-allow-origin=* \ + --metrics-port=5054 \ + --enable-private-discovery \ + --jwt-secrets=/var/lib/shared/jwtsecret diff --git a/testnets/holesky/scripts/run-builder.sh b/testnets/holesky/scripts/run-builder.sh new file mode 100644 index 000000000..d6894ac4e --- /dev/null +++ b/testnets/holesky/scripts/run-builder.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +geth --datadir=/var/lib/chaindata/geth \ + --network=holesky \ + --syncmode=full \ + --gcmode=archive \ + --state.scheme=hash \ + --verbosity=3 \ + --http \ + --http.port=8545 \ + --http.addr=0.0.0.0 \ + --http.vhosts=* \ + --http.corsdomain=* \ + --http.api=admin,engine,net,eth,web3,debug,flashbots,txpool \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port=8546 \ + --ws.api=admin,engine,net,eth,web3,debug,flashbots,txpool \ + --ws.origins=* \ + --authrpc.port=8551 \ + --authrpc.addr=0.0.0.0 \ + --authrpc.vhosts=* \ + --authrpc.jwtsecret=/var/lib/shared/jwtsecret \ + --metrics \ + --metrics.addr=0.0.0.0 \ + --metrics.port=6060 \ + --port=30303 \ + --builder \ + --builder.remote_relay_endpoint=http://relay-api:9062 \ + --builder.beacon_endpoints=http://beacon:4000 \ + --miner.etherbase=0x614561D2d143621E126e87831AEF287678B442b8 \ + --miner.extradata="Bolt Builder" From cc458583c6f48fecc9fc042f282b51df7a47aaa8 Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Mon, 21 Oct 2024 12:31:30 +0200 Subject: [PATCH 30/85] feat: working pbs docker compose --- testnets/holesky/docker-compose.pbs.yml | 23 ++++++++++++++++++----- testnets/holesky/helix-config.yml | 2 +- testnets/holesky/scripts/run-bn.sh | 0 testnets/holesky/scripts/run-builder.sh | 4 ++-- 4 files changed, 21 insertions(+), 8 deletions(-) mode change 100644 => 100755 testnets/holesky/scripts/run-bn.sh mode change 100644 => 100755 testnets/holesky/scripts/run-builder.sh diff --git a/testnets/holesky/docker-compose.pbs.yml b/testnets/holesky/docker-compose.pbs.yml index be3a3a003..362dc1c2e 100644 --- a/testnets/holesky/docker-compose.pbs.yml +++ b/testnets/holesky/docker-compose.pbs.yml @@ -3,6 +3,8 @@ volumes: driver: local chaindata: driver: local + shared: + driver: local services: redis: @@ -34,31 +36,41 @@ services: restart: unless-stopped volumes: - "chaindata:/var/lib/chaindata" - - "./shared:/var/lib/shared" + - "shared:/var/lib/shared" - "./scripts/run-builder.sh:/scripts/run-builder.sh" environment: BUILDER_TX_SIGNING_KEY: "0x53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710" ports: - "30367:30303/tcp" - "30367:30303/udp" - # entrypoint is builder - entrypoint: /scripts/run-builder.sh + entrypoint: + [ + "/bin/sh", + "-c", + "chmod +x /scripts/run-builder.sh && /scripts/run-builder.sh", + ] beacon: image: sigp/lighthouse:latest restart: unless-stopped volumes: - "chaindata:/var/lib/chaindata" - - "./shared:/var/lib/shared" + - "shared:/var/lib/shared" - "./scripts/run-bn.sh:/scripts/run-bn.sh" ports: - "41050:50050/tcp" - "41050:50050/udp" - entrypoint: /scripts/run-bn.sh + entrypoint: + ["/bin/sh", "-c", "chmod +x /scripts/run-bn.sh && /scripts/run-bn.sh"] helix-relay: image: ghcr.io/chainbound/helix:v0.3.0-alpha.rc1 restart: unless-stopped + depends_on: + - db + - redis + - builder + - beacon volumes: - "./helix-config.yml:/helix-config.yml" ports: @@ -66,4 +78,5 @@ services: environment: - RELAY_KEY=0x607a11b45a7219cc61a3d9c5fd08c7eebd602a6a19a977f8d3771d5711a550f2 - RUST_LOG=helix_cmd=debug,helix_api=debug,helix_common=debug,helix_datastore=debug,helix_housekeeper=debug,helix_database=debug,helix_beacon_client=debug + - RUST_BACKTRACE=1 command: --config /helix-config.yml diff --git a/testnets/holesky/helix-config.yml b/testnets/holesky/helix-config.yml index edeff326e..3305a335b 100644 --- a/testnets/holesky/helix-config.yml +++ b/testnets/holesky/helix-config.yml @@ -12,6 +12,6 @@ simulator: url: http://builder:8545 beacon_clients: - - url: http://beacon:50050 + - url: http://beacon:4000 network_config: !Holesky diff --git a/testnets/holesky/scripts/run-bn.sh b/testnets/holesky/scripts/run-bn.sh old mode 100644 new mode 100755 diff --git a/testnets/holesky/scripts/run-builder.sh b/testnets/holesky/scripts/run-builder.sh old mode 100644 new mode 100755 index d6894ac4e..c1bc12035 --- a/testnets/holesky/scripts/run-builder.sh +++ b/testnets/holesky/scripts/run-builder.sh @@ -1,7 +1,7 @@ #!/bin/sh geth --datadir=/var/lib/chaindata/geth \ - --network=holesky \ + --holesky \ --syncmode=full \ --gcmode=archive \ --state.scheme=hash \ @@ -26,7 +26,7 @@ geth --datadir=/var/lib/chaindata/geth \ --metrics.port=6060 \ --port=30303 \ --builder \ - --builder.remote_relay_endpoint=http://relay-api:9062 \ + --builder.remote_relay_endpoint=http://helix-relay:4040 \ --builder.beacon_endpoints=http://beacon:4000 \ --miner.etherbase=0x614561D2d143621E126e87831AEF287678B442b8 \ --miner.extradata="Bolt Builder" From e8da054c04a11aaf075d74f01c3444ced0d9cb11 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Mon, 21 Oct 2024 11:14:27 +0200 Subject: [PATCH 31/85] chore(sidecar): more precise docs for config --- bolt-sidecar/src/config/mod.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/bolt-sidecar/src/config/mod.rs b/bolt-sidecar/src/config/mod.rs index af3256000..fcade3aee 100644 --- a/bolt-sidecar/src/config/mod.rs +++ b/bolt-sidecar/src/config/mod.rs @@ -33,7 +33,8 @@ pub const DEFAULT_CONSTRAINTS_PROXY_PORT: u16 = 18551; #[derive(Debug, Parser, Deserialize)] #[clap(trailing_var_arg = true)] pub struct Opts { - /// Port to listen on for incoming JSON-RPC requests + /// Port to listen on for incoming JSON-RPC requests of the Commitments API. + /// This port should be open on your firewall in order to receive external requests! #[clap(long, env = "BOLT_SIDECAR_PORT", default_value_t = DEFAULT_RPC_PORT)] pub port: u16, /// Execution client API URL @@ -42,7 +43,8 @@ pub struct Opts { /// URL for the beacon client #[clap(long, env = "BOLT_SIDECAR_BEACON_API_URL", default_value = "http://localhost:5052")] pub beacon_api_url: Url, - /// Execution client Engine API URL + /// Execution client Engine API URL. This is needed for fallback block building and must be a + /// synced Geth node. #[clap(long, env = "BOLT_SIDECAR_ENGINE_API_URL", default_value = "http://localhost:8551")] pub engine_api_url: Url, /// URL to forward the constraints produced by the Bolt sidecar to a server supporting the @@ -77,10 +79,11 @@ pub struct Opts { /// The fee recipient address for fallback blocks #[clap(long, env = "BOLT_SIDECAR_FEE_RECIPIENT")] pub fee_recipient: Address, - /// Secret BLS key to sign fallback payloads with (If not provided, a random key will be used) + /// Secret BLS key to sign fallback payloads with #[clap(long, env = "BOLT_SIDECAR_BUILDER_PRIVATE_KEY")] pub builder_private_key: BlsSecretKeyWrapper, - /// Secret ECDSA key to sign commitment messages with + /// Secret ECDSA key to sign commitment messages with. The public key associated to it must be + /// then used when registering the operator in the `BoltManager` contract. #[clap(long, env = "BOLT_SIDECAR_COMMITMENT_PRIVATE_KEY")] pub commitment_private_key: EcdsaSecretKeyWrapper, /// Operating limits for the sidecar From 574c273f18e238a6a462397047f8c0824b09b3ff Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Wed, 16 Oct 2024 10:26:23 +0200 Subject: [PATCH 32/85] docs(holesky): README launch wip update --- testnets/holesky/README.md | 828 +++++++++++++++++++++++++++++++++++-- 1 file changed, 797 insertions(+), 31 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index c031285f3..526089c56 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -1,31 +1,159 @@ -# Holesky Launch Instructions +This document provides instructions for running the Bolt sidecar on the Holesky testnet. + +# Table of Contents + + + +* [Prerequisites](#prerequisites) +* [Setup](#setup) + * [Docker Mode (recommended)](#docker-mode-(recommended)) + * [Commit-Boost Mode](#commit-boost-mode) + * [Native Mode (advanced)](#native-mode-(advanced)) + * [Building and running the MEV-Boost fork binary](#building-and-running-the-mev-boost-fork-binary) + * [Building and running the Bolt sidecar binary](#building-and-running-the-bolt-sidecar-binary) + * [Configuration file](#configuration-file) + * [Observability](#observability) +* [Register your validators on-chain on the Bolt Registry](#register-your-validators-on-chain-on-the-bolt-registry) + * [Validator Registration](#validator-registration) + * [Bolt Network Entrypoint](#bolt-network-entrypoint) + * [Symbiotic Integration guide for Staking Pools](#symbiotic-integration-guide-for-staking-pools) + * [Symbiotic Integration guide for Operators](#symbiotic-integration-guide-for-operators) + * [EigenLayer Integration Guide for Node Operators and Solo Stakers](#eigenlayer-integration-guide-for-node-operators-and-solo-stakers) +* [Reference](#reference) + * [Command-line options](#command-line-options) + * [Delegations and signing options for Native and Docker Compose Mode](#delegations-and-signing-options-for-native-and-docker-compose-mode) + * [`bolt-delegations-cli`](#`bolt-delegations-cli`) + * [Installation and usage](#installation-and-usage) + * [Delegations CLI Example](#delegations-cli-example) + * [Using a private key directly](#using-a-private-key-directly) + * [Using a ERC-2335 Keystore](#using-a-erc-2335-keystore) + * [Avoid restarting the beacon node](#avoid-restarting-the-beacon-node) + + + +# Prerequisites + +In order to run Bolt you need some components already installed and running in +your system. + +**A synced Geth client:** + +Bolt is fully trustless since it is able to produce a fallback block with the +commitments issued in case builders do not return a valid bid. In order to do so +it relies on a synced execution client, configured via the `--execution-api-url` +flag. At the moment only Geth is supported; with more +clients to be supported in the future. + +Using the sidecar with a different execution client could lead to commitment +faults because fallback block building is not supported yet. You can download +Geth from [the official website](https://geth.ethereum.org/downloads). + +**A synced beacon node:** + +Bolt is compatible with every beacon client. Please refer to the various beacon +client implementations to download and run them. -## Components +> [!IMPORTANT] +> In order to correctly run the Bolt sidecar and avoid commitment faults the +> beacon node must be configured so that: +> +> 1. the node's `builder-api` (or equivalent flag) must point to the Bolt +> Sidecar API. +> 2. the node will always prefer the builder payload. For instance, in +> Lighthouse this can be achieved by providing the following flags: +> +> ```text +> --always-prefer-builder-payload +> --builder-fallback-disable-checks +> ``` +> +> It might be necessary to restart your beacon node depending on your existing +> setup. See the [Avoid Restarting the Beacon +> Node](#avoid-restarting-the-beacon-node) for more details. + +**Active validators:** + +The Bolt sidecar requires signing keys from active Ethereum validators, or +authorized delegates acting on their behalf, to issue and sign preconfirmations. + +**LST collateral:** + +For Holesky in order to provide credible proposer commitments it is necessary to +restake 1 ether worth of ETH derivatives per validator in either the Symbiotic +or the EigenLayer protocol. + +# Setup + +There are various way to run the Bolt Sidecar depending on what infrastructure +you want to use and your preferred signing methods: -The components that need to run to test Bolt on Holesky are: +- Docker mode (recommended); +- [Commit-Boost](https://commit-boost.github.io/commit-boost-client) mode + (requires Docker). +- Native mode (advanced, requires building everything from source); -- A synced execution client -- A synced beacon node -- Active validators -- Commit-Boost with Bolt configuration +Running the Bolt sidecar as a standalone binary requires building it from +source. Both the standalone binary and the Docker container requires reading +signing keys from [ERC-2335](https://eips.ethereum.org/EIPS/eip-2335) keystores, +while the Commit-Boost module relies on an internal signer and a custom PBS +module instead of regular [MEV-Boost](https://boost.flashbots.net/). -## Setup +In this section we're going to explore each of these options and its +requirements. -### Commit-Boost +## Docker Mode (recommended) -#### Installation +First, make sure to have both [Docker](https://docs.docker.com/engine/install/), +[Docker Compose](https://docs.docker.com/compose/install/) and +[git](https://git-scm.com/downloads) installed in your machine. -To install the `commit-boost` CLI with `cargo`: +Then clone the Bolt repository by running: ```bash -# Use specific commit hash to ensure compatibility -cargo install --locked --git https://github.com/Commit-Boost/commit-boost-client --rev aed00e8 commit-boost +git clone --branch v0.3.0 htts://github.com/chainbound/bolt.git && cd bolt +``` + +The Docker Compose setup will spin up the Bolt sidecar along with the Bolt +MEV-Boost fork which includes supports the [Constraints +API](https://docs.boltprotocol.xyz/api/builder). + +Before starting the services, you'll need to provide configuration files +containing the necessary environment variables: + +1. **Bolt Sidecar Configuration:** + + Create a `bolt-sidecar.env` file in the `testnets/holesky` directory. If you + need a reference, you can use the `.env.example` file in the `bolt-sidecar` + directory as a starting point. For proper configuration of the signing + options, please refer to the [Delegations and + Signing](#delegations-and-signing-options-for-standalone-and-docker-container-setup) + section of this guide. + +2. **MEV-Boost Configuration:** + + Similarly, create a `mev-boost.env` file in the + `testnets/holesky` folder to configure the MEV-Boost service. If you need a + reference, you can use the `.env.example` file in the `mev-boost` directory as a + starting point. -# Test installation -commit-boost --version +If you prefer not to restart your beacon node, follow the instructions in the +[Avoid Restarting the Beacon Node](#avoid-restarting-the-beacon-node) section. + +Once the configuration files are in place, you can start the Docker containers +by running: + +```bash +cd testnets/holesky && docker compose up -d ``` -#### Configuration +The docker compose setup comes with various observability tools, such as +Prometheus and Grafana. It also comes with some pre-built dashboards, which can +be found in the `grafana` directory. + +## Commit-Boost Mode + +First download the `commit-boost-cli` binary from the Commit-Boost [official +releases page](https://github.com/Commit-Boost/commit-boost-client/releases) A commit-boost configuration file with Bolt support is provided at [`cb-bolt-config.toml`](./cb-bolt-config.toml). This file has support for the @@ -59,13 +187,13 @@ To initialize commit-boost, run the following command: commit-boost init --config cb-bolt-config.toml ``` -This will create 3 files: +This will create three files: - `cb.docker-compose.yml`: which contains the full setup of the Commit-Boost services - `.cb.env`: with local env variables, including JWTs for modules - `target.json`: which enables dynamic discovery of services for metrics scraping via Prometheus -#### Running +**Running** The final step is to run the Commit-Boost services. This can be done with the following command: @@ -76,31 +204,669 @@ commit-boost start --docker cb.docker-compose.yml --env .cb.env This will run all modules in Docker containers. > [!IMPORTANT] -> bolt-boost will be exposed at `pbs.port` (18551 by default, set with `BOLT_SIDECAR_BUILDER_PROXY_PORT`), and your beacon node MUST be configured -> to point the `builder-api` to this port for Bolt to work. +> The `bolt-boost` service will be exposed at `pbs.port` (18551 by default, set +> with `BOLT_SIDECAR_BUILDER_PROXY_PORT`), and your beacon node MUST be +> configured to point the `builder-api` to this port for Bolt to work. + +## Native Mode (advanced) + +For running the Bolt Sidecar as a standalone binary you need to have the +following dependencies installed: + +- [git](https://git-scm.com/downloads); +- [Rust](https://www.rust-lang.org/tools/install). +- [Golang](https://golang.org/doc/install). + +Depending on your platform you may need to install additional dependencies. + +
+Linux + +Debian-based distributions: + +```bash +sudo apt update && sudo apt install -y git build-essential libssl-dev build-essential ca-certificates +``` + +Fedora/Red Hat/CentOS distributions: + +```bash +sudo dnf groupinstall "Development Tools" && sudo dnf install -y git openssl-devel ca-certificates pkgconfig +``` + +Arch/Manjaro-based distributions: + +```bash +sudo pacman -Syu --needed base-devel git openssl ca-certificates pkgconf +``` + +Alpine Linux + +```bash +sudo apk add git build-base openssl-dev ca-certificates pkgconf +``` + +
+ +
+ +
+ MacOS + +On MacOS after installing XCode Command Line tools (equivalent to `build-essential` on Linux) you can install the other dependencies with [Homebew](https://brew.sh/): + +```zsh +xcode-select --install +brew install pkg-config openssl +``` + +
+ +--- + +After having installed the dependencies you can clone the Bolt repository by +running: + +```bash +git clone --branch v0.3.0 https://github.com/chainbound/bolt.git && cd bolt +``` + +### Building and running the MEV-Boost fork binary -### Bolt Sidecar +The Bolt protocol relies on a modified version of +[MEV-Boost](https://boost.flashbots.net/) that supports the [Constraints +API](https://docs.boltprotocol.xyz/api/builder). This modified version is +available in the `mev-boost` directory of the project and can be built by +running -WIP +```bash +make build +``` + +in the `mev-boost` directory. The output of the command is a `mev-boost` binary. +To run the `mev-boost` binary please read the official [documentation](https://boost.flashbots.net/). + +If you're already running MEV-Boost along with your beacon client it is +recommended to choose another port this service in order to [avoid restarting +your beacon client](#avoid-restarting-the-beacon-node). Check out the linked +section for more details. + +### Building and running the Bolt sidecar binary + +Then you can build the Bolt sidecar by running: + +```bash +cargo build --release && mv target/release/bolt-sidecar . +``` + +In order to run correctly the sidecar you need to provide either a list command +line options or a configuration file (recommended). All the options available +can be found by running `./bolt-sidecar --help`, or you can find them in the +[reference](#command-line-options) section of this guide. + +#### Configuration file + +A configuration file can be either a `.env` file or a `.toml` file. If you use +`.env` file you can find a `.env.example` file in the repository that you can +use as a template. + +For a `.toml` file you can use the template in the `Config.example.toml`. Lastly +you need to specify the path of the configuration file by setting the +`BOLT_SIDECAR_CONFIG_PATH` environment variable to the path of the file. + +Please read the section on [delegations and signing](#delegations-and-signing-options-for-native-and-docker-compose-mode) +to configure such sidecar options properly. + +After you've set up the configuration file you can run the Bolt sidecar with + +```bash +./bolt-sidecar-cli +``` ### Observability -commit-boost comes with various observability tools, such as Prometheus, cadvisor, and Grafana. It also comes with some pre-built dashboards, -which can be found in the `grafana` directory. +Commit-Boost comes with various observability tools, such as Prometheus, +cadvisor, and Grafana. It also comes with some pre-built dashboards, which can +be found in the `grafana` directory. To update these dashboards, run the following command: +`bash ./update-grafana.sh ` + +In this directory, you can also find a Bolt dashboard, which will be launched +alongside the other dashboards. + +# Register your validators on-chain on the Bolt Registry + +Once you are successfully running the Bolt sidecar you need to register on-chain +on the Bolt Registry to successfully receive preconfirmation requests from users +and RPCs. This step is needed to provide economic security to your +commitments. + +In order to do that you need some collateral in the form of whitelisted Liquid +Staking Token (LST) that needs to be restaked in either the Symbiotic or +EigenLayer protocol. Bolt is compatible with ETH derivatives on Holesky. Here +are references to the supported tokens on both restaking protocols: + +- [Symbiotic Vaults](https://docs.symbiotic.fi/deployments#vaults) + - [`wstETH`](https://holesky.etherscan.io/address/0x8d09a4502Cc8Cf1547aD300E066060D043f6982D) + - [`rETH`](https://holesky.etherscan.io/address/0x7322c24752f79c05FFD1E2a6FCB97020C1C264F1) +- [EigenLayer Strategies](https://github.com/Layr-Labs/eigenlayer-contracts#current-testnet-deployment) + - [`stETH`](https://holesky.etherscan.io/address/0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034) + - [`rETH`](https://holesky.etherscan.io/address/0x7322c24752f79c05FFD1E2a6FCB97020C1C264F1) + - [`wETH`](https://holesky.etherscan.io/address/0x94373a4919B3240D86eA41593D5eBa789FEF3848) + - [`cbETH`](https://holesky.etherscan.io/address/0x8720095Fa5739Ab051799211B146a2EEE4Dd8B37) + - [`mETH`](https://holesky.etherscan.io/address/0xe3C063B1BEe9de02eb28352b55D49D85514C67FF) + +Then you need to interact with two contracts on Holesky: +`BoltValidators` and `BoltManager`. The former is used to register your +active validators into the protocol, while the latter is used to manage to +register as an operator into the system and integrate with the restaking +protocols. + +> [!IMPORTANT] +> When registering your operator in the `BoltManager` contract you must use the +> public key associated to the private key used to sign commitments with the +> Bolt Sidecar (the `--commitment-private-key` flag). + +## Validator Registration + +The [`BoltValidators`](./src/contracts/BoltValidators.sol) contract is the only point of entry for +validators to signal their intent to participate in Bolt Protocol and authenticate with their BLS private key. + +The registration process includes the following steps: + +1. Validator signs a message with their BLS private key. This is required to prove that the + validator private key is under their control and that they are indeed its owner. +2. Validator calls the `registerValidator` function providing: + 1. Their BLS public key + 2. The BLS signature of the registration message + 3. The address of the authorized collateral provider + 4. The address of the authorized operator + +Until the Pectra hard-fork will be activated, the contract will also expose a `registerValidatorUnsafe` function +that will not check the BLS signature. This is gated by a feature flag that will be turned off post-Pectra and +will allow us to test the registration flow in a controlled environment. + +## Bolt Network Entrypoint + +The [`BoltManager`](./src/contracts/BoltManager.sol) contract is a crucial component of Bolt that +integrates with restaking ecosystems Symbiotic and Eigenlayer. It manages the registration and +coordination of validators, operators, and vaults within the Bolt network. + +Key features include: + +1. Retrieval of operator stake and proposer status from their pubkey +2. Integration with Symbiotic +3. Integration with Eigenlayer + +Specific functionalities about the restaking protocols are handled inside +the `IBoltMiddleware` contracts, such as `BoltSymbioticMiddleware` and `BoltEigenlayerMiddleware`. + +### Symbiotic Integration guide for Staking Pools + +As a staking pool, it is assumed that you are already in control of a Symbiotic Vault. +If not, please refer to the [Symbiotic docs](https://docs.symbiotic.fi/handbooks/Handbook%20for%20Vaults) +on how to spin up a Vault and start receiving stake from your node operators. + +Opting into Bolt works as any other Symbiotic middleware integration. Here are the steps: + +1. Make sure your vault collateral is whitelisted in `BoltSymbioticMiddleware` by calling `isCollateralWhitelisted`. +2. Register as a vault in `BoltSymbioticMiddleware` by calling `registerVault`. +3. Verify that your vault is active in `BoltSymbioticMiddleware` by calling `isVaultEnabled`. +4. Set the network limit for your vault in Symbiotic with `Vault.delegator().setNetworkLimit()`. +5. You can now start approving operators that opt in to your vault directly in Symbiotic. +6. When you assign shares to operators, they are able to provide commitments on behalf of your collateral. + +### Symbiotic Integration guide for Operators + +As an operator, you will need to opt-in to the Bolt Network and any Vault that trusts you to provide +commitments on their behalf. + +The opt-in process requires the following steps: + +1. register in Symbiotic with `OperatorRegistry.registerOperator()`. +2. opt-in to the Bolt network with `OperatorNetworkOptInService.optIn(networkAddress)`. +3. opt-in to any vault with `OperatorVaultOptInService.optIn(vaultAddress)`. +4. register in Bolt with `BoltSymbioticMiddleware.registerOperator(operatorAddress)`. +5. get approved by the vault. +6. start providing commitments with the stake provided by the vault. + +### EigenLayer Integration Guide for Node Operators and Solo Stakers + +> [!NOTE] +> Without loss of generality, we will assume the reader of this guide is a Node +> Operator (NO), since the same steps apply to solo stakers. +> As a Node Operator you will be an ["Operator"](https://docs.eigenlayer.xyz/eigenlayer/overview/key-terms) +> in the Bolt AVS built on top of EigenLayer. This requires +> running an Ethereum validator and the Bolt sidecar in order issue +> preconfirmations. + +The Operator will be represented by an Ethereum address that needs +to follow the standard procedure outlined in the +[EigenLayer documentation](https://docs.eigenlayer.xyz/) to opt into EigenLayer. Let's go through the steps: + +1. As an Operator, you register into EigenLayer using [`DelegationManager.registerAsOperator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/DelegationManager.sol#L107-L119). + +2. As an Ethereum validator offering precofirmations a NO needs some collateral in + order to be economically credible. In order to do that, some entities known as a "stakers" + need to deposit whitelisted Liquid Staking Tokens (LSTs) + into an appropriate "Strategy" associated to the LST via the + [`StrategyManager.depositIntoStrategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/StrategyManager.sol#L105-L110), + so that the Operator has a `min_amount` (for Holesky 1 ether) of collateral associated to it. + Whitelisted LSTs are exposed by the `BoltEigenLayerMiddleware` contract + in the `getWhitelistedCollaterals` function. + Note that NOs and stakers can be two different entities + _but there is fully trusted relationship as stakers will be slashed if a NO misbehaves_. + +3. After the stakers have deposited their collateral into a strategy they need + to choose you as their operator. To do that, they need to call the function + [`DelegationManager.delegateTo`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/DelegationManager.sol#L154-L163). + +4. As an Operator you finally opt into the Bolt AVS by interacting with the `BoltEigenLayerMiddleware`. + This consists in calling the function `BoltEigenLayerMiddleware.registerOperatorToAVS`. + The payload is a signature whose digest consists of: + + 1. your operator address + 2. the `BoltEigenLayerMiddleware` contract address + 3. a salt + 4. an expiry 2. + + The contract will then forward the call to the [`AVSDirectory.registerOperatorToAVS`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/AVSDirectory.sol#L64-L108) + with the `msg.sender` set to the Bolt AVS contract. Upon successful verification of the signature, + the operator is considered `REGISTERED` in a mapping `avsOperatorStatus[msg.sender][operator]`. + +Lastly, a NO needs to interact with both the `BoltValidators` and `BoltEigenLayerMiddleware` +contract. This is needed for internal functioning of the AVS and to make RPCs aware that you are a +registered operator and so that they can forward you preconfirmation requests. + +The steps required are the following: + +1. Register all the validator public keys you want to use with Bolt via the `BoltValidators.registerValidator`. + If you own more than one validator public key, + you can use the more gas-efficient `BoltValidators.batchRegisterValidators` function. + The `authorizedOperator` argument must be the same Ethereum address used for + opting into EigenLayer as an Operator. + +2. Register the same Operator address in the `BoltEigenLayerMiddleware` contract by calling + the `BoltEigenLayerMiddleware.registerOperator` function. This formalizes your role within the Bolt network + and allows you to manage operations effectively, such as pausing or resuming + your service. + +3. Register the EigenLayer strategy you are using for restaking _if it has not been done by someone else already_. + This ensures that your restaked assets are correctly integrated with Bolt’s system. + +# Reference + +## Command-line options + +For completeness, here are all the command-line options available for the Bolt +sidecar. You can see them in your terminal by running the Bolt sidecar binary +with the `--help` flag: + +``` +Command-line options for the Bolt sidecar + +Usage: bolt-sidecar [OPTIONS] --engine-jwt-hex --fee-recipient --builder-private-key --commitment-private-key <--constraint-private-key |--commit-boost-signer-url |--keystore-password |--keystore-secrets-path > + +Options: + --port + Port to listen on for incoming JSON-RPC requests of the Commitments API + This port should be open on your firewall in order to receive external requests! + + [env: BOLT_SIDECAR_PORT=] + [default: 8000] + + --execution-api-url + Execution client API URL + + [env: BOLT_SIDECAR_EXECUTION_API_URL=] + [default: http://localhost:8545] + + --beacon-api-url + URL for the beacon client + + [env: BOLT_SIDECAR_BEACON_API_URL=] + [default: http://localhost:5052] + + --engine-api-url + Execution client Engine API URL. This is needed for fallback block + building and must be a synced Geth node + + [env: BOLT_SIDECAR_ENGINE_API_URL=] + [default: http://localhost:8551] + + --constraints-api-url + URL to forward the constraints produced by the Bolt sidecar to a + server supporting the Constraints API, such as an MEV-Boost fork + + [env: BOLT_SIDECAR_CONSTRAINTS_API_URL=] + [default: http://localhost:3030] + + --constraints-proxy-port + The port from which the Bolt sidecar will receive Builder-API requests from the Beacon client + + [env: BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT=] + [default: 18551] + + --validator-indexes + Validator indexes of connected validators that the sidecar should + accept commitments on behalf of. Accepted values: + - a comma-separated list of indexes (e.g. "1,2,3,4") + - a contiguous range of indexes (e.g. "1..4") + - a mix of the above (e.g. "1,2..4,6..8") + + [env: BOLT_SIDECAR_VALIDATOR_INDEXES=] + [default: ] + + --engine-jwt-hex + The JWT secret token to authenticate calls to the engine API. + + It can either be a hex-encoded string or a file path to a file containing the hex-encoded secret. + + [env: BOLT_SIDECAR_ENGINE_JWT_HEX=] + + --fee-recipient + The fee recipient address for fallback blocks + + [env: BOLT_SIDECAR_FEE_RECIPIENT=] + + --builder-private-key + Secret BLS key to sign fallback payloads with + + [env: BOLT_SIDECAR_BUILDER_PRIVATE_KEY=] + + --commitment-private-key + Secret ECDSA key to sign commitment messages with. The public key + associated to it must be then used when registering the operator in the + `BoltManager` contract + + [env: BOLT_SIDECAR_COMMITMENT_PRIVATE_KEY=] + + --max-commitments-per-slot + Max number of commitments to accept per block + + [env: BOLT_SIDECAR_MAX_COMMITMENTS=] + [default: 128] + + --max-committed-gas-per-slot + Max committed gas per slot + + [env: BOLT_SIDECAR_MAX_COMMITTED_GAS=] + [default: 10000000] + + --min-priority-fee + Min priority fee to accept for a commitment + + [env: BOLT_SIDECAR_MIN_PRIORITY_FEE=] + [default: 1000000000] + + --chain + Chain on which the sidecar is running + + [env: BOLT_SIDECAR_CHAIN=] + [default: mainnet] + [possible values: mainnet, holesky, helder, kurtosis] + + --commitment-deadline + The deadline in the slot at which the sidecar will stop accepting new commitments for the next block (parsed as milliseconds) + + [env: BOLT_SIDECAR_COMMITMENT_DEADLINE=] + [default: 8000] + + --slot-time + The slot time duration in seconds. If provided, it overrides the default for the selected [Chain] + + [env: BOLT_SIDECAR_SLOT_TIME=] + [default: 12] + + --constraint-private-key + Private key to use for signing constraint messages + + [env: BOLT_SIDECAR_CONSTRAINT_PRIVATE_KEY=] + + --commit-boost-signer-url + URL for the commit-boost sidecar + + [env: BOLT_SIDECAR_CB_SIGNER_URL=] + + --commit-boost-jwt-hex + JWT in hexadecimal format for authenticating with the commit-boost service + + [env: BOLT_SIDECAR_CB_JWT_HEX=] + + --keystore-password + The password for the ERC-2335 keystore. Reference: https://eips.ethereum.org/EIPS/eip-2335 + + [env: BOLT_SIDECAR_KEYSTORE_PASSWORD=] + + --keystore-secrets-path + The path to the ERC-2335 keystore secret passwords Reference: https://eips.ethereum.org/EIPS/eip-2335 + + [env: BOLT_SIDECAR_KEYSTORE_SECRETS_PATH=] + + --keystore-path + Path to the keystores folder. If not provided, the default path is used + + [env: BOLT_SIDECAR_KEYSTORE_PATH=] + + --delegations-path + Path to the delegations file. If not provided, the default path is used + + [env: BOLT_SIDECAR_DELEGATIONS_PATH=] + + --metrics-port + The port on which to expose Prometheus metrics + + [env: BOLT_SIDECAR_METRICS_PORT=] + [default: 3300] + + --disable-metrics + [env: BOLT_SIDECAR_DISABLE_METRICS=] + + -h, --help + Print help (see a summary with '-h') +``` + +## Delegations and signing options for Native and Docker Compose Mode + +As mentioned in the [prerequisites](#prerequisites) section, the Bolt sidecar +can sign commitments with a delegated set of private keys on behalf of active +Ethereum validators. + +> [!IMPORTANT] +> This is the recommended way to run the Bolt sidecar as it +> doesn't expose the active validator signing keys to any additional risk. + +In order to create these delegation you can use the `bolt-delegations-cli` binary. +If you don't want to use it you can skip the following section. + +### `bolt-delegations-cli` + +`bolt-delegations-cli` is an offline command-line tool for safely generating +delegation and revocation messages signed with a BLS12-381 key for the +[Constraints API](https://docs.boltprotocol.xyz/api/builder) in +[Bolt](https://docs.boltprotocol.xyz/). + +The tool supports two key sources: + +- Local: A BLS private key provided directly from a file. +- Keystore: A keystore file that contains an encrypted BLS private key. + +and outputs a JSON file with the delegation/revocation messages to the provided +`` for the given chain + +Features: + +- Offline usage: Safely generate delegation messages in an offline environment. +- Flexible key source: Support for both direct local BLS private keys and + Ethereum keystore files (ERC-2335 format). +- BLS delegation signing: Sign delegation messages using a BLS secret key and + output the signed delegation in JSON format. + +#### Installation and usage + +Go to the root of the Bolt project you've previously cloned using Git. Enter in +the `bolt-delegations-cli` directory by running `cd bolt-delegations-cli`. + +If you're using the Docker container setup make sure you have +[Rust](https://www.rust-lang.org/tools/install) installed in your system as +well. Then you can build the `bolt-delegations-cli` binary by running: + ```bash -./update-grafana.sh +cargo build --release && mv target/release/bolt-delegations-cli . +``` + +Now you can run the binary by running: + +```bash +./bolt-delegations-cli +``` + +The binary exposes a single `generate` command, which accepts the following +options and subcommands (use `./bolt-delegations-cli generate --help` to see +them): + +```text +Usage: bolt-delegations-cli generate [OPTIONS] --delegatee-pubkey + +Commands: + local Use local private keys to generate the signed messages + keystore Use an EIP-2335 keystore folder to generate the signed messages + help Print this message or the help of the given subcommand(s) + +Options: + --delegatee-pubkey The BLS public key to which the delegation message should be signed [env: DELEGATEE_PUBKEY=] + --out The output file for the delegations [env: OUTPUT_FILE_PATH=] [default: delegations.json] + --chain The chain for which the delegation message is intended [env: CHAIN=] [default: mainnet] [possible values: mainnet, holesky, helder, kurtosis] + --action The action to perform. The tool can be used to generate delegation or revocation messages (default: delegate) [env: ACTION=] [default: delegate] [possible values: delegate, revoke] + -h, --help Print help (see more with '--help') +``` + +The environment variables can be also set in a `.env` file. For a reference +example you can check out the `.env.local.example` and the +`.env.keystore.example` + +In the section below you can see a usage example of the binary. + +#### Delegations CLI Example + +1. Using a local BLS private key: + + ```text + bolt-delegations-cli generate \ + --delegatee-pubkey 0x7890ab... \ + --out my_delegations.json \ + --chain holesky \ + local \ + --secret-keys 0xabc123...,0xdef456.. + ``` + +2. Using a Ethereum keystores files and raw password: + + ```text + bolt-delegations-cli generate \ + --delegatee-pubkey 0x7890ab... \ + --out my_delegations.json \ + --chain holesky \ + keystore \ + --path /keys \ + --password myS3cr3tP@ssw0rd + ``` + +3. Using an Ethereum keystores files and secrets folder + + ```text + bolt-delegations-cli generate \ + --delegatee-pubkey 0x7890ab... \ + --out my_delegations.json \ + --chain holesky \ + keystore \ + --path /keys \ + --password-path /secrets + ``` + +When using the `keystore` key source, the `--path` flag should point to the +directory containing the encrypted keypair directories. + +The keystore folder must adhere to the following structure: + +```text +${KEYSTORE_PATH} +|-- 0x81b676591b823270a3284ace7d81cbce2d6cdce55bb0e053874d7e3a08f729453009d3e662ec3130379f43c0f3210b6d +| `-- voting-keystore.json +|-- 0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb +| `-- voting-keystore.json +|-- ... + `-- ... +``` + +where the folder names are the public keys and inside every +folder there is a single JSON file containing the keystore file. + +In case of validator-specific passwords (e.g. Lighthouse format) the +`--password-path` flag must be used instead of `--password`, pointing to the +directory containing the password files. + +The passwords folder must adhere to a certain structure as well, as shown below. + ``` +${KEYSTORE_PATH} +|-- 0x81b676591b823270a3284ace7d81cbce2d6cdce55bb0e053874d7e3a08f729453009d3e662ec3130379f43c0f3210b6d +|-- 0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb +|-- ... + `-- ... +``` + +That is, the password files should be named after the public key and each file +should just contain one line with the password in plain text. The files +themselves don't need a particular file extension. + +--- + +Now that you have generated the delegation messages you can provide them to the +sidecar using the `--delegations-path` flag (see the +[options](#command-line-options) section). When doing so the sidecar will check if +they're indeed valid messages and will keep in memory the association between +the delegator and the delegatee. + +However in order to sign the commitments you still need to provide the signing +key of the delegatee. There are two ways to do so, as explored in the sections +below. + +### Using a private key directly + +As you can see in the [command line options](#command-line-options) section you +can pass directly the private key as a hex-encoded string to the Bolt sidecar +using the `--private-key` flag. This is the simplest setup and can be used in +case if all the delegations messages point to the same delegatee or if you're +running the sidecar with a single active validator. + +### Using a ERC-2335 Keystore + +The Bolt sidecar supports [ERC-2335](https://eips.ethereum.org/EIPS/eip-2335) keystores for loading signing keypairs. +In order to use them you need to provide the `--keystore-path` pointing to the +folder containing the keystore files and the `--keystore-password` or +`keystore-secrets-path` flag pointing to the folder containing the password +file. -In this directory, you can also find a Bolt dashboard, which will be launched alongside the other dashboards. +Both the `keys` and `passwords` folders must adhere to the structure outlined +in the [Delegations CLI example](#delegations-cli-example) section. -### Validators +## Avoid restarting the beacon node -Validators must be configured to always prefer builder proposals over their own. Refer to client documentation for the specific configuration flags. -**If this is not set, it could lead to commitment faults**. +As mentioned in the [prerequisites](#prerequisites) section, in order to run the +sidecar correctly it might be necessary to restart your beacon client. That is +because you need to configure the `--builder` flag (or equivalent) to point to +the Bolt sidecar endpoint. -#### Registration +However if you're already running a PBS sidecar like +[MEV-Boost](https://boost.flashbots.net/) on the same machine then you can avoid +the restart by following this steps when starting the Bolt sidecar: -WIP +1. Set the `--constraints-proxy-port` flag or the + `BOLT_SIDECAR_BUILDER_PROXY_PORT` environment variable to the port previously occupied by + MEV-Boost. +2. Build the Bolt MEV-Boost fork binary or pull the Docker image and start it + using another port +3. Set the `--constraints-url` flag or the `BOLT_SIDECAR_CONSTRAINTS_URL` to point to the Bolt MEV-Boost instance. From 9852e8859cd2579662d6af712e96a6268cdf3327 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Mon, 21 Oct 2024 16:49:18 +0200 Subject: [PATCH 33/85] fix(holesky): add bolt prefix to all services and containers to avoid conflicts --- testnets/holesky/docker-compose.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/testnets/holesky/docker-compose.yml b/testnets/holesky/docker-compose.yml index 2751212df..f88549f40 100644 --- a/testnets/holesky/docker-compose.yml +++ b/testnets/holesky/docker-compose.yml @@ -1,7 +1,7 @@ services: - bolt-sidecar: + bolt-sidecar-holesky: image: ghcr.io/chainbound/bolt-sidecar:v0.3.0-alpha.rc1 - container_name: bolt-sidecar + container_name: bolt-sidecar-holesky restart: unless-stopped ports: - "${BOLT_SIDECAR_PORT}:${BOLT_SIDECAR_PORT}" # Bolt RPC port (this should be opened on your firewall!) @@ -9,18 +9,18 @@ services: env_file: ./bolt-sidecar.env entrypoint: /bin/sh -c /bolt-sidecar - mev-boost: + bolt-mev-boost-holesky: image: ghcr.io/chainbound/bolt-mev-boost:v0.3.0-alpha.rc1 - container_name: mev-boost + container_name: bolt-mev-boost-holesky restart: unless-stopped env_file: ./mev-boost.env entrypoint: /bin/sh -c '/app/mev-boost' - prometheus: + bolt-prometheus-holesky: image: prom/prometheus:latest - container_name: prometheus + container_name: bolt-prometheus-holesky ports: - - 9090:9090 + - 49090:49090 volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - ./targets.json:/etc/prometheus/targets.json @@ -28,11 +28,11 @@ services: networks: - monitoring_network - grafana: + bolt-grafana-holesky: image: grafana/grafana:latest - container_name: cb_grafana + container_name: bolt-grafana-holesky ports: - - 3000:3000 + - 33000:33000 environment: - GF_SECURITY_ADMIN_PASSWORD=admin volumes: @@ -42,7 +42,7 @@ services: networks: - monitoring_network depends_on: - - prometheus + - bolt-prometheus-holesky logging: driver: none From dbfc2f416d875dda03579381c80ad85646c32600 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Mon, 21 Oct 2024 17:34:40 +0200 Subject: [PATCH 34/85] fix(holesky): docker-compose sidecar entrypoint --- testnets/holesky/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testnets/holesky/docker-compose.yml b/testnets/holesky/docker-compose.yml index f88549f40..7687aa77e 100644 --- a/testnets/holesky/docker-compose.yml +++ b/testnets/holesky/docker-compose.yml @@ -7,7 +7,7 @@ services: - "${BOLT_SIDECAR_PORT}:${BOLT_SIDECAR_PORT}" # Bolt RPC port (this should be opened on your firewall!) - "${BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT}:${BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT}" env_file: ./bolt-sidecar.env - entrypoint: /bin/sh -c /bolt-sidecar + entrypoint: /bin/sh -c /usr/local/bin/bolt-sidecar bolt-mev-boost-holesky: image: ghcr.io/chainbound/bolt-mev-boost:v0.3.0-alpha.rc1 From 6cfdd372fe8a9704700dd08080387f5eecafa7af Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Mon, 21 Oct 2024 17:35:01 +0200 Subject: [PATCH 35/85] fix(sidecar): .env.example --- bolt-sidecar/.env.example | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/bolt-sidecar/.env.example b/bolt-sidecar/.env.example index 98bf60852..7621489a6 100644 --- a/bolt-sidecar/.env.example +++ b/bolt-sidecar/.env.example @@ -6,7 +6,7 @@ BOLT_SIDECAR_ENGINE_API_URL=http://localhost:4451 BOLT_SIDECAR_CONSTRAINTS_URL=http://localhost:19550 BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT=18551 BOLT_SIDECAR_VALIDATOR_INDEXES=0..64 -BOLT_SIDECAR_JWT_HEX= +BOLT_SIDECAR_ENGINE_JWT_HEX= BOLT_SIDECAR_FEE_RECIPIENT= BOLT_SIDECAR_BUILDER_PRIVATE_KEY= @@ -17,17 +17,17 @@ BOLT_SIDECAR_MIN_PRIORITY_FEE= BOLT_SIDECAR_COMMITMENT_DEADLINE=8000 # Chain configs -BOLT_SIDECAR_CHAIN=Holesky +BOLT_SIDECAR_CHAIN=holesky BOLT_SIDECAR_SLOT_TIME=12 -# Signing options -BOLT_SIDECAR_CONSTRAINT_PRIVATE_KEY= -BOLT_SIDECAR_COMMITMENT_PRIVATE_KEY= -BOLT_SIDECAR_CB_SIGNER_URL= -BOLT_SIDECAR_CB_JWT_HEX= -BOLT_SIDECAR_KEYSTORE_PASSWORD= -BOLT_SIDECAR_KEYSTORE_PATH= -BOLT_SIDECAR_DELEGATIONS_PATH= +# Signing options. Uncomment only what you'll use +#BOLT_SIDECAR_CONSTRAINT_PRIVATE_KEY= +#BOLT_SIDECAR_COMMITMENT_PRIVATE_KEY= +#BOLT_SIDECAR_CB_SIGNER_URL= +#BOLT_SIDECAR_CB_JWT_HEX= +#BOLT_SIDECAR_KEYSTORE_PASSWORD= +#BOLT_SIDECAR_KEYSTORE_PATH= +#BOLT_SIDECAR_DELEGATIONS_PATH= # Metrics BOLT_SIDECAR_METRICS_PORT= From 5a2ae133179bc47711b143102d7311ba59620d01 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Mon, 21 Oct 2024 18:20:14 +0200 Subject: [PATCH 36/85] chore(holesky): add simple bash script to create .env stub --- testnets/holesky/README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 526089c56..4ea5dc1f0 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -124,7 +124,13 @@ containing the necessary environment variables: Create a `bolt-sidecar.env` file in the `testnets/holesky` directory. If you need a reference, you can use the `.env.example` file in the `bolt-sidecar` - directory as a starting point. For proper configuration of the signing + directory as a starting point. + + ```bash + cat ./bolt-sidecar/.env.example > ./testnets/holesky/bolt-sidecar.env + ``` + + For proper configuration of the signing options, please refer to the [Delegations and Signing](#delegations-and-signing-options-for-standalone-and-docker-container-setup) section of this guide. @@ -136,6 +142,10 @@ containing the necessary environment variables: reference, you can use the `.env.example` file in the `mev-boost` directory as a starting point. + ```bash + cat ./mev-boost/.env.example > ./testnets/holesky/mev-boost.env + ``` + If you prefer not to restart your beacon node, follow the instructions in the [Avoid Restarting the Beacon Node](#avoid-restarting-the-beacon-node) section. From ff47200529d3045ea87d815990a11553a05696d5 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 10:40:16 +0200 Subject: [PATCH 37/85] chore(sidecar): update Config.example.toml --- bolt-sidecar/Config.example.toml | 87 +++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 23 deletions(-) diff --git a/bolt-sidecar/Config.example.toml b/bolt-sidecar/Config.example.toml index e6caad16e..b76ead584 100644 --- a/bolt-sidecar/Config.example.toml +++ b/bolt-sidecar/Config.example.toml @@ -1,37 +1,78 @@ # Ethereum Node Connections + PBS URLs -port = 8000 -execution_api_url = "http://localhost:4485" -beacon_api_url = "http://localhost:4400" -engine_api_url = "http://localhost:4451" -constraints_url = "http://localhost:19550" -constraints_proxy_port = 18551 + +# Port to listen on for incoming JSON-RPC requests of the Commitments API. This +# port should be open on your firewall in order to receive external requests! +port = 8017 +# Execution client API URL +execution_api_url = "http://localhost:8545" +# URL for the beacon client +beacon_api_url = "http://localhost:5052" +# Execution client Engine API URL. This is needed for fallback block building +# and must be a synced Geth node +engine_api_url = "http://localhost:8551" +# The port from which the Bolt sidecar will receive Builder-API requests from the Beacon client +constraints_proxy_port = 18550 +# URL to forward the constraints produced by the Bolt sidecar to a server +# supporting the Constraints API, such as an MEV-Boost fork +constraints_api_url = "http://localhost:18551" +# Validator indexes of connected validators that the sidecar should accept +# commitments on behalf of. +# Accepted values: +# - a comma-separated list of indexes (e.g. "1,2,3,4") +# - a contiguous range of indexes (e.g. "1..4") +# - a mix of the above (e.g. "1,2..4,6..8") validator_indexes = "0..64" -jwt_hex = "0x0000000000000000000000000000000000000000000000000000000000000000" +# The JWT secret token to authenticate calls to the engine API. It can be +# either be a hex-encoded string or a file path to a file containing the +# hex-encoded secret. +engine_jwt_hex = "0x0000000000000000000000000000000000000000000000000000000000000000" +# The fee recipient address for fallback blocks fee_recipient = "0x0000000000000000000000000000000000000000" +# Secret ECDSA key to sign commitment messages with. The public key associated +# to it must be then used when registering the operator in the `BoltManager` +# contract +commitment_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" +# Secret BLS key to sign fallback payloads with builder_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" -# Commitments configs -max_commitments = 128 -max_committed_gas = 10000000 -min_priority_fee = 5000000 +# Commitments limits +[limits] +# Max number of commitments to accept per block +max_commitments_per_slot = 128 +# Max committed gas per slot +max_committed_gas_per_slot = 10_000_000 +# Min priority fee to accept for a commitment +min_priority_fee = 4_000_000_000 # 4 Gwei = 4 * 10^9 wei -# Chain configs +# Chain configuration [chain] -chain = "Holesky" +# Chain on which the sidecar is running +chain = "holesky" +# The slot time duration in seconds. If provided, it overrides the default for +# the selected [chain] slot_time = 12 +# The deadline in the slot at which the sidecar will stop accepting new +# commitments for the next block (parsed as milliseconds) commitment_deadline = 8000 -# Signing options +# Signing options. Uncomment only the signing setup you'll use: +# - single private key -> `constraints_private_key` +# - commit-boost -> `cb_signer_url`, `cb_jwt_hex` +# - keystores -> `keystore_path`, `keystore_password` or `keystore_secrets_path` +# (depending on whether all keystores have the same passwords or not) +# +# If you plan to use delegations, uncomment the option `delegations_path` as +# well. [constraint_signing] -constraint_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" -commitment_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" -cb_signer_url = "http://localhost:18550" -cb_jwt_hex = "0x0000000000000000000000000000000000000000000000000000000000000000" -keystore_password = "password" -keystore_path = "./keys" -delegations_path = "./delegations.json" +# Private key to use for signing constraint messages +# constraint_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" +# cb_signer_url = "http://localhost:18551" +# cb_jwt_hex = "0x0000000000000000000000000000000000000000000000000000000000000000" +# keystore_password = "password" +# keystore_path = "./keys" +# delegations_path = "./delegations.json" -# Metrics +# Telemetry and Metrics [telemetry] -metrics_port = 8001 +metrics_port = 3300 disable_metrics = false From 55abca913bc8be275fb96a15da6d8879ca1ef6d7 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 10:40:51 +0200 Subject: [PATCH 38/85] chore(sidecar): review CLI options and their defaults --- bolt-sidecar/src/config/chain.rs | 30 ++++++++++++++++++++++-------- bolt-sidecar/src/config/mod.rs | 14 ++++++++------ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/bolt-sidecar/src/config/chain.rs b/bolt-sidecar/src/config/chain.rs index 4ce4f88a6..98edb7248 100644 --- a/bolt-sidecar/src/config/chain.rs +++ b/bolt-sidecar/src/config/chain.rs @@ -1,4 +1,5 @@ -use std::time::Duration; +use core::fmt; +use std::{fmt::Display, time::Duration}; use clap::{Args, ValueEnum}; use ethereum_consensus::deneb::{compute_fork_data_root, Root}; @@ -25,7 +26,7 @@ pub const COMMIT_BOOST_DOMAIN_MASK: [u8; 4] = [109, 109, 111, 67]; #[derive(Debug, Clone, Copy, Args, Deserialize)] pub struct ChainConfig { /// Chain on which the sidecar is running - #[clap(long, env = "BOLT_SIDECAR_CHAIN", default_value = "mainnet")] + #[clap(long, env = "BOLT_SIDECAR_CHAIN", default_value_t = Chain::Mainnet)] chain: Chain, /// The deadline in the slot at which the sidecar will stop accepting /// new commitments for the next block (parsed as milliseconds). @@ -65,6 +66,24 @@ pub enum Chain { Kurtosis, } +impl Chain { + /// Get the chain name for the given chain. + pub fn name(&self) -> &'static str { + match self { + Chain::Mainnet => "mainnet", + Chain::Holesky => "holesky", + Chain::Helder => "helder", + Chain::Kurtosis => "kurtosis", + } + } +} + +impl Display for Chain { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.name()) + } +} + impl ChainConfig { /// Get the chain ID for the given chain. pub fn chain_id(&self) -> u64 { @@ -78,12 +97,7 @@ impl ChainConfig { /// Get the chain name for the given chain. pub fn name(&self) -> &'static str { - match self.chain { - Chain::Mainnet => "mainnet", - Chain::Holesky => "holesky", - Chain::Helder => "helder", - Chain::Kurtosis => "kurtosis", - } + self.chain.name() } /// Get the slot time for the given chain in seconds. diff --git a/bolt-sidecar/src/config/mod.rs b/bolt-sidecar/src/config/mod.rs index fcade3aee..1b9e64b76 100644 --- a/bolt-sidecar/src/config/mod.rs +++ b/bolt-sidecar/src/config/mod.rs @@ -23,11 +23,13 @@ use limits::LimitsOpts; use crate::common::{BlsSecretKeyWrapper, EcdsaSecretKeyWrapper, JwtSecretConfig}; -/// Default port for the JSON-RPC server exposed by the sidecar. -pub const DEFAULT_RPC_PORT: u16 = 8000; +/// Default port for the JSON-RPC server exposed by the sidecar supporting the Commitments API. +/// +/// 8017 -> BOLT :) +pub const DEFAULT_RPC_PORT: u16 = 8017; -/// Default port for the Constraints proxy server. -pub const DEFAULT_CONSTRAINTS_PROXY_PORT: u16 = 18551; +/// Default port for the Constraints proxy server, binded to the default port used by MEV-Boost. +pub const DEFAULT_CONSTRAINTS_PROXY_PORT: u16 = 18550; /// Command-line options for the Bolt sidecar #[derive(Debug, Parser, Deserialize)] @@ -52,7 +54,7 @@ pub struct Opts { #[clap( long, env = "BOLT_SIDECAR_CONSTRAINTS_API_URL", - default_value = "http://localhost:3030" + default_value = "http://localhost:18551" )] pub constraints_api_url: Url, /// The port from which the Bolt sidecar will receive Builder-API requests from the @@ -68,7 +70,7 @@ pub struct Opts { /// - a comma-separated list of indexes (e.g. "1,2,3,4") /// - a contiguous range of indexes (e.g. "1..4") /// - a mix of the above (e.g. "1,2..4,6..8") - #[clap(long, env = "BOLT_SIDECAR_VALIDATOR_INDEXES", default_value_t)] + #[clap(long, env = "BOLT_SIDECAR_VALIDATOR_INDEXES")] pub validator_indexes: ValidatorIndexes, /// The JWT secret token to authenticate calls to the engine API. /// From dc93a4ec4ec62030dc451f4974140001089392b4 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 10:51:34 +0200 Subject: [PATCH 39/85] chore(sidecar): add Config.toml to .gitignore --- bolt-sidecar/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/bolt-sidecar/.gitignore b/bolt-sidecar/.gitignore index 2e73cb821..8fd11d943 100644 --- a/bolt-sidecar/.gitignore +++ b/bolt-sidecar/.gitignore @@ -2,3 +2,4 @@ target/ .env* !.env.example bolt-sidecar* +Config.toml From 90d3142a5aae77d5b27b813fa2d59591c4d4c0c9 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 10:51:52 +0200 Subject: [PATCH 40/85] feat(sidecar): allow reading TOML config from default path --- bolt-sidecar/bin/sidecar.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bolt-sidecar/bin/sidecar.rs b/bolt-sidecar/bin/sidecar.rs index c7fbf60cc..6903fffbd 100644 --- a/bolt-sidecar/bin/sidecar.rs +++ b/bolt-sidecar/bin/sidecar.rs @@ -1,13 +1,19 @@ +use std::fs; + use clap::Parser; use eyre::{bail, Result}; use tracing::info; use bolt_sidecar::{telemetry::init_telemetry_stack, Opts, SidecarDriver}; +pub const TOML_CONFIG_DEFAULT_PATH: &str = "./Config.toml"; + #[tokio::main] async fn main() -> Result<()> { let opts = if let Ok(config_path) = std::env::var("BOLT_SIDECAR_CONFIG_PATH") { Opts::parse_from_toml(config_path.as_str())? + } else if fs::exists(TOML_CONFIG_DEFAULT_PATH).is_ok_and(|exists| exists) { + Opts::parse_from_toml(TOML_CONFIG_DEFAULT_PATH)? } else { Opts::parse() }; From d3b34e7a46f6584e479547b1190ccc70c25906d8 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 11:00:43 +0200 Subject: [PATCH 41/85] chore(holesky): add *.toml to .gitignore --- testnets/holesky/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/testnets/holesky/.gitignore b/testnets/holesky/.gitignore index ef456d924..71c6e0c11 100644 --- a/testnets/holesky/.gitignore +++ b/testnets/holesky/.gitignore @@ -1,2 +1,3 @@ *.env* !*.env.example +*.toml From dc46e2696f0ded383338c9130adc86ce44882342 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 11:03:14 +0200 Subject: [PATCH 42/85] fix(holesky): broken links in README, use TOML config file instead of .env for the sidecar --- testnets/holesky/README.md | 49 +++++++++++++++----------------------- 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 4ea5dc1f0..47c849756 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -122,17 +122,17 @@ containing the necessary environment variables: 1. **Bolt Sidecar Configuration:** - Create a `bolt-sidecar.env` file in the `testnets/holesky` directory. If you - need a reference, you can use the `.env.example` file in the `bolt-sidecar` + Create a `bolt-sidecar.toml` file in the `testnets/holesky` directory. If you + need a reference, you can use the `Config.example.toml` file in the `bolt-sidecar` directory as a starting point. ```bash - cat ./bolt-sidecar/.env.example > ./testnets/holesky/bolt-sidecar.env + cat ./bolt-sidecar/Config.example.toml > ./testnets/holesky/bolt-sidecar.toml ``` For proper configuration of the signing options, please refer to the [Delegations and - Signing](#delegations-and-signing-options-for-standalone-and-docker-container-setup) + Signing](#delegations-and-signing-options-for-native-and-docker-compose-mode) section of this guide. 2. **MEV-Boost Configuration:** @@ -316,15 +316,13 @@ can be found by running `./bolt-sidecar --help`, or you can find them in the #### Configuration file -A configuration file can be either a `.env` file or a `.toml` file. If you use -`.env` file you can find a `.env.example` file in the repository that you can -use as a template. - -For a `.toml` file you can use the template in the `Config.example.toml`. Lastly -you need to specify the path of the configuration file by setting the +You can use a `Config.toml` file to configure the sidecar, for which you can +find a template in the `Config.example.toml` file. +If you wish to place the configuration file in another folder you need to +specify the path of the configuration file by setting the `BOLT_SIDECAR_CONFIG_PATH` environment variable to the path of the file. -Please read the section on [delegations and signing](#delegations-and-signing-options-for-native-and-docker-compose-mode) +Please read the section on [Delegations and Signing](#delegations-and-signing-options-for-native-and-docker-compose-mode) to configure such sidecar options properly. After you've set up the configuration file you can run the Bolt sidecar with @@ -517,15 +515,14 @@ with the `--help` flag: ``` Command-line options for the Bolt sidecar -Usage: bolt-sidecar [OPTIONS] --engine-jwt-hex --fee-recipient --builder-private-key --commitment-private-key <--constraint-private-key |--commit-boost-signer-url |--keystore-password |--keystore-secrets-path > +Usage: bolt-sidecar [OPTIONS] --validator-indexes --engine-jwt-hex --fee-recipient --builder-private-key --commitment-private-key <--constraint-private-key |--commit-boost-signer-url |--keystore-password |--keystore-secrets-path > Options: --port - Port to listen on for incoming JSON-RPC requests of the Commitments API - This port should be open on your firewall in order to receive external requests! + Port to listen on for incoming JSON-RPC requests of the Commitments API. This port should be open on your firewall in order to receive external requests! [env: BOLT_SIDECAR_PORT=] - [default: 8000] + [default: 8017] --execution-api-url Execution client API URL @@ -540,34 +537,28 @@ Options: [default: http://localhost:5052] --engine-api-url - Execution client Engine API URL. This is needed for fallback block - building and must be a synced Geth node + Execution client Engine API URL. This is needed for fallback block building and must be a synced Geth node [env: BOLT_SIDECAR_ENGINE_API_URL=] [default: http://localhost:8551] --constraints-api-url - URL to forward the constraints produced by the Bolt sidecar to a - server supporting the Constraints API, such as an MEV-Boost fork + URL to forward the constraints produced by the Bolt sidecar to a server supporting the Constraints API, such as an MEV-Boost fork [env: BOLT_SIDECAR_CONSTRAINTS_API_URL=] - [default: http://localhost:3030] + [default: http://localhost:18551] --constraints-proxy-port The port from which the Bolt sidecar will receive Builder-API requests from the Beacon client [env: BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT=] - [default: 18551] + [default: 18550] --validator-indexes - Validator indexes of connected validators that the sidecar should - accept commitments on behalf of. Accepted values: - - a comma-separated list of indexes (e.g. "1,2,3,4") - - a contiguous range of indexes (e.g. "1..4") - - a mix of the above (e.g. "1,2..4,6..8") + Validator indexes of connected validators that the sidecar should accept commitments on behalf of. Accepted values: - a comma-separated list of indexes (e.g. "1,2,3,4") - a contiguous range of indexes (e.g. "1..4") - a mix of the + above (e.g. "1,2..4,6..8") [env: BOLT_SIDECAR_VALIDATOR_INDEXES=] - [default: ] --engine-jwt-hex The JWT secret token to authenticate calls to the engine API. @@ -587,9 +578,7 @@ Options: [env: BOLT_SIDECAR_BUILDER_PRIVATE_KEY=] --commitment-private-key - Secret ECDSA key to sign commitment messages with. The public key - associated to it must be then used when registering the operator in the - `BoltManager` contract + Secret ECDSA key to sign commitment messages with. The public key associated to it must be then used when registering the operator in the `BoltManager` contract [env: BOLT_SIDECAR_COMMITMENT_PRIVATE_KEY=] From 1e412c53dd99a83b699715ac30075da3553960a2 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 11:13:11 +0200 Subject: [PATCH 43/85] chore(holesky): update docker-compose.yml --- testnets/holesky/docker-compose.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/testnets/holesky/docker-compose.yml b/testnets/holesky/docker-compose.yml index 7687aa77e..830402af8 100644 --- a/testnets/holesky/docker-compose.yml +++ b/testnets/holesky/docker-compose.yml @@ -4,10 +4,11 @@ services: container_name: bolt-sidecar-holesky restart: unless-stopped ports: - - "${BOLT_SIDECAR_PORT}:${BOLT_SIDECAR_PORT}" # Bolt RPC port (this should be opened on your firewall!) - - "${BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT}:${BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT}" - env_file: ./bolt-sidecar.env - entrypoint: /bin/sh -c /usr/local/bin/bolt-sidecar + - "${BOLT_SIDECAR_PORT:-8017}:${BOLT_SIDECAR_PORT:-8017}" # Bolt RPC port (this should be opened on your firewall!) + - "${BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT:-18550}:${BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT:-18550}" + entrypoint: /bin/sh -c "BOLT_SIDECAR_CONFIG_PATH=/etc/bolt-sidecar.toml /usr/local/bin/bolt-sidecar" + volumes: + - "./bolt-sidecar.toml:/etc/bolt-sidecar.toml" bolt-mev-boost-holesky: image: ghcr.io/chainbound/bolt-mev-boost:v0.3.0-alpha.rc1 From 32d4027af1621af45a90904f192f900691359123 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 12:09:17 +0200 Subject: [PATCH 44/85] fix(sidecar): min_priority_fee is now u128 and not NonZero This caused issue when parsing from TOML string. Also if that value is zero is not a problem actually --- bolt-sidecar/src/config/limits.rs | 4 ++-- bolt-sidecar/src/state/execution.rs | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bolt-sidecar/src/config/limits.rs b/bolt-sidecar/src/config/limits.rs index b33561072..7e50d24b8 100644 --- a/bolt-sidecar/src/config/limits.rs +++ b/bolt-sidecar/src/config/limits.rs @@ -31,7 +31,7 @@ pub struct LimitsOpts { env = "BOLT_SIDECAR_MIN_PRIORITY_FEE", default_value_t = LimitsOpts::default().min_priority_fee )] - pub min_priority_fee: NonZero, + pub min_priority_fee: u128, } impl Default for LimitsOpts { @@ -41,7 +41,7 @@ impl Default for LimitsOpts { .expect("Valid non-zero"), max_committed_gas_per_slot: NonZero::new(DEFAULT_MAX_COMMITTED_GAS) .expect("Valid non-zero"), - min_priority_fee: NonZero::new(DEFAULT_MIN_PRIORITY_FEE).expect("Valid non-zero"), + min_priority_fee: DEFAULT_MIN_PRIORITY_FEE, } } } diff --git a/bolt-sidecar/src/state/execution.rs b/bolt-sidecar/src/state/execution.rs index b82418317..f6e4262d9 100644 --- a/bolt-sidecar/src/state/execution.rs +++ b/bolt-sidecar/src/state/execution.rs @@ -299,7 +299,7 @@ impl ExecutionState { } // Ensure max_priority_fee_per_gas is greater than or equal to min_priority_fee - if !req.validate_min_priority_fee(max_basefee, self.limits.min_priority_fee.get()) { + if !req.validate_min_priority_fee(max_basefee, self.limits.min_priority_fee) { return Err(ValidationError::MaxPriorityFeePerGasTooLow); } @@ -764,7 +764,7 @@ mod tests { let limits = LimitsOpts { max_commitments_per_slot: NonZero::new(10).unwrap(), max_committed_gas_per_slot: NonZero::new(5_000_000).unwrap(), - min_priority_fee: NonZero::new(200000000).unwrap(), // 0.2 gwei + min_priority_fee: 200000000, // 0.2 gwei }; let mut state = ExecutionState::new(client.clone(), limits).await?; @@ -803,7 +803,7 @@ mod tests { let limits = LimitsOpts { max_commitments_per_slot: NonZero::new(10).unwrap(), max_committed_gas_per_slot: NonZero::new(5_000_000).unwrap(), - min_priority_fee: NonZero::new(2000000000).unwrap(), + min_priority_fee: 2000000000, }; let mut state = ExecutionState::new(client.clone(), limits).await?; @@ -834,7 +834,7 @@ mod tests { let limits = LimitsOpts { max_commitments_per_slot: NonZero::new(10).unwrap(), max_committed_gas_per_slot: NonZero::new(5_000_000).unwrap(), - min_priority_fee: NonZero::new(2 * GWEI_TO_WEI as u128).unwrap(), + min_priority_fee: 2 * GWEI_TO_WEI as u128, }; let mut state = ExecutionState::new(client.clone(), limits).await?; @@ -876,7 +876,7 @@ mod tests { let limits = LimitsOpts { max_commitments_per_slot: NonZero::new(10).unwrap(), max_committed_gas_per_slot: NonZero::new(5_000_000).unwrap(), - min_priority_fee: NonZero::new(2 * GWEI_TO_WEI as u128).unwrap(), + min_priority_fee: 2 * GWEI_TO_WEI as u128, }; let mut state = ExecutionState::new(client.clone(), limits).await?; @@ -923,7 +923,7 @@ mod tests { let limits = LimitsOpts { max_commitments_per_slot: NonZero::new(10).unwrap(), max_committed_gas_per_slot: NonZero::new(5_000_000).unwrap(), - min_priority_fee: NonZero::new(2 * GWEI_TO_WEI as u128).unwrap(), + min_priority_fee: 2 * GWEI_TO_WEI as u128, }; let mut state = ExecutionState::new(client.clone(), limits).await?; @@ -1061,7 +1061,7 @@ mod tests { let limits: LimitsOpts = LimitsOpts { max_commitments_per_slot: NonZero::new(10).unwrap(), max_committed_gas_per_slot: NonZero::new(5_000_000).unwrap(), - min_priority_fee: NonZero::new(1000000000).unwrap(), + min_priority_fee: 1000000000, }; let mut state = ExecutionState::new(client.clone(), limits).await?; From a72034de2cdee2527adc09f759d0eb4050b8974e Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 12:13:08 +0200 Subject: [PATCH 45/85] fix(holesky): cat -> cp in README --- testnets/holesky/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 47c849756..1e75c3cb9 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -127,7 +127,7 @@ containing the necessary environment variables: directory as a starting point. ```bash - cat ./bolt-sidecar/Config.example.toml > ./testnets/holesky/bolt-sidecar.toml + cp ./bolt-sidecar/Config.example.toml ./testnets/holesky/bolt-sidecar.toml ``` For proper configuration of the signing @@ -143,7 +143,7 @@ containing the necessary environment variables: starting point. ```bash - cat ./mev-boost/.env.example > ./testnets/holesky/mev-boost.env + cp ./mev-boost/.env.example ./testnets/holesky/mev-boost.env ``` If you prefer not to restart your beacon node, follow the instructions in the From d603b4dd4606d81a3f35abaaaed76b3f69da9ba0 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 12:13:34 +0200 Subject: [PATCH 46/85] chore(holesky): delegations flag in README --- testnets/holesky/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 1e75c3cb9..9d91de16e 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -742,6 +742,11 @@ Options: -h, --help Print help (see more with '--help') ``` +> [!TIP] +> If you're using the Docker Compose Mode please don't set the `--out` flag and +> provide `delegations_path = /etc/delegations.json` in the `bolt-sidecar.toml` +> file. + The environment variables can be also set in a `.env` file. For a reference example you can check out the `.env.local.example` and the `.env.keystore.example` From 5cc0f3d62ed3bad7571d77f340b4d7a16bccc515 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 12:13:52 +0200 Subject: [PATCH 47/85] fix(holesky): provide delegations cli volume --- testnets/holesky/docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/testnets/holesky/docker-compose.yml b/testnets/holesky/docker-compose.yml index 830402af8..86d2c3dce 100644 --- a/testnets/holesky/docker-compose.yml +++ b/testnets/holesky/docker-compose.yml @@ -9,6 +9,7 @@ services: entrypoint: /bin/sh -c "BOLT_SIDECAR_CONFIG_PATH=/etc/bolt-sidecar.toml /usr/local/bin/bolt-sidecar" volumes: - "./bolt-sidecar.toml:/etc/bolt-sidecar.toml" + - "../../bolt-delegations-cli/delegations.json:/etc/delegations.json" bolt-mev-boost-holesky: image: ghcr.io/chainbound/bolt-mev-boost:v0.3.0-alpha.rc1 From 551146741ffcbc0c33501ab0b88c1628411e23ef Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Mon, 21 Oct 2024 17:17:35 +0200 Subject: [PATCH 48/85] docs(holesky): update instructions --- testnets/holesky/README.md | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 9d91de16e..4b80c8241 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -5,7 +5,7 @@ This document provides instructions for running the Bolt sidecar on the Holesky * [Prerequisites](#prerequisites) -* [Setup](#setup) +* [Off-Chain Setup](#off-chain-setup) * [Docker Mode (recommended)](#docker-mode-(recommended)) * [Commit-Boost Mode](#commit-boost-mode) * [Native Mode (advanced)](#native-mode-(advanced)) @@ -13,7 +13,7 @@ This document provides instructions for running the Bolt sidecar on the Holesky * [Building and running the Bolt sidecar binary](#building-and-running-the-bolt-sidecar-binary) * [Configuration file](#configuration-file) * [Observability](#observability) -* [Register your validators on-chain on the Bolt Registry](#register-your-validators-on-chain-on-the-bolt-registry) +* [On-Chain Registration](#on-chain-registration) * [Validator Registration](#validator-registration) * [Bolt Network Entrypoint](#bolt-network-entrypoint) * [Symbiotic Integration guide for Staking Pools](#symbiotic-integration-guide-for-staking-pools) @@ -33,7 +33,7 @@ This document provides instructions for running the Bolt sidecar on the Holesky # Prerequisites -In order to run Bolt you need some components already installed and running in +In order to run Bolt you need some components already installed and running on your system. **A synced Geth client:** @@ -76,13 +76,7 @@ client implementations to download and run them. The Bolt sidecar requires signing keys from active Ethereum validators, or authorized delegates acting on their behalf, to issue and sign preconfirmations. -**LST collateral:** - -For Holesky in order to provide credible proposer commitments it is necessary to -restake 1 ether worth of ETH derivatives per validator in either the Symbiotic -or the EigenLayer protocol. - -# Setup +# Off-Chain Setup There are various way to run the Bolt Sidecar depending on what infrastructure you want to use and your preferred signing methods: @@ -157,8 +151,7 @@ cd testnets/holesky && docker compose up -d ``` The docker compose setup comes with various observability tools, such as -Prometheus and Grafana. It also comes with some pre-built dashboards, which can -be found in the `grafana` directory. +Prometheus and Grafana. It also comes with some pre-built dashboards which you can find at `http://localhost:3000`. ## Commit-Boost Mode @@ -344,7 +337,7 @@ To update these dashboards, run the following command: In this directory, you can also find a Bolt dashboard, which will be launched alongside the other dashboards. -# Register your validators on-chain on the Bolt Registry +# On-Chain Registration Once you are successfully running the Bolt sidecar you need to register on-chain on the Bolt Registry to successfully receive preconfirmation requests from users From 8432b433d5599a9c923a5f8f08c10e015e90f8b2 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Mon, 21 Oct 2024 17:46:17 +0200 Subject: [PATCH 49/85] docs(holesky): smol chagnes --- testnets/holesky/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 4b80c8241..b4fea395d 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -104,7 +104,7 @@ First, make sure to have both [Docker](https://docs.docker.com/engine/install/), Then clone the Bolt repository by running: ```bash -git clone --branch v0.3.0 htts://github.com/chainbound/bolt.git && cd bolt +git clone --branch v0.3.0-alpha htts://github.com/chainbound/bolt.git && cd bolt ``` The Docker Compose setup will spin up the Bolt sidecar along with the Bolt From bdeacac0724a3c1618da02f471ec8a1be71b554d Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Mon, 21 Oct 2024 18:26:05 +0200 Subject: [PATCH 50/85] docs(holesky): smol changes --- testnets/holesky/README.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index b4fea395d..af896fa11 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -67,6 +67,9 @@ client implementations to download and run them. > --builder-fallback-disable-checks > ``` > +> In other clients like Vouch, the same can be achieved by setting the `builder-boost-factor` to a large value +> like 18446744073709551615. +> > It might be necessary to restart your beacon node depending on your existing > setup. See the [Avoid Restarting the Beacon > Node](#avoid-restarting-the-beacon-node) for more details. @@ -124,17 +127,20 @@ containing the necessary environment variables: cp ./bolt-sidecar/Config.example.toml ./testnets/holesky/bolt-sidecar.toml ``` - For proper configuration of the signing - options, please refer to the [Delegations and + Next up, fill out all the values that are required. For proper configuration + of the signing options, please refer to the [Delegations and Signing](#delegations-and-signing-options-for-native-and-docker-compose-mode) section of this guide. 2. **MEV-Boost Configuration:** - Similarly, create a `mev-boost.env` file in the - `testnets/holesky` folder to configure the MEV-Boost service. If you need a - reference, you can use the `.env.example` file in the `mev-boost` directory as a - starting point. + Copy over the example environment file: + + ```bash + cp ../../mev-boost/.env.example mev-boost.env + ``` + + Then configure the file accordingly. ```bash cp ./mev-boost/.env.example ./testnets/holesky/mev-boost.env From 59510dbfb0c283eafca544bbcee543867d50e390 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Mon, 21 Oct 2024 18:45:07 +0200 Subject: [PATCH 51/85] docs(holesky): validator registration script --- testnets/holesky/README.md | 55 +++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index af896fa11..34e41aaff 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -350,10 +350,10 @@ on the Bolt Registry to successfully receive preconfirmation requests from users and RPCs. This step is needed to provide economic security to your commitments. -In order to do that you need some collateral in the form of whitelisted Liquid -Staking Token (LST) that needs to be restaked in either the Symbiotic or -EigenLayer protocol. Bolt is compatible with ETH derivatives on Holesky. Here -are references to the supported tokens on both restaking protocols: +In order to do that you need some collateral in the form of whitelisted ETH derivative +tokens that need to be restaked in either the Symbiotic or +EigenLayer protocol. Bolt is compatible with the following ETH derivative tokens +on Holesky: - [Symbiotic Vaults](https://docs.symbiotic.fi/deployments#vaults) - [`wstETH`](https://holesky.etherscan.io/address/0x8d09a4502Cc8Cf1547aD300E066060D043f6982D) @@ -376,6 +376,24 @@ protocols. > public key associated to the private key used to sign commitments with the > Bolt Sidecar (the `--commitment-private-key` flag). +## Prerequisites + +- Install the Foundry tools: + +```bash +curl -L https://foundry.paradigm.xyz | bash +source $HOME/.bashrc +foundryup +``` + +- Clone the Bolt repo and navigate to the [contracts](https://github.com/chainbound/bolt/tree/unstable/bolt-contracts) directory: + +```bash +git clone https://github.com/chainbound/bolt +cd bolt-contracts +forge install +``` + ## Validator Registration The [`BoltValidators`](./src/contracts/BoltValidators.sol) contract is the only point of entry for @@ -395,6 +413,35 @@ Until the Pectra hard-fork will be activated, the contract will also expose a `r that will not check the BLS signature. This is gated by a feature flag that will be turned off post-Pectra and will allow us to test the registration flow in a controlled environment. +Note that the account initiating the registration will be the `controller` account for those validators. Only the `controller` can then +deregister validator or change any preferences. + +### Registration Steps + +> [!NOTE] +> All of these scripts can be simulated on a Holesky fork using Anvil with the following command: +> ```bash +> anvil --fork-url https://holesky.drpc.org +> ``` +> In order to use this local fork, replace `$HOLESKY_RPC` with localhost:8545 in all of the `forge` commands below. + +To register your validators, we provide the following Foundry script: [`RegisterValidators.s.sol`](../../bolt-contracts/script/RegisterValidators.s.sol). +Note that in order to run these scripts, you must be in the `bolt-contracts` directory. + +- First, configure [`bolt-contracts/config/holesky/validators.json`](../../bolt-contracts/config/holesky/validators.json) to your requirements. Note that +both `maxCommittedGasLimit` and `authorizedOperator` must reflect the values specified in previous steps, during the configuration of the sidecar. +`pubkeys` should be configured with all of the validator public keys that you wish to register. + +- Next up, decide on a controller account and save the key in an environment variable: `export CONTROLLER_KEY=0x...`. +This controller key will be used to run the script and will mark the corresponding account as the controller account for these validators. + +- Finally, run the script: +```bash +forge script script/holesky/validators/RegisterValidators.s.sol -vvvv --rpc-url $HOLESKY_RPC --private-key $CONTROLLER_KEY --broadcast +``` + +If the script executed succesfully, your validators were registered. + ## Bolt Network Entrypoint The [`BoltManager`](./src/contracts/BoltManager.sol) contract is a crucial component of Bolt that From 808d0906b00a3073927f0fa9e4985b7e49f0676b Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Tue, 22 Oct 2024 10:25:18 +0200 Subject: [PATCH 52/85] docs(holesky): operator registration --- testnets/holesky/README.md | 115 +++++++++++++------------------------ 1 file changed, 41 insertions(+), 74 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 34e41aaff..72988c64d 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -444,7 +444,7 @@ If the script executed succesfully, your validators were registered. ## Bolt Network Entrypoint -The [`BoltManager`](./src/contracts/BoltManager.sol) contract is a crucial component of Bolt that +The [`BoltManager`](../../bolt-contracts/src/contracts/BoltManagerV1.sol) contract is a crucial component of Bolt that integrates with restaking ecosystems Symbiotic and Eigenlayer. It manages the registration and coordination of validators, operators, and vaults within the Bolt network. @@ -457,44 +457,46 @@ Key features include: Specific functionalities about the restaking protocols are handled inside the `IBoltMiddleware` contracts, such as `BoltSymbioticMiddleware` and `BoltEigenlayerMiddleware`. -### Symbiotic Integration guide for Staking Pools +## Operator Registration +In this section we outline how to register as an operator, i.e. an entity uniquely identified by an Ethereum address and responsible for +duties like signing commitments. Note that in Bolt, there is no real separation between validators and an operator. An operator is only real in +the sense that its private key will be used to sign commitments on the corresponding validators' sidecars. However, we need a way to logically +connect validators to an on-chain address associated with some stake, which is what the operator is. -As a staking pool, it is assumed that you are already in control of a Symbiotic Vault. -If not, please refer to the [Symbiotic docs](https://docs.symbiotic.fi/handbooks/Handbook%20for%20Vaults) -on how to spin up a Vault and start receiving stake from your node operators. +**In the next sections we assume you have saved the private key corresponding to the operator address in `$OPERATOR_SK`.** This private key will +be read by the Forge scripts for registering operators and needs to be set correctly. You also have to invoke the scripts from the +[`bolt-contracts`](../../bolt-contracts) directory. -Opting into Bolt works as any other Symbiotic middleware integration. Here are the steps: - -1. Make sure your vault collateral is whitelisted in `BoltSymbioticMiddleware` by calling `isCollateralWhitelisted`. -2. Register as a vault in `BoltSymbioticMiddleware` by calling `registerVault`. -3. Verify that your vault is active in `BoltSymbioticMiddleware` by calling `isVaultEnabled`. -4. Set the network limit for your vault in Symbiotic with `Vault.delegator().setNetworkLimit()`. -5. You can now start approving operators that opt in to your vault directly in Symbiotic. -6. When you assign shares to operators, they are able to provide commitments on behalf of your collateral. - -### Symbiotic Integration guide for Operators +### Symbiotic Registration Steps As an operator, you will need to opt-in to the Bolt Network and any Vault that trusts you to provide -commitments on their behalf. +commitments on their behalf. The opt-in process requires the following steps: +#### External Steps + +> [!NOTE] The network and supported vault addresses can be found in [`deployments.json`](../../bolt-contracts/config/holesky/deployments.json). + 1. register in Symbiotic with `OperatorRegistry.registerOperator()`. 2. opt-in to the Bolt network with `OperatorNetworkOptInService.optIn(networkAddress)`. 3. opt-in to any vault with `OperatorVaultOptInService.optIn(vaultAddress)`. -4. register in Bolt with `BoltSymbioticMiddleware.registerOperator(operatorAddress)`. -5. get approved by the vault. -6. start providing commitments with the stake provided by the vault. -### EigenLayer Integration Guide for Node Operators and Solo Stakers +#### Internal Steps -> [!NOTE] -> Without loss of generality, we will assume the reader of this guide is a Node -> Operator (NO), since the same steps apply to solo stakers. -> As a Node Operator you will be an ["Operator"](https://docs.eigenlayer.xyz/eigenlayer/overview/key-terms) -> in the Bolt AVS built on top of EigenLayer. This requires -> running an Ethereum validator and the Bolt sidecar in order issue -> preconfirmations. +Run the provided Forge script to register a Symbiotic operator: + +```bash +forge script script/holesky/validators/RegisterSymbioticOperator.s.sol --rpc-url $HOLESKY_RPC -vvvv --broadcast +``` + +If all goes well, your Symbiotic operator was registered into Bolt. + +### EigenLayer Registration Steps + +#### External Steps + +> [!NOTE] The supported strategies can be found in [`deployments.json`](../../bolt-contracts/config/holesky/deployments.json). The Operator will be represented by an Ethereum address that needs to follow the standard procedure outlined in the @@ -502,53 +504,18 @@ to follow the standard procedure outlined in the 1. As an Operator, you register into EigenLayer using [`DelegationManager.registerAsOperator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/DelegationManager.sol#L107-L119). -2. As an Ethereum validator offering precofirmations a NO needs some collateral in - order to be economically credible. In order to do that, some entities known as a "stakers" - need to deposit whitelisted Liquid Staking Tokens (LSTs) - into an appropriate "Strategy" associated to the LST via the - [`StrategyManager.depositIntoStrategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/StrategyManager.sol#L105-L110), - so that the Operator has a `min_amount` (for Holesky 1 ether) of collateral associated to it. - Whitelisted LSTs are exposed by the `BoltEigenLayerMiddleware` contract - in the `getWhitelistedCollaterals` function. - Note that NOs and stakers can be two different entities - _but there is fully trusted relationship as stakers will be slashed if a NO misbehaves_. - -3. After the stakers have deposited their collateral into a strategy they need - to choose you as their operator. To do that, they need to call the function - [`DelegationManager.delegateTo`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/DelegationManager.sol#L154-L163). - -4. As an Operator you finally opt into the Bolt AVS by interacting with the `BoltEigenLayerMiddleware`. - This consists in calling the function `BoltEigenLayerMiddleware.registerOperatorToAVS`. - The payload is a signature whose digest consists of: - - 1. your operator address - 2. the `BoltEigenLayerMiddleware` contract address - 3. a salt - 4. an expiry 2. - - The contract will then forward the call to the [`AVSDirectory.registerOperatorToAVS`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/AVSDirectory.sol#L64-L108) - with the `msg.sender` set to the Bolt AVS contract. Upon successful verification of the signature, - the operator is considered `REGISTERED` in a mapping `avsOperatorStatus[msg.sender][operator]`. - -Lastly, a NO needs to interact with both the `BoltValidators` and `BoltEigenLayerMiddleware` -contract. This is needed for internal functioning of the AVS and to make RPCs aware that you are a -registered operator and so that they can forward you preconfirmation requests. - -The steps required are the following: - -1. Register all the validator public keys you want to use with Bolt via the `BoltValidators.registerValidator`. - If you own more than one validator public key, - you can use the more gas-efficient `BoltValidators.batchRegisterValidators` function. - The `authorizedOperator` argument must be the same Ethereum address used for - opting into EigenLayer as an Operator. - -2. Register the same Operator address in the `BoltEigenLayerMiddleware` contract by calling - the `BoltEigenLayerMiddleware.registerOperator` function. This formalizes your role within the Bolt network - and allows you to manage operations effectively, such as pausing or resuming - your service. - -3. Register the EigenLayer strategy you are using for restaking _if it has not been done by someone else already_. - This ensures that your restaked assets are correctly integrated with Bolt’s system. +2. You can then use the same account to deposit into a supported EigenLayer strategy using [`StrategyManager.depositIntoStrategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/StrategyManager.sol#L105-L110). This will add the deposit into the collateral of the operator +so that Bolt can read it. Note that you need to deposit a minimum of `1 ether` of the strategies underlying token in order to opt in. + +#### Internal Steps + +Set the operator private key to an `OPERATOR_SK` environment variable, and then run the following Forge script from the `bolt-contracts` directory: + +```bash +forge script script/holesky/validators/RegisterEigenLayerOperator.s.sol --rpc-url $HOLESKY_RPC -vvvv --broadcast +``` + +If all goes well, your EigenLayer operator was registered into Bolt. # Reference From 3cbbc7dd1dfa1ac1698938b714d2b5fdf99ff4e3 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 13:24:53 +0200 Subject: [PATCH 53/85] chore(holesky): README fmt --- testnets/holesky/README.md | 160 ++++++++++++++++++++++--------------- 1 file changed, 96 insertions(+), 64 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 72988c64d..f3fe42e53 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -15,10 +15,11 @@ This document provides instructions for running the Bolt sidecar on the Holesky * [Observability](#observability) * [On-Chain Registration](#on-chain-registration) * [Validator Registration](#validator-registration) + * [Registration Steps](#registration-steps) * [Bolt Network Entrypoint](#bolt-network-entrypoint) - * [Symbiotic Integration guide for Staking Pools](#symbiotic-integration-guide-for-staking-pools) - * [Symbiotic Integration guide for Operators](#symbiotic-integration-guide-for-operators) - * [EigenLayer Integration Guide for Node Operators and Solo Stakers](#eigenlayer-integration-guide-for-node-operators-and-solo-stakers) + * [Operator Registration](#operator-registration) + * [Symbiotic Registration Steps](#symbiotic-registration-steps) + * [EigenLayer Registration Steps](#eigenlayer-registration-steps) * [Reference](#reference) * [Command-line options](#command-line-options) * [Delegations and signing options for Native and Docker Compose Mode](#delegations-and-signing-options-for-native-and-docker-compose-mode) @@ -67,8 +68,9 @@ client implementations to download and run them. > --builder-fallback-disable-checks > ``` > -> In other clients like Vouch, the same can be achieved by setting the `builder-boost-factor` to a large value -> like 18446744073709551615. +> In other clients like Vouch, the same can be achieved by setting the +> `builder-boost-factor` to a large value like `18446744073709551615` (`2**64 - +1`). > > It might be necessary to restart your beacon node depending on your existing > setup. See the [Avoid Restarting the Beacon @@ -134,18 +136,14 @@ containing the necessary environment variables: 2. **MEV-Boost Configuration:** - Copy over the example environment file: - - ```bash - cp ../../mev-boost/.env.example mev-boost.env - ``` - - Then configure the file accordingly. + Copy over the example configuration file: ```bash cp ./mev-boost/.env.example ./testnets/holesky/mev-boost.env ``` + Then configure it accordingly. + If you prefer not to restart your beacon node, follow the instructions in the [Avoid Restarting the Beacon Node](#avoid-restarting-the-beacon-node) section. @@ -376,7 +374,7 @@ protocols. > public key associated to the private key used to sign commitments with the > Bolt Sidecar (the `--commitment-private-key` flag). -## Prerequisites +**Prerequisites** - Install the Foundry tools: @@ -396,46 +394,60 @@ forge install ## Validator Registration -The [`BoltValidators`](./src/contracts/BoltValidators.sol) contract is the only point of entry for -validators to signal their intent to participate in Bolt Protocol and authenticate with their BLS private key. +The [`BoltValidators`](./src/contracts/BoltValidators.sol) contract is the only +point of entry for validators to signal their intent to participate in Bolt +Protocol and authenticate with their BLS private key. The registration process includes the following steps: -1. Validator signs a message with their BLS private key. This is required to prove that the - validator private key is under their control and that they are indeed its owner. +1. Validator signs a message with their BLS private key. This is required to + prove that the validator private key is under their control and that they are + indeed its owner. 2. Validator calls the `registerValidator` function providing: 1. Their BLS public key 2. The BLS signature of the registration message 3. The address of the authorized collateral provider 4. The address of the authorized operator -Until the Pectra hard-fork will be activated, the contract will also expose a `registerValidatorUnsafe` function -that will not check the BLS signature. This is gated by a feature flag that will be turned off post-Pectra and -will allow us to test the registration flow in a controlled environment. +Until the Pectra hard-fork will be activated, the contract will also expose a +`registerValidatorUnsafe` function that will not check the BLS signature. This +is gated by a feature flag that will be turned off post-Pectra and will allow us +to test the registration flow in a controlled environment. -Note that the account initiating the registration will be the `controller` account for those validators. Only the `controller` can then -deregister validator or change any preferences. +Note that the account initiating the registration will be the `controller` +account for those validators. Only the `controller` can then deregister +validator or change any preferences. ### Registration Steps > [!NOTE] -> All of these scripts can be simulated on a Holesky fork using Anvil with the following command: -> ```bash -> anvil --fork-url https://holesky.drpc.org -> ``` -> In order to use this local fork, replace `$HOLESKY_RPC` with localhost:8545 in all of the `forge` commands below. - -To register your validators, we provide the following Foundry script: [`RegisterValidators.s.sol`](../../bolt-contracts/script/RegisterValidators.s.sol). -Note that in order to run these scripts, you must be in the `bolt-contracts` directory. - -- First, configure [`bolt-contracts/config/holesky/validators.json`](../../bolt-contracts/config/holesky/validators.json) to your requirements. Note that -both `maxCommittedGasLimit` and `authorizedOperator` must reflect the values specified in previous steps, during the configuration of the sidecar. -`pubkeys` should be configured with all of the validator public keys that you wish to register. - -- Next up, decide on a controller account and save the key in an environment variable: `export CONTROLLER_KEY=0x...`. -This controller key will be used to run the script and will mark the corresponding account as the controller account for these validators. +> All of these scripts can be simulated on a Holesky fork using Anvil with the +> following command: +> +> `bash anvil --fork-url https://holesky.drpc.org ` +> +> In order to use this local fork, replace `$HOLESKY_RPC` with localhost:8545 in +> all of the `forge` commands below. + +To register your validators, we provide the following Foundry script: +[`RegisterValidators.s.sol`](../../bolt-contracts/script/RegisterValidators.s.sol). +Note that in order to run these scripts, you must be in the `bolt-contracts` +directory. + +- First, configure + [`bolt-contracts/config/holesky/validators.json`](../../bolt-contracts/config/holesky/validators.json) + to your requirements. Note that both `maxCommittedGasLimit` and + `authorizedOperator` must reflect the values specified in previous steps, during + the configuration of the sidecar. `pubkeys` should be configured with all of the + validator public keys that you wish to register. + +- Next up, decide on a controller account and save the key in an environment + variable: `export CONTROLLER_KEY=0x...`. This controller key will be used to run + the script and will mark the corresponding account as the controller account for + these validators. - Finally, run the script: + ```bash forge script script/holesky/validators/RegisterValidators.s.sol -vvvv --rpc-url $HOLESKY_RPC --private-key $CONTROLLER_KEY --broadcast ``` @@ -444,8 +456,9 @@ If the script executed succesfully, your validators were registered. ## Bolt Network Entrypoint -The [`BoltManager`](../../bolt-contracts/src/contracts/BoltManagerV1.sol) contract is a crucial component of Bolt that -integrates with restaking ecosystems Symbiotic and Eigenlayer. It manages the registration and +The [`BoltManager`](../../bolt-contracts/src/contracts/BoltManagerV1.sol) +contract is a crucial component of Bolt that integrates with restaking +ecosystems Symbiotic and Eigenlayer. It manages the registration and coordination of validators, operators, and vaults within the Bolt network. Key features include: @@ -454,35 +467,45 @@ Key features include: 2. Integration with Symbiotic 3. Integration with Eigenlayer -Specific functionalities about the restaking protocols are handled inside -the `IBoltMiddleware` contracts, such as `BoltSymbioticMiddleware` and `BoltEigenlayerMiddleware`. +Specific functionalities about the restaking protocols are handled inside the +`IBoltMiddleware` contracts, such as `BoltSymbioticMiddleware` and +`BoltEigenlayerMiddleware`. ## Operator Registration -In this section we outline how to register as an operator, i.e. an entity uniquely identified by an Ethereum address and responsible for -duties like signing commitments. Note that in Bolt, there is no real separation between validators and an operator. An operator is only real in -the sense that its private key will be used to sign commitments on the corresponding validators' sidecars. However, we need a way to logically -connect validators to an on-chain address associated with some stake, which is what the operator is. -**In the next sections we assume you have saved the private key corresponding to the operator address in `$OPERATOR_SK`.** This private key will -be read by the Forge scripts for registering operators and needs to be set correctly. You also have to invoke the scripts from the -[`bolt-contracts`](../../bolt-contracts) directory. +In this section we outline how to register as an operator, i.e. an entity +uniquely identified by an Ethereum address and responsible for duties like +signing commitments. Note that in Bolt, there is no real separation between +validators and an operator. An operator is only real in the sense that its +private key will be used to sign commitments on the corresponding validators' +sidecars. However, we need a way to logically connect validators to an on-chain +address associated with some stake, which is what the operator is. + +**In the next sections we assume you have saved the private key corresponding to +the operator address in `$OPERATOR_SK`.** This private key will be read by the +Forge scripts for registering operators and needs to be set correctly. You also +have to invoke the scripts from the [`bolt-contracts`](../../bolt-contracts) +directory. ### Symbiotic Registration Steps -As an operator, you will need to opt-in to the Bolt Network and any Vault that trusts you to provide -commitments on their behalf. +As an operator, you will need to opt-in to the Bolt Network and any Vault that +trusts you to provide commitments on their behalf. The opt-in process requires the following steps: -#### External Steps +**External Steps** -> [!NOTE] The network and supported vault addresses can be found in [`deployments.json`](../../bolt-contracts/config/holesky/deployments.json). +> [!NOTE] +> The network and supported vault addresses can be found in +> [`deployments.json`](../../bolt-contracts/config/holesky/deployments.json). 1. register in Symbiotic with `OperatorRegistry.registerOperator()`. -2. opt-in to the Bolt network with `OperatorNetworkOptInService.optIn(networkAddress)`. +2. opt-in to the Bolt network with + `OperatorNetworkOptInService.optIn(networkAddress)`. 3. opt-in to any vault with `OperatorVaultOptInService.optIn(vaultAddress)`. -#### Internal Steps +**Internal Steps** Run the provided Forge script to register a Symbiotic operator: @@ -494,22 +517,31 @@ If all goes well, your Symbiotic operator was registered into Bolt. ### EigenLayer Registration Steps -#### External Steps +**External Steps** -> [!NOTE] The supported strategies can be found in [`deployments.json`](../../bolt-contracts/config/holesky/deployments.json). +> [!NOTE] +> The supported strategies can be found in +> [`deployments.json`](../../bolt-contracts/config/holesky/deployments.json). -The Operator will be represented by an Ethereum address that needs -to follow the standard procedure outlined in the -[EigenLayer documentation](https://docs.eigenlayer.xyz/) to opt into EigenLayer. Let's go through the steps: +The Operator will be represented by an Ethereum address that needs to follow the +standard procedure outlined in the [EigenLayer +documentation](https://docs.eigenlayer.xyz/) to opt into EigenLayer. Let's go +through the steps: -1. As an Operator, you register into EigenLayer using [`DelegationManager.registerAsOperator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/DelegationManager.sol#L107-L119). +1. As an Operator, you register into EigenLayer using + [`DelegationManager.registerAsOperator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/DelegationManager.sol#L107-L119). -2. You can then use the same account to deposit into a supported EigenLayer strategy using [`StrategyManager.depositIntoStrategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/StrategyManager.sol#L105-L110). This will add the deposit into the collateral of the operator -so that Bolt can read it. Note that you need to deposit a minimum of `1 ether` of the strategies underlying token in order to opt in. +2. You can then use the same account to deposit into a supported EigenLayer + strategy using + [`StrategyManager.depositIntoStrategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/StrategyManager.sol#L105-L110). + This will add the deposit into the collateral of the operator so that Bolt can + read it. Note that you need to deposit a minimum of `1 ether` of the strategies + underlying token in order to opt in. -#### Internal Steps +**Internal Steps** -Set the operator private key to an `OPERATOR_SK` environment variable, and then run the following Forge script from the `bolt-contracts` directory: +Set the operator private key to an `OPERATOR_SK` environment variable, and then +run the following Forge script from the `bolt-contracts` directory: ```bash forge script script/holesky/validators/RegisterEigenLayerOperator.s.sol --rpc-url $HOLESKY_RPC -vvvv --broadcast From 4131a9294887d247e515d32e93282411342bb2d3 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 13:51:03 +0200 Subject: [PATCH 54/85] chore(holesky): validator controller reference on README --- testnets/holesky/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index f3fe42e53..531f3d982 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -443,8 +443,9 @@ directory. - Next up, decide on a controller account and save the key in an environment variable: `export CONTROLLER_KEY=0x...`. This controller key will be used to run - the script and will mark the corresponding account as the controller account for - these validators. + the script and will mark the corresponding account as the [controller + account](https://github.com/chainbound/bolt/blob/06bdd8e75d759d91f6178ad73f962b1f4ad43fd8/bolt-contracts/src/interfaces/IBoltValidatorsV1.sol#L18-L19) + for these validators. - Finally, run the script: From 9fb22a15755d8acb051b7e917d7abca045dd24b8 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 14:04:01 +0200 Subject: [PATCH 55/85] fix(holesky): stale flags in README --- testnets/holesky/README.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 531f3d982..fb6594a4e 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -888,17 +888,21 @@ below. As you can see in the [command line options](#command-line-options) section you can pass directly the private key as a hex-encoded string to the Bolt sidecar -using the `--private-key` flag. This is the simplest setup and can be used in +using the `--constraint-private-key` flag (or `constraint_private_key` in the +TOML file). + +This is the simplest setup and can be used in case if all the delegations messages point to the same delegatee or if you're running the sidecar with a single active validator. ### Using a ERC-2335 Keystore -The Bolt sidecar supports [ERC-2335](https://eips.ethereum.org/EIPS/eip-2335) keystores for loading signing keypairs. -In order to use them you need to provide the `--keystore-path` pointing to the -folder containing the keystore files and the `--keystore-password` or -`keystore-secrets-path` flag pointing to the folder containing the password -file. +The Bolt sidecar supports [ERC-2335](https://eips.ethereum.org/EIPS/eip-2335) +keystores for loading signing keypairs. In order to use them you need to provide +the `--keystore-path` pointing to the folder containing the keystore files and +the `--keystore-password` or `keystore-secrets-path` flag pointing to the folder +containing the password file (in the TOML configuration file these are the +`keystore_path`, `keystore_password` and `keystore_secrets_path` respectively). Both the `keys` and `passwords` folders must adhere to the structure outlined in the [Delegations CLI example](#delegations-cli-example) section. @@ -914,9 +918,9 @@ However if you're already running a PBS sidecar like [MEV-Boost](https://boost.flashbots.net/) on the same machine then you can avoid the restart by following this steps when starting the Bolt sidecar: -1. Set the `--constraints-proxy-port` flag or the - `BOLT_SIDECAR_BUILDER_PROXY_PORT` environment variable to the port previously occupied by - MEV-Boost. +1. Set the `--constraints-proxy-port` flag (the `constraints_proxy_port` option + in the TOML file) to the port previously occupied by MEV-Boost. 2. Build the Bolt MEV-Boost fork binary or pull the Docker image and start it using another port -3. Set the `--constraints-url` flag or the `BOLT_SIDECAR_CONSTRAINTS_URL` to point to the Bolt MEV-Boost instance. +3. Set the `--constraints-api-url` flag (or the `constraints_api_url` in the + TOML file) to point to the Bolt MEV-Boost instance. From 3b8731caadc66fb89427901736a7d2d1789b2b70 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Tue, 22 Oct 2024 14:04:19 +0200 Subject: [PATCH 56/85] chore(sidecar): mark required fields in the Config.example.toml --- bolt-sidecar/Config.example.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bolt-sidecar/Config.example.toml b/bolt-sidecar/Config.example.toml index b76ead584..2bb86003b 100644 --- a/bolt-sidecar/Config.example.toml +++ b/bolt-sidecar/Config.example.toml @@ -21,18 +21,23 @@ constraints_api_url = "http://localhost:18551" # - a comma-separated list of indexes (e.g. "1,2,3,4") # - a contiguous range of indexes (e.g. "1..4") # - a mix of the above (e.g. "1,2..4,6..8") +# REQUIRED validator_indexes = "0..64" # The JWT secret token to authenticate calls to the engine API. It can be # either be a hex-encoded string or a file path to a file containing the # hex-encoded secret. +# REQUIRED engine_jwt_hex = "0x0000000000000000000000000000000000000000000000000000000000000000" # The fee recipient address for fallback blocks +# REQUIRED fee_recipient = "0x0000000000000000000000000000000000000000" # Secret ECDSA key to sign commitment messages with. The public key associated # to it must be then used when registering the operator in the `BoltManager` # contract +# REQUIRED commitment_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" # Secret BLS key to sign fallback payloads with +# REQUIRED builder_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" # Commitments limits @@ -69,6 +74,7 @@ commitment_deadline = 8000 # cb_signer_url = "http://localhost:18551" # cb_jwt_hex = "0x0000000000000000000000000000000000000000000000000000000000000000" # keystore_password = "password" +# keystore_secrets_path = "./secrets" # keystore_path = "./keys" # delegations_path = "./delegations.json" From 6663b1890acaa3081039eeb24949b0b8bcb01a8d Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Wed, 23 Oct 2024 10:31:36 +0200 Subject: [PATCH 57/85] fix(holesky): wrong code links and snippets in README --- testnets/holesky/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index fb6594a4e..fa1a31cfd 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -424,9 +424,9 @@ validator or change any preferences. > All of these scripts can be simulated on a Holesky fork using Anvil with the > following command: > -> `bash anvil --fork-url https://holesky.drpc.org ` +> `anvil --fork-url https://holesky.drpc.org --port 8545` > -> In order to use this local fork, replace `$HOLESKY_RPC` with localhost:8545 in +> In order to use this local fork, replace `$HOLESKY_RPC` with `localhost:8545` in > all of the `forge` commands below. To register your validators, we provide the following Foundry script: @@ -530,11 +530,11 @@ documentation](https://docs.eigenlayer.xyz/) to opt into EigenLayer. Let's go through the steps: 1. As an Operator, you register into EigenLayer using - [`DelegationManager.registerAsOperator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/DelegationManager.sol#L107-L119). + [`DelegationManager.registerAsOperator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/DelegationManager.sol#L107-L119). 2. You can then use the same account to deposit into a supported EigenLayer strategy using - [`StrategyManager.depositIntoStrategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/StrategyManager.sol#L105-L110). + [`StrategyManager.depositIntoStrategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/StrategyManager.sol#L303-L322). This will add the deposit into the collateral of the operator so that Bolt can read it. Note that you need to deposit a minimum of `1 ether` of the strategies underlying token in order to opt in. From cd48a2aa1ca8d611d9ca626fd3d5bf71ca9f7a14 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Wed, 23 Oct 2024 17:41:11 +0200 Subject: [PATCH 58/85] feat(holesky): test commit grafana dashboard and prometheus setup --- .../grafana/dashboards/bolt_dashboard.json | 740 ++++++++++++++++-- .../grafana/datasources/datasources.yml | 6 +- testnets/holesky/targets.json | 14 + 3 files changed, 686 insertions(+), 74 deletions(-) create mode 100644 testnets/holesky/targets.json diff --git a/testnets/holesky/grafana/dashboards/bolt_dashboard.json b/testnets/holesky/grafana/dashboards/bolt_dashboard.json index 886ddfe02..dce85acb0 100644 --- a/testnets/holesky/grafana/dashboards/bolt_dashboard.json +++ b/testnets/holesky/grafana/dashboards/bolt_dashboard.json @@ -15,36 +15,144 @@ } ] }, - "description": "Metrics related to the bolt-sidecar and bolt-boost.", "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "id": 3, + "id": 2, "links": [], + "liveNow": false, "panels": [ { - "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, "gridPos": { - "h": 1, - "w": 24, + "h": 8, + "w": 12, "x": 0, "y": 0 }, - "id": 2, - "panels": [], - "title": "Bolt sidecar", - "type": "row" + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "builder", + "expr": "bolt_sidecar_transactions_preconfirmed", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Transactions Preconfirmed", + "type": "timeseries" }, { "datasource": { - "default": true, "type": "prometheus", - "uid": "cb_prometheus" + "uid": "PBFA97CFB590B2093" }, "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } }, "mappings": [], "thresholds": { @@ -53,6 +161,10 @@ { "color": "green", "value": null + }, + { + "color": "red", + "value": 80 } ] } @@ -62,67 +174,130 @@ "gridPos": { "h": 8, "w": 12, - "x": 0, - "y": 1 + "x": 12, + "y": 0 }, - "id": 1, + "id": 10, "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "tooltip": { + "mode": "single", + "sort": "none" + } }, - "pluginVersion": "11.2.0", "targets": [ { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "PBFA97CFB590B2093" }, - "disableTextWrap": false, "editorMode": "builder", - "expr": "bolt_sidecar_latest_head", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, + "expr": "bolt_sidecar_validation_errors", "legendFormat": "__auto", "range": true, - "refId": "A", - "useBackend": false + "refId": "A" } ], - "title": "Latest head", - "type": "stat" + "title": "Invalid Transactions Reasons", + "type": "timeseries" }, { - "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "stepAfter", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, "gridPos": { - "h": 1, - "w": 24, + "h": 8, + "w": 12, "x": 0, - "y": 9 + "y": 8 }, - "id": 4, - "panels": [], - "title": "Bolt boost", - "type": "row" + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "builder", + "expr": "bolt_sidecar_remote_blocks_proposed", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Remote Blocks Proposed", + "type": "timeseries" }, { "datasource": { - "default": true, "type": "prometheus", - "uid": "cb_prometheus" + "uid": "PBFA97CFB590B2093" }, "fieldConfig": { "defaults": { @@ -130,13 +305,11 @@ "mode": "palette-classic" }, "custom": { - "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, - "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -145,8 +318,7 @@ "tooltip": false, "viz": false }, - "insertNulls": false, - "lineInterpolation": "linear", + "lineInterpolation": "stepAfter", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { @@ -182,10 +354,10 @@ "gridPos": { "h": 8, "w": 12, - "x": 0, - "y": 10 + "x": 12, + "y": 8 }, - "id": 3, + "id": 4, "options": { "legend": { "calcs": [], @@ -202,25 +374,451 @@ { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "PBFA97CFB590B2093" }, - "disableTextWrap": false, "editorMode": "builder", - "expr": "cb_pbs_constraints_cache_size", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{__name__}}", + "expr": "bolt_sidecar_inclusion_commitments_received", + "legendFormat": "__auto", "range": true, - "refId": "A", - "useBackend": false + "refId": "A" } ], - "title": "Constraints cache size", + "title": "Inclusion Commitments Received", "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "stepAfter", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "{__name__=\"bolt_sidecar_local_blocks_proposed\", instance=\"172.16.0.25:9063\", job=\"bolt-sidecar\"}" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.5.12", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "builder", + "exemplar": false, + "expr": "bolt_sidecar_local_blocks_proposed", + "instant": false, + "interval": "", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Local Blocks Proposed", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "stepAfter", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "builder", + "expr": "bolt_sidecar_inclusion_commitments_accepted", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Inclusion Commitments Accepted", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "builder", + "expr": "bolt_sidecar_http_requests_total", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Total HTTP Requests", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1 + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 24 + }, + "id": 7, + "options": { + "bucketOffset": 0, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "builder", + "expr": "bolt_sidecar_http_requests_duration_seconds", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "HTTP Requests Durations in ms", + "type": "histogram" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 0, + "y": 32 + }, + "id": 3, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.12", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "builder", + "expr": "bolt_sidecar_latest_head", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Latest Head Slot", + "type": "stat" } ], - "schemaVersion": 39, + "refresh": "", + "schemaVersion": 38, + "style": "dark", "tags": [], "templating": { "list": [] @@ -230,9 +828,9 @@ "to": "now" }, "timepicker": {}, - "timezone": "browser", - "title": "Bolt Metrics", - "uid": "edxnwlpgaw934c", + "timezone": "", + "title": "Bolt Sidecar", + "uid": "e5960f6d-a1ed-4538-9c7c-3ecba4d4b4b1", "version": 3, "weekStart": "" } diff --git a/testnets/holesky/grafana/datasources/datasources.yml b/testnets/holesky/grafana/datasources/datasources.yml index 6d29d617b..91e10e2b4 100644 --- a/testnets/holesky/grafana/datasources/datasources.yml +++ b/testnets/holesky/grafana/datasources/datasources.yml @@ -1,11 +1,11 @@ apiVersion: 1 datasources: - - name: cb-prometheus + - name: bolt-prometheus-holesky type: prometheus - uid: cb_prometheus + uid: bolt-prometheus-holesky access: proxy orgId: 1 - url: http://cb_prometheus:9090 + url: http://bolt-prometheus-holesky:49090 isDefault: true editable: true diff --git a/testnets/holesky/targets.json b/testnets/holesky/targets.json new file mode 100644 index 000000000..6cd87cbc6 --- /dev/null +++ b/testnets/holesky/targets.json @@ -0,0 +1,14 @@ +[ + { + "targets": ["bolt-sidecar-holesky:8017"], + "labels": { + "job": "bolt-sidecar-rpc" + } + }, + { + "targets": ["bolt-sidecar-holesky:18550"], + "labels": { + "job": "bolt-sidecar-builder-proxy" + } + } +] From a017f92e81ab5d925e05da83b526eb4cc8b3326c Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Wed, 23 Oct 2024 10:53:16 +0200 Subject: [PATCH 59/85] fix(contracts): move operators scripts into new operators folder --- .../RegisterEigenLayerOperator.s.sol | 0 .../{validators => operators}/RegisterSymbioticOperator.s.sol | 0 testnets/holesky/README.md | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename bolt-contracts/script/holesky/{validators => operators}/RegisterEigenLayerOperator.s.sol (100%) rename bolt-contracts/script/holesky/{validators => operators}/RegisterSymbioticOperator.s.sol (100%) diff --git a/bolt-contracts/script/holesky/validators/RegisterEigenLayerOperator.s.sol b/bolt-contracts/script/holesky/operators/RegisterEigenLayerOperator.s.sol similarity index 100% rename from bolt-contracts/script/holesky/validators/RegisterEigenLayerOperator.s.sol rename to bolt-contracts/script/holesky/operators/RegisterEigenLayerOperator.s.sol diff --git a/bolt-contracts/script/holesky/validators/RegisterSymbioticOperator.s.sol b/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol similarity index 100% rename from bolt-contracts/script/holesky/validators/RegisterSymbioticOperator.s.sol rename to bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index fa1a31cfd..4a6f6df60 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -511,7 +511,7 @@ The opt-in process requires the following steps: Run the provided Forge script to register a Symbiotic operator: ```bash -forge script script/holesky/validators/RegisterSymbioticOperator.s.sol --rpc-url $HOLESKY_RPC -vvvv --broadcast +forge script script/holesky/operators/RegisterSymbioticOperator.s.sol --rpc-url $HOLESKY_RPC -vvvv --broadcast ``` If all goes well, your Symbiotic operator was registered into Bolt. @@ -545,7 +545,7 @@ Set the operator private key to an `OPERATOR_SK` environment variable, and then run the following Forge script from the `bolt-contracts` directory: ```bash -forge script script/holesky/validators/RegisterEigenLayerOperator.s.sol --rpc-url $HOLESKY_RPC -vvvv --broadcast +forge script script/holesky/operators/RegisterEigenLayerOperator.s.sol --rpc-url $HOLESKY_RPC -vvvv --broadcast ``` If all goes well, your EigenLayer operator was registered into Bolt. From 32c63919690ec9fce0d011af8116c87e6a80e6be Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Wed, 23 Oct 2024 11:46:03 +0200 Subject: [PATCH 60/85] feat(holesky): EL script for StrategyManager.depositIntoStrategy --- .../config/holesky/deployments.json | 74 +++++++++--------- bolt-contracts/config/holesky/operator.json | 9 ++- .../eigenlayer/depositIntoStrategy.json | 5 ++ .../RegisterEigenLayerOperator.s.sol | 59 +++++++++++++- testnets/holesky/README.md | 77 ++++++++++++++----- 5 files changed, 159 insertions(+), 65 deletions(-) create mode 100644 bolt-contracts/config/holesky/operators/eigenlayer/depositIntoStrategy.json diff --git a/bolt-contracts/config/holesky/deployments.json b/bolt-contracts/config/holesky/deployments.json index a5a41415d..2866f9e27 100644 --- a/bolt-contracts/config/holesky/deployments.json +++ b/bolt-contracts/config/holesky/deployments.json @@ -1,38 +1,38 @@ { - "bolt": { - "validators": "0x47D2DC1DE1eFEFA5e6944402f2eda3981D36a9c8", - "parameters": "0x20d1cf3A5BD5928dB3118b2CfEF54FDF9fda5c12", - "manager": "0x440202829b493F9FF43E730EB5e8379EEa3678CF" - }, - "symbiotic": { - "network": "0xb017002D8024d8c8870A5CECeFCc63887650D2a4", - "operatorRegistry": "0x6F75a4ffF97326A00e52662d82EA4FdE86a2C548", - "networkOptInService": "0x58973d16FFA900D11fC22e5e2B6840d9f7e13401", - "vaultFactory": "0x407A039D94948484D356eFB765b3c74382A050B4", - "vaultConfigurator": "0xD2191FE92987171691d552C219b8caEf186eb9cA", - "networkRegistry": "0x7d03b7343BF8d5cEC7C0C27ecE084a20113D15C9", - "networkMiddlewareService": "0x62a1ddfD86b4c1636759d9286D3A0EC722D086e3", - "middleware": "0x04f40d9CaE475E5BaA462acE53E5c58A0DD8D8e8", - "supportedVaults": [ - "0xc79c533a77691641d52ebD5e87E51dCbCaeb0D78", - "0xe5708788c90e971f73D928b7c5A8FD09137010e0", - "0x11c5b9A9cd8269580aDDbeE38857eE451c1CFacd", - "0xC56Ba584929c6f381744fA2d7a028fA927817f2b", - "0xcDdeFfcD2bA579B8801af1d603812fF64c301462", - "0x91e84e12Bb65576C0a6614c5E6EbbB2eA595E10f" - ] - }, - "eigenLayer": { - "avsDirectory": "0x055733000064333CaDDbC92763c58BF0192fFeBf", - "delegationManager": "0xA44151489861Fe9e3055d95adC98FbD462B948e7", - "strategyManager": "0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6", - "middleware": "0xa632a3e652110Bb2901D5cE390685E6a9838Ca04", - "supportedStrategies": [ - "0x7D704507b76571a51d9caE8AdDAbBFd0ba0e63d3", - "0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0", - "0x80528D6e9A2BAbFc766965E0E26d5aB08D9CFaF9", - "0x70EB4D3c164a6B4A5f908D4FBb5a9cAfFb66bAB6", - "0xaccc5A86732BE85b5012e8614AF237801636F8e5" - ] - } -} \ No newline at end of file + "bolt": { + "validators": "0x47D2DC1DE1eFEFA5e6944402f2eda3981D36a9c8", + "parameters": "0x20d1cf3A5BD5928dB3118b2CfEF54FDF9fda5c12", + "manager": "0x440202829b493F9FF43E730EB5e8379EEa3678CF" + }, + "symbiotic": { + "network": "0xb017002D8024d8c8870A5CECeFCc63887650D2a4", + "operatorRegistry": "0x6F75a4ffF97326A00e52662d82EA4FdE86a2C548", + "networkOptInService": "0x58973d16FFA900D11fC22e5e2B6840d9f7e13401", + "vaultFactory": "0x407A039D94948484D356eFB765b3c74382A050B4", + "vaultConfigurator": "0xD2191FE92987171691d552C219b8caEf186eb9cA", + "networkRegistry": "0x7d03b7343BF8d5cEC7C0C27ecE084a20113D15C9", + "networkMiddlewareService": "0x62a1ddfD86b4c1636759d9286D3A0EC722D086e3", + "middleware": "0x04f40d9CaE475E5BaA462acE53E5c58A0DD8D8e8", + "supportedVaults": [ + "0xc79c533a77691641d52ebD5e87E51dCbCaeb0D78", + "0xe5708788c90e971f73D928b7c5A8FD09137010e0", + "0x11c5b9A9cd8269580aDDbeE38857eE451c1CFacd", + "0xC56Ba584929c6f381744fA2d7a028fA927817f2b", + "0xcDdeFfcD2bA579B8801af1d603812fF64c301462", + "0x91e84e12Bb65576C0a6614c5E6EbbB2eA595E10f" + ] + }, + "eigenLayer": { + "avsDirectory": "0x055733000064333CaDDbC92763c58BF0192fFeBf", + "delegationManager": "0xA44151489861Fe9e3055d95adC98FbD462B948e7", + "strategyManager": "0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6", + "middleware": "0xa632a3e652110Bb2901D5cE390685E6a9838Ca04", + "supportedStrategies": [ + "0x7D704507b76571a51d9caE8AdDAbBFd0ba0e63d3", + "0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0", + "0x80528D6e9A2BAbFc766965E0E26d5aB08D9CFaF9", + "0x70EB4D3c164a6B4A5f908D4FBb5a9cAfFb66bAB6", + "0xaccc5A86732BE85b5012e8614AF237801636F8e5" + ] + } +} diff --git a/bolt-contracts/config/holesky/operator.json b/bolt-contracts/config/holesky/operator.json index 0b6373c92..7e1d43c10 100644 --- a/bolt-contracts/config/holesky/operator.json +++ b/bolt-contracts/config/holesky/operator.json @@ -1,5 +1,6 @@ { - "rpc": "localhost:50051", - "salt": "0x000000000000000abc0000000000000000000000000000000000000000000000", - "expiry": null -} \ No newline at end of file + "rpc": ":", + "salt": "0x0000000000000000000_salt_value_0000000000000000000000000000000000", + "expiry": "0x00000000000000000_expiry_value_0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +} + diff --git a/bolt-contracts/config/holesky/operators/eigenlayer/depositIntoStrategy.json b/bolt-contracts/config/holesky/operators/eigenlayer/depositIntoStrategy.json new file mode 100644 index 000000000..f500598aa --- /dev/null +++ b/bolt-contracts/config/holesky/operators/eigenlayer/depositIntoStrategy.json @@ -0,0 +1,5 @@ +{ + "strategy": "", + "token": "", + "amount": "" +} diff --git a/bolt-contracts/script/holesky/operators/RegisterEigenLayerOperator.s.sol b/bolt-contracts/script/holesky/operators/RegisterEigenLayerOperator.s.sol index 3acbe2d81..109f70c73 100644 --- a/bolt-contracts/script/holesky/operators/RegisterEigenLayerOperator.s.sol +++ b/bolt-contracts/script/holesky/operators/RegisterEigenLayerOperator.s.sol @@ -4,13 +4,14 @@ pragma solidity 0.8.25; import {Script, console} from "forge-std/Script.sol"; import {IAVSDirectory} from "@eigenlayer/src/contracts/interfaces/IAVSDirectory.sol"; +import {IDelegationManager} from "@eigenlayer/src/contracts/interfaces/IDelegationManager.sol"; +import {IStrategyManager} from "@eigenlayer/src/contracts/interfaces/IStrategyManager.sol"; +import {IStrategy, IERC20} from "@eigenlayer/src/contracts/interfaces/IStrategy.sol"; import {ISignatureUtils} from "@eigenlayer/src/contracts/interfaces/ISignatureUtils.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; - import {BoltEigenLayerMiddlewareV1} from "../../../src/contracts/BoltEigenLayerMiddlewareV1.sol"; import {IBoltMiddlewareV1} from "../../../src/interfaces/IBoltMiddlewareV1.sol"; +import {IBoltManagerV1} from "../../../src/interfaces/IBoltManagerV1.sol"; contract RegisterEigenLayerOperator is Script { struct OperatorConfig { @@ -19,9 +20,27 @@ contract RegisterEigenLayerOperator is Script { uint256 expiry; } - function run() public { + function S01_depositIntoStrategy() public { uint256 operatorSk = vm.envUint("OPERATOR_SK"); + IStrategyManager strategyManager = _readStrategyManager(); + + string memory json = vm.readFile("config/holesky/operators/eigenlayer/depositIntoStrategy.json"); + + IStrategy strategy = IStrategy(vm.parseJsonAddress(json, ".strategy")); + IERC20 token = IERC20(vm.parseJsonAddress(json, ".token")); + uint256 amount = vm.parseJsonUint(json, ".amount"); + + vm.startBroadcast(operatorSk); + // Allowance must be set before depositing + token.approve(address(strategyManager), amount); + strategyManager.depositIntoStrategy(strategy, token, amount); + console.log("Successfully run StrategyManager.depositIntoStrategy"); + vm.stopBroadcast(); + } + + function S02_registerIntoBoltAVS() public { + uint256 operatorSk = vm.envUint("OPERATOR_SK"); address operator = vm.addr(operatorSk); BoltEigenLayerMiddlewareV1 middleware = _readMiddleware(); @@ -53,6 +72,16 @@ contract RegisterEigenLayerOperator is Script { vm.stopBroadcast(); } + function S03_checkOperatorRegistration() public view { + address operatorPublicKey = vm.envAddress("OPERATOR_PK"); + console.log("Checking operator registration for address", operatorPublicKey); + + IBoltManagerV1 boltManager = _readBoltManager(); + bool isRegistered = boltManager.isOperator(operatorPublicKey); + console.log("Operator is registered:", isRegistered); + require(isRegistered, "Operator is not registered"); + } + function _readMiddleware() public view returns (BoltEigenLayerMiddlewareV1) { string memory root = vm.projectRoot(); string memory path = string.concat(root, "/config/holesky/deployments.json"); @@ -69,6 +98,28 @@ contract RegisterEigenLayerOperator is Script { return IAVSDirectory(vm.parseJsonAddress(json, ".eigenLayer.avsDirectory")); } + function _readDelegationManager() public view returns (IDelegationManager) { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/config/holesky/deployments.json"); + string memory json = vm.readFile(path); + + return IDelegationManager(vm.parseJsonAddress(json, ".eigenLayer.delegationManager")); + } + + function _readStrategyManager() public view returns (IStrategyManager) { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/config/holesky/deployments.json"); + string memory json = vm.readFile(path); + return IStrategyManager(vm.parseJsonAddress(json, ".eigenLayer.strategyManager")); + } + + function _readBoltManager() public view returns (IBoltManagerV1) { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/config/holesky/deployments.json"); + string memory json = vm.readFile(path); + return IBoltManagerV1(vm.parseJsonAddress(json, ".bolt.manager")); + } + function _readConfig( string memory path ) public view returns (OperatorConfig memory) { diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 4a6f6df60..cfdf062da 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -524,31 +524,66 @@ If all goes well, your Symbiotic operator was registered into Bolt. > The supported strategies can be found in > [`deployments.json`](../../bolt-contracts/config/holesky/deployments.json). -The Operator will be represented by an Ethereum address that needs to follow the -standard procedure outlined in the [EigenLayer -documentation](https://docs.eigenlayer.xyz/) to opt into EigenLayer. Let's go -through the steps: +If you're not registered as an operator in EigenLayer yet, you need to do so by +following [the official +guide](https://docs.eigenlayer.xyz/eigenlayer/operator-guides/operator-introduction). +This requires installing the EigenLayer CLI and opt into the protocol by +registering via the +[`DelegationManager.registerAsOperator`](https://docs.eigenlayer.xyz/eigenlayer/operator-guides/operator-installation) +function. + +After that you need to deposit into a supported EigenLayer +strategy using +[`StrategyManager.depositIntoStrategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/StrategyManager.sol#L303-L322). +This will add the deposit into the collateral of the operator so that Bolt can +read it. Note that you need to deposit a minimum of `1 ether` of the strategies +underlying token in order to opt in. + +We've provided a script to facilitate the procedure. If you want to use it, +please set the operator private key to an `OPERATOR_SK` environment variable. + +First, you need to first configure the deposit details in this JSON +file: -1. As an Operator, you register into EigenLayer using - [`DelegationManager.registerAsOperator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/DelegationManager.sol#L107-L119). +```bash +$EDITOR ./config/holesky/operators/eigenlayer/depositIntoStrategy.json +``` + +Then you can run the following Forge script: -2. You can then use the same account to deposit into a supported EigenLayer - strategy using - [`StrategyManager.depositIntoStrategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/StrategyManager.sol#L303-L322). - This will add the deposit into the collateral of the operator so that Bolt can - read it. Note that you need to deposit a minimum of `1 ether` of the strategies - underlying token in order to opt in. +```bash +forge script script/holesky/operators/RegisterEigenLayerOperator.s.sol \ + --sig "S01_depositIntoStrategy()" \ + --rpc-url $HOLESKY_RPC \ + -vvvv \ + --broadcast +``` **Internal Steps** -Set the operator private key to an `OPERATOR_SK` environment variable, and then -run the following Forge script from the `bolt-contracts` directory: +After having deposited collateral into a strategy you need to register into the +Bolt AVS. We've provided a script to facilitate the procedure. If you want to +use it, please set the operator private key to an `OPERATOR_SK` environment +variable, and then run the following Forge script from the `bolt-contracts` +directory: ```bash -forge script script/holesky/operators/RegisterEigenLayerOperator.s.sol --rpc-url $HOLESKY_RPC -vvvv --broadcast +forge script script/holesky/operators/RegisterEigenLayerOperator.s.sol \ + --sig "S02_registerIntoBoltAVS" \ + --rpc-url $HOLESKY_RPC \ + -vvvv \ + --broadcast ``` -If all goes well, your EigenLayer operator was registered into Bolt. +To check if your operator is correctly registered, set the operator public key +in the `OPERATOR_PK` environment variable and run the following script: + +```bash +forge script script/holesky/operators/RegisterEigenLayerOperator.s.sol \ + --sig "S03_checkOperatorRegistration" \ + --rpc-url $HOLESKY_RPC \ + -vvvv +``` # Reference @@ -559,13 +594,14 @@ sidecar. You can see them in your terminal by running the Bolt sidecar binary with the `--help` flag: ``` + Command-line options for the Bolt sidecar Usage: bolt-sidecar [OPTIONS] --validator-indexes --engine-jwt-hex --fee-recipient --builder-private-key --commitment-private-key <--constraint-private-key |--commit-boost-signer-url |--keystore-password |--keystore-secrets-path > Options: - --port - Port to listen on for incoming JSON-RPC requests of the Commitments API. This port should be open on your firewall in order to receive external requests! +--port +Port to listen on for incoming JSON-RPC requests of the Commitments API. This port should be open on your firewall in order to receive external requests! [env: BOLT_SIDECAR_PORT=] [default: 8017] @@ -709,8 +745,9 @@ Options: --disable-metrics [env: BOLT_SIDECAR_DISABLE_METRICS=] - -h, --help - Print help (see a summary with '-h') +-h, --help +Print help (see a summary with '-h') + ``` ## Delegations and signing options for Native and Docker Compose Mode From fab2107f5890009d5b3faefb67c27bda3768ab61 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 24 Oct 2024 10:22:06 +0200 Subject: [PATCH 61/85] fix(holesky): formatting in README --- testnets/holesky/README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index cfdf062da..6089342c1 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -600,8 +600,8 @@ Command-line options for the Bolt sidecar Usage: bolt-sidecar [OPTIONS] --validator-indexes --engine-jwt-hex --fee-recipient --builder-private-key --commitment-private-key <--constraint-private-key |--commit-boost-signer-url |--keystore-password |--keystore-secrets-path > Options: ---port -Port to listen on for incoming JSON-RPC requests of the Commitments API. This port should be open on your firewall in order to receive external requests! + --port + Port to listen on for incoming JSON-RPC requests of the Commitments API. This port should be open on your firewall in order to receive external requests! [env: BOLT_SIDECAR_PORT=] [default: 8017] @@ -637,8 +637,11 @@ Port to listen on for incoming JSON-RPC requests of the Commitments API. This po [default: 18550] --validator-indexes - Validator indexes of connected validators that the sidecar should accept commitments on behalf of. Accepted values: - a comma-separated list of indexes (e.g. "1,2,3,4") - a contiguous range of indexes (e.g. "1..4") - a mix of the - above (e.g. "1,2..4,6..8") + Validator indexes of connected validators that the sidecar should accept commitments on behalf of. + Accepted values: + - a comma-separated list of indexes (e.g. "1,2,3,4") + - a contiguous range of indexes (e.g. "1..4") + - a mix of the above (e.g. "1,2..4,6..8") [env: BOLT_SIDECAR_VALIDATOR_INDEXES=] @@ -745,8 +748,8 @@ Port to listen on for incoming JSON-RPC requests of the Commitments API. This po --disable-metrics [env: BOLT_SIDECAR_DISABLE_METRICS=] --h, --help -Print help (see a summary with '-h') + -h, --help + Print help (see a summary with '-h') ``` From 310861f7f68be575c0832a136dd0441ed8a3a82c Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 24 Oct 2024 11:04:20 +0200 Subject: [PATCH 62/85] chore(holesky): better explanation of operator config steps for EL --- .../eigenlayer/registerIntoBoltAVS.json} | 5 ++- .../RegisterEigenLayerOperator.s.sol | 2 +- testnets/holesky/README.md | 33 +++++++++++++++++-- 3 files changed, 33 insertions(+), 7 deletions(-) rename bolt-contracts/config/holesky/{operator.json => operators/eigenlayer/registerIntoBoltAVS.json} (68%) diff --git a/bolt-contracts/config/holesky/operator.json b/bolt-contracts/config/holesky/operators/eigenlayer/registerIntoBoltAVS.json similarity index 68% rename from bolt-contracts/config/holesky/operator.json rename to bolt-contracts/config/holesky/operators/eigenlayer/registerIntoBoltAVS.json index 7e1d43c10..dd38cee99 100644 --- a/bolt-contracts/config/holesky/operator.json +++ b/bolt-contracts/config/holesky/operators/eigenlayer/registerIntoBoltAVS.json @@ -1,6 +1,5 @@ { "rpc": ":", - "salt": "0x0000000000000000000_salt_value_0000000000000000000000000000000000", - "expiry": "0x00000000000000000_expiry_value_0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "salt": "0x0000000000000000000_salt_value_000000000000000000000000000000000", + "expiry": "0x00000000000000000_expiry_value_000000000000000000000000000000000" } - diff --git a/bolt-contracts/script/holesky/operators/RegisterEigenLayerOperator.s.sol b/bolt-contracts/script/holesky/operators/RegisterEigenLayerOperator.s.sol index 109f70c73..c67b7ef06 100644 --- a/bolt-contracts/script/holesky/operators/RegisterEigenLayerOperator.s.sol +++ b/bolt-contracts/script/holesky/operators/RegisterEigenLayerOperator.s.sol @@ -45,7 +45,7 @@ contract RegisterEigenLayerOperator is Script { BoltEigenLayerMiddlewareV1 middleware = _readMiddleware(); IAVSDirectory avsDirectory = _readAvsDirectory(); - OperatorConfig memory config = _readConfig("config/holesky/operator.json"); + OperatorConfig memory config = _readConfig("config/holesky/operators/eigenlayer/registerIntoBoltAVS.json"); console.log("Registering EigenLayer operator"); console.log("Operator address:", operator); diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 6089342c1..524d64335 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -563,9 +563,36 @@ forge script script/holesky/operators/RegisterEigenLayerOperator.s.sol \ After having deposited collateral into a strategy you need to register into the Bolt AVS. We've provided a script to facilitate the procedure. If you want to -use it, please set the operator private key to an `OPERATOR_SK` environment -variable, and then run the following Forge script from the `bolt-contracts` -directory: +use it, please set follow these steps: + +1. configure the operator details in this JSON file + + ```bash + $EDITOR ./config/holesky/operators/eigenlayer/registerIntoBoltAVS.json + ``` + + In there you'll need to set the the following fields: + + - `rpc` -- the RPC URL of your operator which supports the Commitments API + - `salt` -- an unique 32 bytes value to avoid replay attacks. To generate it on + both Linux and MacOS you can run: + + ```bash + echo -n "0x"; head -c 32 /dev/urandom | hexdump -e '32/1 "%02x" "\n"' + ``` + + - `expiry` -- the timestamp of the signature expiry in seconds. To generate it + on both Linux and MacOS run the following command, replacing + `` with the desired timestamp: + + ```bash + echo -n "0x"; printf "%064x\n" + ``` + +2. set the operator private key to an `OPERATOR_SK` environment + variable; +3. run the following Forge script from the `bolt-contracts` + directory: ```bash forge script script/holesky/operators/RegisterEigenLayerOperator.s.sol \ From 5c46e4ac9537456647ae83987518a98c00e62c11 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Wed, 23 Oct 2024 16:08:38 +0200 Subject: [PATCH 63/85] feat(holesky): update scripts + README for Symbiotic integration --- .../operators/RegisterSymbioticOperator.s.sol | 37 +++++++++++----- testnets/holesky/README.md | 43 +++++++++++++++---- 2 files changed, 61 insertions(+), 19 deletions(-) diff --git a/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol b/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol index 0089432c0..f2728c85b 100644 --- a/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol +++ b/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol @@ -4,7 +4,10 @@ pragma solidity 0.8.25; import {Script, console} from "forge-std/Script.sol"; import {BoltSymbioticMiddlewareV1} from "../../../src/contracts/BoltSymbioticMiddlewareV1.sol"; +import {IBoltManagerV1} from "../../../src/interfaces/IBoltManagerV1.sol"; + import {IOptInService} from "@symbiotic/interfaces/service/IOptInService.sol"; +import {IVault} from "@symbiotic/interfaces/vault/IVault.sol"; contract RegisterSymbioticOperator is Script { struct Config { @@ -14,7 +17,7 @@ contract RegisterSymbioticOperator is Script { address symbioticNetwork; } - function run() public { + function S01_registerIntoBolt() public { uint256 operatorSk = vm.envUint("OPERATOR_SK"); address operator = vm.addr(operatorSk); @@ -22,15 +25,12 @@ contract RegisterSymbioticOperator is Script { Config memory config = _readConfig(); // First, make sure the operator is opted into the network - if (!config.symbioticNetworkOptInService.isOptedIn(operator, config.symbioticNetwork)) { - console.log("Operator is not opted into the network yet. Opting in..."); - vm.startBroadcast(operatorSk); - config.symbioticNetworkOptInService.optIn(config.symbioticNetwork); - vm.stopBroadcast(); - console.log("Operator successfully opted into the network"); - } - - console.log("Registering Symbiotic operator"); + require( + config.symbioticNetworkOptInService.isOptedIn(operator, config.symbioticNetwork), + "Operator must be opted in into Bolt Network" + ); + + console.log("Registering Symbiotic operator into Bolt"); console.log("Operator address:", operator); console.log("Operator RPC:", config.rpc); @@ -41,6 +41,16 @@ contract RegisterSymbioticOperator is Script { vm.stopBroadcast(); } + function S02_checkOperatorRegistration() public view { + address operatorPublicKey = vm.envAddress("OPERATOR_PK"); + console.log("Checking operator registration for address", operatorPublicKey); + + IBoltManagerV1 boltManager = _readBoltManager(); + bool isRegistered = boltManager.isOperator(operatorPublicKey); + console.log("Operator is registered:", isRegistered); + require(isRegistered, "Operator is not registered"); + } + function _readConfig() public view returns (Config memory) { string memory root = vm.projectRoot(); string memory path = string.concat(root, "/config/holesky/deployments.json"); @@ -56,4 +66,11 @@ contract RegisterSymbioticOperator is Script { symbioticNetworkOptInService: IOptInService(vm.parseJsonAddress(json, ".symbiotic.networkOptInService")) }); } + + function _readBoltManager() public view returns (IBoltManagerV1) { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/config/holesky/deployments.json"); + string memory json = vm.readFile(path); + return IBoltManagerV1(vm.parseJsonAddress(json, ".bolt.manager")); + } } diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 524d64335..b15e25fc0 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -493,28 +493,53 @@ directory. As an operator, you will need to opt-in to the Bolt Network and any Vault that trusts you to provide commitments on their behalf. -The opt-in process requires the following steps: - **External Steps** > [!NOTE] > The network and supported vault addresses can be found in > [`deployments.json`](../../bolt-contracts/config/holesky/deployments.json). -1. register in Symbiotic with `OperatorRegistry.registerOperator()`. -2. opt-in to the Bolt network with - `OperatorNetworkOptInService.optIn(networkAddress)`. -3. opt-in to any vault with `OperatorVaultOptInService.optIn(vaultAddress)`. +Make sure you have installed the [Symbiotic +CLI](https://docs.symbiotic.fi/guides/cli/). + +The opt-in process requires the following steps: + +1. if you haven't done it already, register as a Symbiotic Operator with the + [`register-operator`](https://docs.symbiotic.fi/guides/cli/#register-operator) + command; +2. opt-in to the Bolt network with the + [`opt-in-network`](https://docs.symbiotic.fi/guides/cli/#opt-in-network) + command; +3. opt-in to any vault using the + [`opt-in-vault`](https://docs.symbiotic.fi/guides/cli/#opt-in-vault) command; +4. deposit collateral into the vault using the + [`deposit`](https://docs.symbiotic.fi/guides/cli/#deposit) command. **Internal Steps** -Run the provided Forge script to register a Symbiotic operator: +After having deposited collateral into a vault you need to register into +Bolt as a Symbiotic operator. We've provided a script to facilitate the +procedure. If you want to use it, please set the operator private key to an +`OPERATOR_SK` environment variable, and then run the following Forge script from +the `bolt-contracts` directory: ```bash -forge script script/holesky/operators/RegisterSymbioticOperator.s.sol --rpc-url $HOLESKY_RPC -vvvv --broadcast +forge script script/holesky/operators/RegisterSymbioticOperator.s.sol \ + --sig "S01_registerIntoBolt" \ + --rpc-url $HOLESKY_RPC \ + -vvvv \ + --broadcast ``` -If all goes well, your Symbiotic operator was registered into Bolt. +To check if your operator is correctly registered, set the operator public key +in the `OPERATOR_PK` environment variable and run the following script: + +```bash +forge script script/holesky/operators/RegisterSymbioticOperator.s.sol \ + --sig "S02_checkOperatorRegistration" \ + --rpc-url $HOLESKY_RPC \ + -vvvv +``` ### EigenLayer Registration Steps From ee3109cae0b3810352134ff25a7074b7f375a2f0 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 24 Oct 2024 11:13:17 +0200 Subject: [PATCH 64/85] fix(holesky): config options for Symbiotic guide Don't use operators.json file but provide the RPC URL using an enviroment value --- .../operators/RegisterSymbioticOperator.s.sol | 5 ++-- testnets/holesky/README.md | 23 +++++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol b/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol index f2728c85b..b5a6d46d8 100644 --- a/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol +++ b/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol @@ -19,6 +19,7 @@ contract RegisterSymbioticOperator is Script { function S01_registerIntoBolt() public { uint256 operatorSk = vm.envUint("OPERATOR_SK"); + string memory rpc = vm.envString("OPERATOR_RPC"); address operator = vm.addr(operatorSk); @@ -32,10 +33,10 @@ contract RegisterSymbioticOperator is Script { console.log("Registering Symbiotic operator into Bolt"); console.log("Operator address:", operator); - console.log("Operator RPC:", config.rpc); + console.log("Operator RPC:", rpc); vm.startBroadcast(operatorSk); - config.symbioticMiddleware.registerOperator(config.rpc); + config.symbioticMiddleware.registerOperator(rpc); console.log("Successfully registered Symbiotic operator"); vm.stopBroadcast(); diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index b15e25fc0..154328429 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -519,17 +519,20 @@ The opt-in process requires the following steps: After having deposited collateral into a vault you need to register into Bolt as a Symbiotic operator. We've provided a script to facilitate the -procedure. If you want to use it, please set the operator private key to an -`OPERATOR_SK` environment variable, and then run the following Forge script from -the `bolt-contracts` directory: +procedure. If you want to use it, please follow these steps: -```bash -forge script script/holesky/operators/RegisterSymbioticOperator.s.sol \ - --sig "S01_registerIntoBolt" \ - --rpc-url $HOLESKY_RPC \ - -vvvv \ - --broadcast -``` +1. set the operator private key to the `OPERATOR_SK` environment variable; +2. set the operator RPC URL which supports the Commitments API to the + `OPERATOR_RPC` environment variable; +3. run the following Forge script from the `bolt-contracts` directory: + + ```bash + forge script script/holesky/operators/RegisterSymbioticOperator.s.sol \ + --sig "S01_registerIntoBolt" \ + --rpc-url $HOLESKY_RPC \ + -vvvv \ + --broadcast + ``` To check if your operator is correctly registered, set the operator public key in the `OPERATOR_PK` environment variable and run the following script: From 2451c75661bce29fcaf602517f8e747b2ae60ccd Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 24 Oct 2024 13:41:41 +0200 Subject: [PATCH 65/85] chore(holesky): upgrade vault addresses for Symbiotic --- testnets/holesky/README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 154328429..6574cb06d 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -354,8 +354,12 @@ EigenLayer protocol. Bolt is compatible with the following ETH derivative tokens on Holesky: - [Symbiotic Vaults](https://docs.symbiotic.fi/deployments#vaults) - - [`wstETH`](https://holesky.etherscan.io/address/0x8d09a4502Cc8Cf1547aD300E066060D043f6982D) - - [`rETH`](https://holesky.etherscan.io/address/0x7322c24752f79c05FFD1E2a6FCB97020C1C264F1) + - [`wstETH`](https://holesky.etherscan.io/address/0xc79c533a77691641d52ebD5e87E51dCbCaeb0D78) + - [`rETH`](https://holesky.etherscan.io/address/0xe5708788c90e971f73D928b7c5A8FD09137010e0) + - [`stETH`](https://holesky.etherscan.io/address/0x11c5b9A9cd8269580aDDbeE38857eE451c1CFacd) + - [`WETH`](https://holesky.etherscan.io/address/0xC56Ba584929c6f381744fA2d7a028fA927817f2b) + - [`cbETH`](https://holesky.etherscan.io/address/0xcDdeFfcD2bA579B8801af1d603812fF64c301462) + - [`mETH`](https://holesky.etherscan.io/address/0x91e84e12Bb65576C0a6614c5E6EbbB2eA595E10f) - [EigenLayer Strategies](https://github.com/Layr-Labs/eigenlayer-contracts#current-testnet-deployment) - [`stETH`](https://holesky.etherscan.io/address/0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034) - [`rETH`](https://holesky.etherscan.io/address/0x7322c24752f79c05FFD1E2a6FCB97020C1C264F1) From 3062f3ab87db669ae8f9a20794d333966a557379 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Thu, 24 Oct 2024 14:45:07 +0200 Subject: [PATCH 66/85] fix(contracts/scripts): register Symbiotic operator script --- .../operators/RegisterSymbioticOperator.s.sol | 25 +++++++++++-------- testnets/holesky/README.md | 4 +-- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol b/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol index b5a6d46d8..d57902e9b 100644 --- a/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol +++ b/bolt-contracts/script/holesky/operators/RegisterSymbioticOperator.s.sol @@ -11,7 +11,6 @@ import {IVault} from "@symbiotic/interfaces/vault/IVault.sol"; contract RegisterSymbioticOperator is Script { struct Config { - string rpc; BoltSymbioticMiddlewareV1 symbioticMiddleware; IOptInService symbioticNetworkOptInService; address symbioticNetwork; @@ -25,14 +24,15 @@ contract RegisterSymbioticOperator is Script { Config memory config = _readConfig(); + console.log("Registering Symbiotic operator into Bolt"); + console.log("Operator address:", operator); + // First, make sure the operator is opted into the network require( config.symbioticNetworkOptInService.isOptedIn(operator, config.symbioticNetwork), "Operator must be opted in into Bolt Network" ); - console.log("Registering Symbiotic operator into Bolt"); - console.log("Operator address:", operator); console.log("Operator RPC:", rpc); vm.startBroadcast(operatorSk); @@ -40,14 +40,23 @@ contract RegisterSymbioticOperator is Script { console.log("Successfully registered Symbiotic operator"); vm.stopBroadcast(); + + (address[] memory tokens, uint256[] memory amounts) = + config.symbioticMiddleware.getOperatorCollaterals(operator); + + console.log("Operator collateral:"); + for (uint256 i; i < tokens.length; ++i) { + console.log("Collateral:", tokens[i], "Amount:", amounts[i]); + } } function S02_checkOperatorRegistration() public view { - address operatorPublicKey = vm.envAddress("OPERATOR_PK"); - console.log("Checking operator registration for address", operatorPublicKey); + address operatorAddress = vm.envAddress("OPERATOR_ADDRESS"); + console.log("Checking operator registration for address", operatorAddress); IBoltManagerV1 boltManager = _readBoltManager(); - bool isRegistered = boltManager.isOperator(operatorPublicKey); + bool isRegistered = boltManager.isOperator(operatorAddress); + console.log("Operator is registered:", isRegistered); require(isRegistered, "Operator is not registered"); } @@ -57,11 +66,7 @@ contract RegisterSymbioticOperator is Script { string memory path = string.concat(root, "/config/holesky/deployments.json"); string memory json = vm.readFile(path); - string memory operatorPath = string.concat(root, "/config/holesky/operator.json"); - string memory operatorJson = vm.readFile(operatorPath); - return Config({ - rpc: vm.parseJsonString(operatorJson, ".rpc"), symbioticNetwork: vm.parseJsonAddress(json, ".symbiotic.network"), symbioticMiddleware: BoltSymbioticMiddlewareV1(vm.parseJsonAddress(json, ".symbiotic.middleware")), symbioticNetworkOptInService: IOptInService(vm.parseJsonAddress(json, ".symbiotic.networkOptInService")) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 6574cb06d..5ddfb7a3f 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -538,8 +538,8 @@ procedure. If you want to use it, please follow these steps: --broadcast ``` -To check if your operator is correctly registered, set the operator public key -in the `OPERATOR_PK` environment variable and run the following script: +To check if your operator is correctly registered, set the operator address +in the `OPERATOR_ADDRESS` environment variable and run the following script: ```bash forge script script/holesky/operators/RegisterSymbioticOperator.s.sol \ From b39ce6ca5916d36b030fb635b0448bff6dbb2b69 Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Thu, 24 Oct 2024 15:32:12 +0200 Subject: [PATCH 67/85] chore(holesky): updated bolt-cli usage guide --- testnets/holesky/README.md | 235 ++++++++++++++++++++++--------------- 1 file changed, 140 insertions(+), 95 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 5ddfb7a3f..5ad5016ba 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -23,9 +23,8 @@ This document provides instructions for running the Bolt sidecar on the Holesky * [Reference](#reference) * [Command-line options](#command-line-options) * [Delegations and signing options for Native and Docker Compose Mode](#delegations-and-signing-options-for-native-and-docker-compose-mode) - * [`bolt-delegations-cli`](#`bolt-delegations-cli`) + * [`bolt-cli`](#bolt-cli) * [Installation and usage](#installation-and-usage) - * [Delegations CLI Example](#delegations-cli-example) * [Using a private key directly](#using-a-private-key-directly) * [Using a ERC-2335 Keystore](#using-a-erc-2335-keystore) * [Avoid restarting the beacon node](#avoid-restarting-the-beacon-node) @@ -42,8 +41,8 @@ your system. Bolt is fully trustless since it is able to produce a fallback block with the commitments issued in case builders do not return a valid bid. In order to do so it relies on a synced execution client, configured via the `--execution-api-url` -flag. At the moment only Geth is supported; with more -clients to be supported in the future. +flag. **At the moment only Geth is supported; with more +clients to be supported in the future.** Using the sidecar with a different execution client could lead to commitment faults because fallback block building is not supported yet. You can download @@ -74,22 +73,25 @@ client implementations to download and run them. > > It might be necessary to restart your beacon node depending on your existing > setup. See the [Avoid Restarting the Beacon -> Node](#avoid-restarting-the-beacon-node) for more details. +> Node](#avoid-restarting-the-beacon-node) section for more details. **Active validators:** -The Bolt sidecar requires signing keys from active Ethereum validators, or -authorized delegates acting on their behalf, to issue and sign preconfirmations. +The Bolt sidecar requires access to BLS signing keys from active Ethereum validators, +or **authorized delegates** acting on their behalf, to issue and sign preconfirmations. + +To learn more about delegation, check out the [Delegations and Signing](#delegations-and-signing-options-for-native-and-docker-compose-mode) +section. # Off-Chain Setup There are various way to run the Bolt Sidecar depending on what infrastructure you want to use and your preferred signing methods: -- Docker mode (recommended); +- Docker mode (recommended) - [Commit-Boost](https://commit-boost.github.io/commit-boost-client) mode - (requires Docker). -- Native mode (advanced, requires building everything from source); + (requires Docker) +- Native mode (advanced, requires building everything from source) Running the Bolt sidecar as a standalone binary requires building it from source. Both the standalone binary and the Docker container requires reading @@ -102,19 +104,19 @@ requirements. ## Docker Mode (recommended) -First, make sure to have both [Docker](https://docs.docker.com/engine/install/), +First, make sure to have [Docker](https://docs.docker.com/engine/install/), [Docker Compose](https://docs.docker.com/compose/install/) and [git](https://git-scm.com/downloads) installed in your machine. Then clone the Bolt repository by running: ```bash -git clone --branch v0.3.0-alpha htts://github.com/chainbound/bolt.git && cd bolt +git clone --branch v0.3.0-alpha htts://github.com/chainbound/bolt.git +cd bolt/testnets/holesky ``` The Docker Compose setup will spin up the Bolt sidecar along with the Bolt -MEV-Boost fork which includes supports the [Constraints -API](https://docs.boltprotocol.xyz/api/builder). +MEV-Boost fork which includes supports the [Constraints API](https://docs.boltprotocol.xyz/api/builder). Before starting the services, you'll need to provide configuration files containing the necessary environment variables: @@ -652,7 +654,10 @@ For completeness, here are all the command-line options available for the Bolt sidecar. You can see them in your terminal by running the Bolt sidecar binary with the `--help` flag: -``` +
+CLI help Reference + +```text Command-line options for the Bolt sidecar @@ -812,6 +817,9 @@ Options: ``` +
+ + ## Delegations and signing options for Native and Docker Compose Mode As mentioned in the [prerequisites](#prerequisites) section, the Bolt sidecar @@ -825,115 +833,150 @@ Ethereum validators. In order to create these delegation you can use the `bolt-delegations-cli` binary. If you don't want to use it you can skip the following section. -### `bolt-delegations-cli` +### `bolt` CLI -`bolt-delegations-cli` is an offline command-line tool for safely generating -delegation and revocation messages signed with a BLS12-381 key for the -[Constraints API](https://docs.boltprotocol.xyz/api/builder) in -[Bolt](https://docs.boltprotocol.xyz/). +`bolt` CLI is an offline tool for safely generating delegation and revocation messages +signed with a BLS12-381 key for the [Constraints API](https://docs.boltprotocol.xyz/api/builder) +in [Bolt](https://docs.boltprotocol.xyz/). -The tool supports two key sources: +The tool supports three key sources: -- Local: A BLS private key provided directly from a file. -- Keystore: A keystore file that contains an encrypted BLS private key. +- **Secret Keys**: A list of BLS private keys provided directly as hex-strings. +- **Local Keystore**: A EIP-2335 keystore that contains an encrypted BLS private keys. +- **Dirk**: A remote Dirk server that provides the BLS signatures for the delegation messages. and outputs a JSON file with the delegation/revocation messages to the provided -`` for the given chain +`` for the given chain. -Features: +#### Installation and usage -- Offline usage: Safely generate delegation messages in an offline environment. -- Flexible key source: Support for both direct local BLS private keys and - Ethereum keystore files (ERC-2335 format). -- BLS delegation signing: Sign delegation messages using a BLS secret key and - output the signed delegation in JSON format. +Prerequisites: -#### Installation and usage +- [Rust toolchain][rust] +- [Protoc][protoc] -Go to the root of the Bolt project you've previously cloned using Git. Enter in -the `bolt-delegations-cli` directory by running `cd bolt-delegations-cli`. +Once you have the necessary prerequisites, you can build the binary +in the following way: -If you're using the Docker container setup make sure you have -[Rust](https://www.rust-lang.org/tools/install) installed in your system as -well. Then you can build the `bolt-delegations-cli` binary by running: +```shell +# clone the Bolt repository if you haven't already +git clone git@github.com:chainbound/bolt.git -```bash -cargo build --release && mv target/release/bolt-delegations-cli . -``` +# navigate to the Bolt CLI package directory +cd bolt-cli -Now you can run the binary by running: +# build and install the binary on your machine +cargo install --path . --force -```bash -./bolt-delegations-cli +# test the installation +bolt --version ``` -The binary exposes a single `generate` command, which accepts the following -options and subcommands (use `./bolt-delegations-cli generate --help` to see -them): +The binary can be used with the following command: -```text -Usage: bolt-delegations-cli generate [OPTIONS] --delegatee-pubkey +```shell +bolt delegate --delegate-pubkey + --out + --chain + + +``` -Commands: - local Use local private keys to generate the signed messages - keystore Use an EIP-2335 keystore folder to generate the signed messages - help Print this message or the help of the given subcommand(s) +where: -Options: - --delegatee-pubkey The BLS public key to which the delegation message should be signed [env: DELEGATEE_PUBKEY=] - --out The output file for the delegations [env: OUTPUT_FILE_PATH=] [default: delegations.json] - --chain The chain for which the delegation message is intended [env: CHAIN=] [default: mainnet] [possible values: mainnet, holesky, helder, kurtosis] - --action The action to perform. The tool can be used to generate delegation or revocation messages (default: delegate) [env: ACTION=] [default: delegate] [possible values: delegate, revoke] - -h, --help Print help (see more with '--help') -``` +- `` is the public key of the delegatee. +- `` is the path to the file where the delegation JSON messages will be written. +- `` is the chain for which the delegations are being generated (e.g. Holesky). +- `` is the key source to use for generating the delegations. It can be one of: + - `secret-keys`: A list of BLS private keys provided directly as hex-strings. + - `local-keystore`: A EIP-2335 keystore that contains an encrypted BLS private keys. + - `dirk`: A remote Dirk server that provides the BLS signatures for the delegation messages. + +You can also find more information about the available key source +options by running `bolt delegate --help`. > [!TIP] > If you're using the Docker Compose Mode please don't set the `--out` flag and > provide `delegations_path = /etc/delegations.json` in the `bolt-sidecar.toml` > file. -The environment variables can be also set in a `.env` file. For a reference -example you can check out the `.env.local.example` and the -`.env.keystore.example` +Here you can see usage examples for each key source: + +
+Usage + +```text +❯ bolt-cli delegate --help +Generate BLS delegation or revocation messages +Usage: bolt-cli delegate [OPTIONS] --delegatee-pubkey +Commands: +secret-keys Use local secret keys to generate the signed messages +local-keystore Use an EIP-2335 filesystem keystore directory to generate the signed messages +dirk Use a remote DIRK keystore to generate the signed messages +help Print this message or the help of the given subcommand(s) +Options: + --delegatee-pubkey + The BLS public key to which the delegation message should be signed + [env: DELEGATEE_PUBKEY=] + --out + The output file for the delegations + [env: OUTPUT_FILE_PATH=] + [default: delegations.json] + --chain + The chain for which the delegation message is intended + [env: CHAIN=] + [default: mainnet] + [possible values: mainnet, holesky, helder, kurtosis] + --action + The action to perform. The tool can be used to generate delegation or revocation messages (default: delegate) + [env: ACTION=] + [default: delegate] + Possible values: + - delegate: Create a delegation message + - revoke: Create a revocation message +-h, --help + Print help (see a summary with '-h') +``` -In the section below you can see a usage example of the binary. +
-#### Delegations CLI Example +
+Examples -1. Using a local BLS private key: +1. Generating a delegation using a local BLS secret key - ```text - bolt-delegations-cli generate \ - --delegatee-pubkey 0x7890ab... \ - --out my_delegations.json \ - --chain holesky \ - local \ - --secret-keys 0xabc123...,0xdef456.. - ``` +```text +bolt-cli delegate \ + --delegatee-pubkey 0x8d0edf4fe9c80cd640220ca7a68a48efcbc56a13536d6b274bf3719befaffa13688ebee9f37414b3dddc8c7e77233ce8 \ + --chain holesky \ + secret-keys --secret-keys 642e0d33fde8968a48b5f560c1b20143eb82036c1aa6c7f4adc4beed919a22e3 +``` -2. Using a Ethereum keystores files and raw password: +2. Generating a delegation using an ERC-2335 keystore directory - ```text - bolt-delegations-cli generate \ - --delegatee-pubkey 0x7890ab... \ - --out my_delegations.json \ - --chain holesky \ - keystore \ - --path /keys \ - --password myS3cr3tP@ssw0rd - ``` +```text +bolt-cli delegate \ + --delegatee-pubkey 0x8d0edf4fe9c80cd640220ca7a68a48efcbc56a13536d6b274bf3719befaffa13688ebee9f37414b3dddc8c7e77233ce8 \ + --chain holesky \ + local-keystore --path test_data/lighthouse/validators --password-path test_data/lighthouse/secrets +``` -3. Using an Ethereum keystores files and secrets folder +3. Generating a delegation using a remote DIRK keystore - ```text - bolt-delegations-cli generate \ - --delegatee-pubkey 0x7890ab... \ - --out my_delegations.json \ - --chain holesky \ - keystore \ - --path /keys \ - --password-path /secrets - ``` +```text +bolt-cli delegate \ + --delegatee-pubkey 0x83eeddfac5e60f8fe607ee8713efb8877c295ad9f8ca075f4d8f6f2ae241a30dd57f78f6f3863a9fe0d5b5db9d550b93 \ + dirk --url https://localhost:9091 \ + --client-cert-path ./test_data/dirk/client1.crt \ + --client-key-path ./test_data/dirk/client1.key \ + --ca-cert-path ./test_data/dirk/security/ca.crt \ + --wallet-path wallet1 --passphrases secret +``` + +
+ +
+Keystore-specific instructions When using the `keystore` key source, the `--path` flag should point to the directory containing the encrypted keypair directories. @@ -971,6 +1014,8 @@ That is, the password files should be named after the public key and each file should just contain one line with the password in plain text. The files themselves don't need a particular file extension. +
+ --- Now that you have generated the delegation messages you can provide them to the @@ -990,9 +1035,9 @@ can pass directly the private key as a hex-encoded string to the Bolt sidecar using the `--constraint-private-key` flag (or `constraint_private_key` in the TOML file). -This is the simplest setup and can be used in -case if all the delegations messages point to the same delegatee or if you're -running the sidecar with a single active validator. +This is the simplest setup and can be used in case if all the delegations messages +point to the same delegatee or if you're running the sidecar with a single active +validator. ### Using a ERC-2335 Keystore From 062389cafb4ef1f865b45fe9c389a92e88ab46cc Mon Sep 17 00:00:00 2001 From: nicolas <48695862+merklefruit@users.noreply.github.com> Date: Thu, 24 Oct 2024 15:36:54 +0200 Subject: [PATCH 68/85] fix: broken links --- testnets/holesky/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 5ad5016ba..45a2fd339 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -852,8 +852,8 @@ and outputs a JSON file with the delegation/revocation messages to the provided Prerequisites: -- [Rust toolchain][rust] -- [Protoc][protoc] +- [Rust toolchain](https://www.rust-lang.org/tools/install) +- [Protoc](https://grpc.io/docs/protoc-installation/) Once you have the necessary prerequisites, you can build the binary in the following way: From 32cb2f0de7380e8af9105a23e696d214e5aa5b95 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 24 Oct 2024 16:09:56 +0200 Subject: [PATCH 69/85] chore!(sidecar,holesky): drop support for TOML, use .env everywhere --- bolt-sidecar/.env.example | 83 +++++++++++++++------- bolt-sidecar/Config.example.toml | 84 ----------------------- bolt-sidecar/bin/sidecar.rs | 12 +--- bolt-sidecar/src/config/mod.rs | 23 ------- bolt-sidecar/src/primitives/delegation.rs | 2 +- testnets/holesky/bolt-sidecar.env.example | 67 ++++++++++++++++++ testnets/holesky/mev-boost.env.example | 32 +++++++++ 7 files changed, 159 insertions(+), 144 deletions(-) delete mode 100644 bolt-sidecar/Config.example.toml create mode 100644 testnets/holesky/bolt-sidecar.env.example create mode 100644 testnets/holesky/mev-boost.env.example diff --git a/bolt-sidecar/.env.example b/bolt-sidecar/.env.example index 7621489a6..cf7785bb4 100644 --- a/bolt-sidecar/.env.example +++ b/bolt-sidecar/.env.example @@ -1,34 +1,67 @@ # Ethereum Node Connections + PBS URLs -BOLT_SIDECAR_PORT=8000 -BOLT_SIDECAR_EXECUTION_API_URL=http://localhost:4485 -BOLT_SIDECAR_BEACON_API_URL=http://localhost:4400 -BOLT_SIDECAR_ENGINE_API_URL=http://localhost:4451 -BOLT_SIDECAR_CONSTRAINTS_URL=http://localhost:19550 -BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT=18551 -BOLT_SIDECAR_VALIDATOR_INDEXES=0..64 + +# Port to listen on for incoming JSON-RPC requests of the Commitments API. This +# port should be open on your firewall in order to receive external requests! +BOLT_SIDECAR_PORT=8017 +# Execution client API URL +BOLT_SIDECAR_EXECUTION_API_URL="http://localhost:8545" +# URL for the beacon client +BOLT_SIDECAR_BEACON_API_URL="http://localhost:5052" +# Execution client Engine API URL. This is needed for fallback block building +# and must be a synced Geth node +BOLT_SIDECAR_ENGINE_API_URL="http://localhost:8551" +# The port from which the Bolt sidecar will receive Builder-API requests from the Beacon client +BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT=18550 +# URL to forward the constraints produced by the Bolt sidecar to a server +# supporting the Constraints API, such as an MEV-Boost fork +BOLT_SIDECAR_CONSTRAINTS_API_URL="http://localhost:18551" +# Validator indexes of connected validators that the sidecar should accept +# commitments on behalf of. +# Accepted values: +# - a comma-separated list of indexes (e.g. "1,2,3,4") +# - a contiguous range of indexes (e.g. "1..4") +# - a mix of the above (e.g. "1,2..4,6..8") +BOLT_SIDECAR_VALIDATOR_INDEXES= +# The JWT secret token to authenticate calls to the engine API. It can be +# either be a hex-encoded string or a file path to a file containing the +# hex-encoded secret. BOLT_SIDECAR_ENGINE_JWT_HEX= +# The fee recipient address for fallback blocks BOLT_SIDECAR_FEE_RECIPIENT= +# Secret ECDSA key to sign commitment messages with. The public key associated +# to it must be then used when registering the operator in the `BoltManager` +# contract +BOLT_SIDECAR_COMMITMENT_PRIVATE_KEY= +# Secret BLS key to sign fallback payloads with BOLT_SIDECAR_BUILDER_PRIVATE_KEY= -# Commitments configs -BOLT_SIDECAR_MAX_COMMITMENTS=128 -BOLT_SIDECAR_MAX_COMMITTED_GAS= -BOLT_SIDECAR_MIN_PRIORITY_FEE= -BOLT_SIDECAR_COMMITMENT_DEADLINE=8000 +# Commitments limits +# Max number of commitments to accept per block +BOLT_SIDECAR_MAX_COMMITMENTS_PER_SLOT=128 +# Max committed gas per slot +BOLT_SIDECAR_MAX_COMMITTED_GAS_PER_SLOT=10_000_000 +# Min priority fee to accept for a commitment +BOLT_SIDECAR_MIN_PRIORITY_FEE=4_000_000_000 # 4 Gwei = 4 * 10^9 wei -# Chain configs -BOLT_SIDECAR_CHAIN=holesky +# Chain configuration +# Chain on which the sidecar is running +BOLT_SIDECAR_CHAIN="holesky" +# The slot time duration in seconds. If provided, it overrides the default for +# the selected [chain] BOLT_SIDECAR_SLOT_TIME=12 +# The deadline in the slot at which the sidecar will stop accepting new +# commitments for the next block (parsed as milliseconds) +BOLT_SIDECAR_COMMITMENT_DEADLINE=8000 -# Signing options. Uncomment only what you'll use -#BOLT_SIDECAR_CONSTRAINT_PRIVATE_KEY= -#BOLT_SIDECAR_COMMITMENT_PRIVATE_KEY= -#BOLT_SIDECAR_CB_SIGNER_URL= -#BOLT_SIDECAR_CB_JWT_HEX= -#BOLT_SIDECAR_KEYSTORE_PASSWORD= -#BOLT_SIDECAR_KEYSTORE_PATH= -#BOLT_SIDECAR_DELEGATIONS_PATH= +# Signing options. +BOLT_SIDECAR_CONSTRAINT_PRIVATE_KEY= +BOLT_SIDECAR_CB_SIGNER_URL= +BOLT_SIDECAR_CB_JWT_HEX= +BOLT_SIDECAR_KEYSTORE_PASSWORD= +BOLT_SIDECAR_KEYSTORE_SECRETS_PATH= +BOLT_SIDECAR_KEYSTORE_PATH= +BOLT_SIDECAR_DELEGATIONS_PATH= -# Metrics -BOLT_SIDECAR_METRICS_PORT= -BOLT_SIDECAR_DISABLE_METRICS= +# Telemetry and Metrics +BOLT_SIDECAR_METRICS_PORT=9091 +BOLT_SIDECAR_DISABLE_METRICS=false diff --git a/bolt-sidecar/Config.example.toml b/bolt-sidecar/Config.example.toml deleted file mode 100644 index 2bb86003b..000000000 --- a/bolt-sidecar/Config.example.toml +++ /dev/null @@ -1,84 +0,0 @@ -# Ethereum Node Connections + PBS URLs - -# Port to listen on for incoming JSON-RPC requests of the Commitments API. This -# port should be open on your firewall in order to receive external requests! -port = 8017 -# Execution client API URL -execution_api_url = "http://localhost:8545" -# URL for the beacon client -beacon_api_url = "http://localhost:5052" -# Execution client Engine API URL. This is needed for fallback block building -# and must be a synced Geth node -engine_api_url = "http://localhost:8551" -# The port from which the Bolt sidecar will receive Builder-API requests from the Beacon client -constraints_proxy_port = 18550 -# URL to forward the constraints produced by the Bolt sidecar to a server -# supporting the Constraints API, such as an MEV-Boost fork -constraints_api_url = "http://localhost:18551" -# Validator indexes of connected validators that the sidecar should accept -# commitments on behalf of. -# Accepted values: -# - a comma-separated list of indexes (e.g. "1,2,3,4") -# - a contiguous range of indexes (e.g. "1..4") -# - a mix of the above (e.g. "1,2..4,6..8") -# REQUIRED -validator_indexes = "0..64" -# The JWT secret token to authenticate calls to the engine API. It can be -# either be a hex-encoded string or a file path to a file containing the -# hex-encoded secret. -# REQUIRED -engine_jwt_hex = "0x0000000000000000000000000000000000000000000000000000000000000000" -# The fee recipient address for fallback blocks -# REQUIRED -fee_recipient = "0x0000000000000000000000000000000000000000" -# Secret ECDSA key to sign commitment messages with. The public key associated -# to it must be then used when registering the operator in the `BoltManager` -# contract -# REQUIRED -commitment_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" -# Secret BLS key to sign fallback payloads with -# REQUIRED -builder_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" - -# Commitments limits -[limits] -# Max number of commitments to accept per block -max_commitments_per_slot = 128 -# Max committed gas per slot -max_committed_gas_per_slot = 10_000_000 -# Min priority fee to accept for a commitment -min_priority_fee = 4_000_000_000 # 4 Gwei = 4 * 10^9 wei - -# Chain configuration -[chain] -# Chain on which the sidecar is running -chain = "holesky" -# The slot time duration in seconds. If provided, it overrides the default for -# the selected [chain] -slot_time = 12 -# The deadline in the slot at which the sidecar will stop accepting new -# commitments for the next block (parsed as milliseconds) -commitment_deadline = 8000 - -# Signing options. Uncomment only the signing setup you'll use: -# - single private key -> `constraints_private_key` -# - commit-boost -> `cb_signer_url`, `cb_jwt_hex` -# - keystores -> `keystore_path`, `keystore_password` or `keystore_secrets_path` -# (depending on whether all keystores have the same passwords or not) -# -# If you plan to use delegations, uncomment the option `delegations_path` as -# well. -[constraint_signing] -# Private key to use for signing constraint messages -# constraint_private_key = "0x0000000000000000000000000000000000000000000000000000000000000000" -# cb_signer_url = "http://localhost:18551" -# cb_jwt_hex = "0x0000000000000000000000000000000000000000000000000000000000000000" -# keystore_password = "password" -# keystore_secrets_path = "./secrets" -# keystore_path = "./keys" -# delegations_path = "./delegations.json" - -# Telemetry and Metrics -[telemetry] -metrics_port = 3300 -disable_metrics = false diff --git a/bolt-sidecar/bin/sidecar.rs b/bolt-sidecar/bin/sidecar.rs index 6903fffbd..fbf0ce31c 100644 --- a/bolt-sidecar/bin/sidecar.rs +++ b/bolt-sidecar/bin/sidecar.rs @@ -1,22 +1,12 @@ -use std::fs; - use clap::Parser; use eyre::{bail, Result}; use tracing::info; use bolt_sidecar::{telemetry::init_telemetry_stack, Opts, SidecarDriver}; -pub const TOML_CONFIG_DEFAULT_PATH: &str = "./Config.toml"; - #[tokio::main] async fn main() -> Result<()> { - let opts = if let Ok(config_path) = std::env::var("BOLT_SIDECAR_CONFIG_PATH") { - Opts::parse_from_toml(config_path.as_str())? - } else if fs::exists(TOML_CONFIG_DEFAULT_PATH).is_ok_and(|exists| exists) { - Opts::parse_from_toml(TOML_CONFIG_DEFAULT_PATH)? - } else { - Opts::parse() - }; + let opts = Opts::parse(); if let Err(err) = init_telemetry_stack(opts.telemetry.metrics_port()) { bail!("Failed to initialize telemetry stack: {:?}", err) diff --git a/bolt-sidecar/src/config/mod.rs b/bolt-sidecar/src/config/mod.rs index 1b9e64b76..7d05e1171 100644 --- a/bolt-sidecar/src/config/mod.rs +++ b/bolt-sidecar/src/config/mod.rs @@ -1,8 +1,5 @@ -use std::fs; - use alloy::primitives::Address; use clap::Parser; -use eyre::Context; use reqwest::Url; use serde::Deserialize; @@ -110,14 +107,6 @@ pub struct Opts { pub extra_args: Vec, } -impl Opts { - /// Parse the configuration from a TOML file. - pub fn parse_from_toml(file_path: &str) -> eyre::Result { - let contents = fs::read_to_string(file_path).wrap_err("Unable to read file")?; - toml::from_str(&contents).wrap_err("Error parsing the TOML file") - } -} - #[cfg(test)] mod tests { use super::*; @@ -136,16 +125,4 @@ mod tests { let localhost_socket = "0.0.0.0:3030".parse().unwrap(); assert_eq!(socket_addr, localhost_socket); } - - #[test] - fn test_parse_config_from_toml() { - let path = env!("CARGO_MANIFEST_DIR").to_string() + "/Config.example.toml"; - - let config = Opts::parse_from_toml(&path).expect("Failed to parse config from TOML"); - assert_eq!(config.execution_api_url, Url::parse("http://localhost:8545").unwrap()); - assert_eq!(config.beacon_api_url, Url::parse("http://localhost:5052").unwrap()); - assert_eq!(config.engine_api_url, Url::parse("http://localhost:8551").unwrap()); - assert_eq!(config.constraints_api_url, Url::parse("http://localhost:3030").unwrap()); - assert_eq!(config.constraints_proxy_port, 18551); - } } diff --git a/bolt-sidecar/src/primitives/delegation.rs b/bolt-sidecar/src/primitives/delegation.rs index 20b689bbd..3d41f275f 100644 --- a/bolt-sidecar/src/primitives/delegation.rs +++ b/bolt-sidecar/src/primitives/delegation.rs @@ -47,7 +47,7 @@ impl SignableBLS for DelegationMessage { } } -/// read the delegaitons from disk if they exist and add them to the constraints client +/// read the delegations from disk if they exist and add them to the constraints client pub fn read_signed_delegations_from_file( file_path: &PathBuf, ) -> eyre::Result> { diff --git a/testnets/holesky/bolt-sidecar.env.example b/testnets/holesky/bolt-sidecar.env.example new file mode 100644 index 000000000..a094ec52d --- /dev/null +++ b/testnets/holesky/bolt-sidecar.env.example @@ -0,0 +1,67 @@ +# Ethereum Node Connections + PBS URLs + +# Port to listen on for incoming JSON-RPC requests of the Commitments API. This +# port should be open on your firewall in order to receive external requests! +BOLT_SIDECAR_PORT=8017 +# Execution client API URL +BOLT_SIDECAR_EXECUTION_API_URL="http://localhost:8545" +# URL for the beacon client +BOLT_SIDECAR_BEACON_API_URL="http://localhost:5052" +# Execution client Engine API URL. This is needed for fallback block building +# and must be a synced Geth node +BOLT_SIDECAR_ENGINE_API_URL="http://localhost:8551" +# The port from which the Bolt sidecar will receive Builder-API requests from the Beacon client +BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT=18550 +# URL to forward the constraints produced by the Bolt sidecar to a server +# supporting the Constraints API, such as an MEV-Boost fork +BOLT_SIDECAR_CONSTRAINTS_API_URL="http://localhost:18551" +# Validator indexes of connected validators that the sidecar should accept +# commitments on behalf of. +# Accepted values: +# - a comma-separated list of indexes (e.g. "1,2,3,4") +# - a contiguous range of indexes (e.g. "1..4") +# - a mix of the above (e.g. "1,2..4,6..8") +BOLT_SIDECAR_VALIDATOR_INDEXES= +# The JWT secret token to authenticate calls to the engine API. It can be +# either be a hex-encoded string or a file path to a file containing the +# hex-encoded secret. +BOLT_SIDECAR_ENGINE_JWT_HEX= +# The fee recipient address for fallback blocks +BOLT_SIDECAR_FEE_RECIPIENT= +# Secret ECDSA key to sign commitment messages with. The public key associated +# to it must be then used when registering the operator in the `BoltManager` +# contract +BOLT_SIDECAR_COMMITMENT_PRIVATE_KEY= +# Secret BLS key to sign fallback payloads with +BOLT_SIDECAR_BUILDER_PRIVATE_KEY= + +# Commitments limits +# Max number of commitments to accept per block +BOLT_SIDECAR_MAX_COMMITMENTS_PER_SLOT=128 +# Max committed gas per slot +BOLT_SIDECAR_MAX_COMMITTED_GAS_PER_SLOT=10_000_000 +# Min priority fee to accept for a commitment +BOLT_SIDECAR_MIN_PRIORITY_FEE=4_000_000_000 # 4 Gwei = 4 * 10^9 wei + +# Chain configuration +# Chain on which the sidecar is running +BOLT_SIDECAR_CHAIN="holesky" +# The slot time duration in seconds. If provided, it overrides the default for +# the selected [chain] +BOLT_SIDECAR_SLOT_TIME=12 +# The deadline in the slot at which the sidecar will stop accepting new +# commitments for the next block (parsed as milliseconds) +BOLT_SIDECAR_COMMITMENT_DEADLINE=8000 + +# Signing options. +BOLT_SIDECAR_CONSTRAINT_PRIVATE_KEY= +BOLT_SIDECAR_CB_SIGNER_URL= +BOLT_SIDECAR_CB_JWT_HEX= +BOLT_SIDECAR_KEYSTORE_PASSWORD= +BOLT_SIDECAR_KEYSTORE_SECRETS_PATH= +BOLT_SIDECAR_KEYSTORE_PATH= +BOLT_SIDECAR_DELEGATIONS_PATH= + +# Telemetry and Metrics +BOLT_SIDECAR_METRICS_PORT=9091 # Changing this requires also changing the `target.json` file +BOLT_SIDECAR_DISABLE_METRICS=false diff --git a/testnets/holesky/mev-boost.env.example b/testnets/holesky/mev-boost.env.example new file mode 100644 index 000000000..8815677dc --- /dev/null +++ b/testnets/holesky/mev-boost.env.example @@ -0,0 +1,32 @@ +# Logging settings +LOG_JSON=false # Set to true to log in JSON format +LOG_LEVEL=info # Log level: trace, debug, info, warn, error, fatal, panic +DEBUG=false # Set to true to enable debug mode +LOG_SERVICE_TAG= # Optional: Add a custom service tag to all log entries +DISABLE_LOG_VERSION=false # Set to true to disable logging the version + +# Server settings +BOOST_LISTEN_ADDR=localhost:18550 # Address for mev-boost server to listen on +RELAY_STARTUP_CHECK=false # Set to true to check relay status on startup + +# Relay settings +RELAYS= # Relay URLs: single or comma-separated list (scheme://pubkey@host) +RELAY_MONITORS= # Relay monitor URLs: single or comma-separated list (scheme://host) +MIN_BID_ETH=0 # Minimum bid to accept from relay (in ETH) + +# Relay timeout settings (in ms) +RELAY_TIMEOUT_MS_GETHEADER=950 # Timeout for getHeader requests to the relay +RELAY_TIMEOUT_MS_GETPAYLOAD=4000 # Timeout for getPayload requests to the relay +RELAY_TIMEOUT_MS_REGVAL=3000 # Timeout for registerValidator requests + +# Genesis settings -- Not needed if using one of the predefined networks +# GENESIS_FORK_VERSION= # Custom genesis fork version +# GENESIS_TIMESTAMP=-1 # Custom genesis timestamp (in unix seconds) + +# Network settings +SEPOLIA=false # Set to true to use Sepolia network +GOERLI=false # Set to true to use Goerli network +HOLESKY=true # Set to true to use Holesky network + +# Retry settings +REQUEST_MAX_RETRIES=5 # Max retries for relay get payload request From 9d759c4a42dc535d0ae281fef0d32f0caba8b53b Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 24 Oct 2024 16:35:32 +0200 Subject: [PATCH 70/85] chore(holesky): update README after dropping TOML support --- testnets/holesky/README.md | 91 +++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 41 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 45a2fd339..7da86a4d7 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -23,7 +23,7 @@ This document provides instructions for running the Bolt sidecar on the Holesky * [Reference](#reference) * [Command-line options](#command-line-options) * [Delegations and signing options for Native and Docker Compose Mode](#delegations-and-signing-options-for-native-and-docker-compose-mode) - * [`bolt-cli`](#bolt-cli) + * [`bolt` CLI](#`bolt`-cli) * [Installation and usage](#installation-and-usage) * [Using a private key directly](#using-a-private-key-directly) * [Using a ERC-2335 Keystore](#using-a-erc-2335-keystore) @@ -77,10 +77,10 @@ client implementations to download and run them. **Active validators:** -The Bolt sidecar requires access to BLS signing keys from active Ethereum validators, +The Bolt sidecar requires access to BLS signing keys from active Ethereum validators, or **authorized delegates** acting on their behalf, to issue and sign preconfirmations. -To learn more about delegation, check out the [Delegations and Signing](#delegations-and-signing-options-for-native-and-docker-compose-mode) +To learn more about delegation, check out the [Delegations and Signing](#delegations-and-signing-options-for-native-and-docker-compose-mode) section. # Off-Chain Setup @@ -123,41 +123,48 @@ containing the necessary environment variables: 1. **Bolt Sidecar Configuration:** - Create a `bolt-sidecar.toml` file in the `testnets/holesky` directory. If you - need a reference, you can use the `Config.example.toml` file in the `bolt-sidecar` - directory as a starting point. + Change directory to the `testnets/holesky` folder and create a + `bolt-sidecar.env` file starting from the reference template: ```bash - cp ./bolt-sidecar/Config.example.toml ./testnets/holesky/bolt-sidecar.toml + cd testnets/holesky + cp bolt-sidecar.env.example bolt-sidecar.env ``` - Next up, fill out all the values that are required. For proper configuration - of the signing options, please refer to the [Delegations and + Next up, fill out the values that are left blank. Please also review the + default values and see that they work for your setup. For proper + configuration of the signing options, please refer to the [Delegations and Signing](#delegations-and-signing-options-for-native-and-docker-compose-mode) section of this guide. + If you've generated a `delegation.json` file using the Bolt CLI please + place it in the `testnets/holesky` directory by replacing the existing empty + one. + 2. **MEV-Boost Configuration:** - Copy over the example configuration file: + Change directory to the `testnets/holesky` folder if you haven't already and + copy over the example configuration file: ```bash - cp ./mev-boost/.env.example ./testnets/holesky/mev-boost.env + cp ./mev-boost.env.example ./mev-boost.env ``` - Then configure it accordingly. +Then configure it accordingly and review the default values chosen. If you prefer not to restart your beacon node, follow the instructions in the [Avoid Restarting the Beacon Node](#avoid-restarting-the-beacon-node) section. -Once the configuration files are in place, you can start the Docker containers -by running: +Once the configuration files are in place, make sure you are in the +`testnets/holesky` directory and then run: ```bash -cd testnets/holesky && docker compose up -d +docker compose up -d --env-file bolt-sidecar.env ``` The docker compose setup comes with various observability tools, such as -Prometheus and Grafana. It also comes with some pre-built dashboards which you can find at `http://localhost:3000`. +Prometheus and Grafana. It also comes with some pre-built dashboards which you +can find at `http://localhost:28017`. ## Commit-Boost Mode @@ -315,11 +322,8 @@ can be found by running `./bolt-sidecar --help`, or you can find them in the #### Configuration file -You can use a `Config.toml` file to configure the sidecar, for which you can -find a template in the `Config.example.toml` file. -If you wish to place the configuration file in another folder you need to -specify the path of the configuration file by setting the -`BOLT_SIDECAR_CONFIG_PATH` environment variable to the path of the file. +You can use a `.env` file to configure the sidecar, for which you can +find a template in the `.env.example` file. Please read the section on [Delegations and Signing](#delegations-and-signing-options-for-native-and-docker-compose-mode) to configure such sidecar options properly. @@ -332,16 +336,22 @@ After you've set up the configuration file you can run the Bolt sidecar with ### Observability -Commit-Boost comes with various observability tools, such as Prometheus, -cadvisor, and Grafana. It also comes with some pre-built dashboards, which can +The bolt sidecar comes with various observability tools, such as Prometheus +and Grafana. It also comes with some pre-built dashboards, which can be found in the `grafana` directory. -To update these dashboards, run the following command: +To run these dashboards change directory to the `bolt-sidecar/infra` folder and +run: + +```bash +docker compose -f telemetry.compose.yml up -d +``` -`bash ./update-grafana.sh ` +To stop the services run: -In this directory, you can also find a Bolt dashboard, which will be launched -alongside the other dashboards. +```bash +docker compose -f telemetry.compose.yml down +``` # On-Chain Registration @@ -819,7 +829,6 @@ Options:
- ## Delegations and signing options for Native and Docker Compose Mode As mentioned in the [prerequisites](#prerequisites) section, the Bolt sidecar @@ -830,13 +839,13 @@ Ethereum validators. > This is the recommended way to run the Bolt sidecar as it > doesn't expose the active validator signing keys to any additional risk. -In order to create these delegation you can use the `bolt-delegations-cli` binary. +In order to create these delegation you can use the `bolt` CLI binary. If you don't want to use it you can skip the following section. ### `bolt` CLI -`bolt` CLI is an offline tool for safely generating delegation and revocation messages -signed with a BLS12-381 key for the [Constraints API](https://docs.boltprotocol.xyz/api/builder) +`bolt` CLI is an offline tool for safely generating delegation and revocation messages +signed with a BLS12-381 key for the [Constraints API](https://docs.boltprotocol.xyz/api/builder) in [Bolt](https://docs.boltprotocol.xyz/). The tool supports three key sources: @@ -855,7 +864,7 @@ Prerequisites: - [Rust toolchain](https://www.rust-lang.org/tools/install) - [Protoc](https://grpc.io/docs/protoc-installation/) -Once you have the necessary prerequisites, you can build the binary +Once you have the necessary prerequisites, you can build the binary in the following way: ```shell @@ -875,10 +884,10 @@ bolt --version The binary can be used with the following command: ```shell -bolt delegate --delegate-pubkey - --out - --chain - +bolt delegate --delegate-pubkey + --out + --chain + ``` @@ -891,8 +900,8 @@ where: - `secret-keys`: A list of BLS private keys provided directly as hex-strings. - `local-keystore`: A EIP-2335 keystore that contains an encrypted BLS private keys. - `dirk`: A remote Dirk server that provides the BLS signatures for the delegation messages. - -You can also find more information about the available key source + +You can also find more information about the available key source options by running `bolt delegate --help`. > [!TIP] @@ -1035,8 +1044,8 @@ can pass directly the private key as a hex-encoded string to the Bolt sidecar using the `--constraint-private-key` flag (or `constraint_private_key` in the TOML file). -This is the simplest setup and can be used in case if all the delegations messages -point to the same delegatee or if you're running the sidecar with a single active +This is the simplest setup and can be used in case if all the delegations messages +point to the same delegatee or if you're running the sidecar with a single active validator. ### Using a ERC-2335 Keystore @@ -1049,7 +1058,7 @@ containing the password file (in the TOML configuration file these are the `keystore_path`, `keystore_password` and `keystore_secrets_path` respectively). Both the `keys` and `passwords` folders must adhere to the structure outlined -in the [Delegations CLI example](#delegations-cli-example) section. +in the [Installation and Usage](#installation-and-usage) section. ## Avoid restarting the beacon node From f06c36273fdb9c62a1d19e1494e09ed8b72dbd5f Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Thu, 24 Oct 2024 16:55:06 +0200 Subject: [PATCH 71/85] Update testnets/holesky/README.md Co-authored-by: nicolas <48695862+merklefruit@users.noreply.github.com> --- testnets/holesky/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 7da86a4d7..b78a75acb 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -884,7 +884,7 @@ bolt --version The binary can be used with the following command: ```shell -bolt delegate --delegate-pubkey +bolt delegate --delegatee-pubkey --out --chain From 261fdd18ec3738bfc7e685530d08e71cbdbae5ee Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 24 Oct 2024 16:11:47 +0200 Subject: [PATCH 72/85] fix(holesky): docker compose setup -- grafana, prometheus --- testnets/holesky/delegations.json | 1 + testnets/holesky/docker-compose.yml | 22 +- .../grafana/dashboards/bolt_dashboard.json | 836 ----------------- .../holesky/grafana/dashboards/dashboard.json | 473 +++++----- .../grafana/dashboards/system_metrics.json | 853 ------------------ .../grafana/datasources/datasources.yml | 2 +- testnets/holesky/targets.json | 10 +- 7 files changed, 262 insertions(+), 1935 deletions(-) create mode 100644 testnets/holesky/delegations.json delete mode 100644 testnets/holesky/grafana/dashboards/bolt_dashboard.json delete mode 100644 testnets/holesky/grafana/dashboards/system_metrics.json diff --git a/testnets/holesky/delegations.json b/testnets/holesky/delegations.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/testnets/holesky/delegations.json @@ -0,0 +1 @@ +[] diff --git a/testnets/holesky/docker-compose.yml b/testnets/holesky/docker-compose.yml index 86d2c3dce..e0c54cbc7 100644 --- a/testnets/holesky/docker-compose.yml +++ b/testnets/holesky/docker-compose.yml @@ -6,10 +6,11 @@ services: ports: - "${BOLT_SIDECAR_PORT:-8017}:${BOLT_SIDECAR_PORT:-8017}" # Bolt RPC port (this should be opened on your firewall!) - "${BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT:-18550}:${BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT:-18550}" - entrypoint: /bin/sh -c "BOLT_SIDECAR_CONFIG_PATH=/etc/bolt-sidecar.toml /usr/local/bin/bolt-sidecar" + entrypoint: /bin/sh -c /usr/local/bin/bolt-sidecar + env_file: ./bolt-sidecar.env volumes: - "./bolt-sidecar.toml:/etc/bolt-sidecar.toml" - - "../../bolt-delegations-cli/delegations.json:/etc/delegations.json" + - "./delegations.json:${BOLT_SIDECAR_DELEGATIONS_PATH:-/etc/delegations.json}" bolt-mev-boost-holesky: image: ghcr.io/chainbound/bolt-mev-boost:v0.3.0-alpha.rc1 @@ -22,39 +23,26 @@ services: image: prom/prometheus:latest container_name: bolt-prometheus-holesky ports: - - 49090:49090 + - 18017:9090 volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - ./targets.json:/etc/prometheus/targets.json - prometheus-data:/prometheus - networks: - - monitoring_network bolt-grafana-holesky: image: grafana/grafana:latest container_name: bolt-grafana-holesky ports: - - 33000:33000 - environment: - - GF_SECURITY_ADMIN_PASSWORD=admin + - 28017:3000 volumes: - ./grafana/dashboards:/etc/grafana/provisioning/dashboards - ./grafana/datasources:/etc/grafana/provisioning/datasources - grafana-data:/var/lib/grafana - networks: - - monitoring_network depends_on: - bolt-prometheus-holesky - logging: - driver: none volumes: prometheus-data: driver: local grafana-data: driver: local -networks: - monitoring_network: - driver: bridge - signer_network: - driver: bridge diff --git a/testnets/holesky/grafana/dashboards/bolt_dashboard.json b/testnets/holesky/grafana/dashboards/bolt_dashboard.json deleted file mode 100644 index dce85acb0..000000000 --- a/testnets/holesky/grafana/dashboards/bolt_dashboard.json +++ /dev/null @@ -1,836 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 2, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 9, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "editorMode": "builder", - "expr": "bolt_sidecar_transactions_preconfirmed", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Transactions Preconfirmed", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 10, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "editorMode": "builder", - "expr": "bolt_sidecar_validation_errors", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Invalid Transactions Reasons", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "stepAfter", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 2, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "editorMode": "builder", - "expr": "bolt_sidecar_remote_blocks_proposed", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Remote Blocks Proposed", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "stepAfter", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "editorMode": "builder", - "expr": "bolt_sidecar_inclusion_commitments_received", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Inclusion Commitments Received", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "stepAfter", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "__systemRef": "hideSeriesFrom", - "matcher": { - "id": "byNames", - "options": { - "mode": "exclude", - "names": [ - "{__name__=\"bolt_sidecar_local_blocks_proposed\", instance=\"172.16.0.25:9063\", job=\"bolt-sidecar\"}" - ], - "prefix": "All except:", - "readOnly": true - } - }, - "properties": [ - { - "id": "custom.hideFrom", - "value": { - "legend": false, - "tooltip": false, - "viz": true - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 8, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.5.12", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "editorMode": "builder", - "exemplar": false, - "expr": "bolt_sidecar_local_blocks_proposed", - "instant": false, - "interval": "", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Local Blocks Proposed", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "stepAfter", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "editorMode": "builder", - "expr": "bolt_sidecar_inclusion_commitments_accepted", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Inclusion Commitments Accepted", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 6, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "editorMode": "builder", - "expr": "bolt_sidecar_http_requests_total", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Total HTTP Requests", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "fillOpacity": 80, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineWidth": 1 - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 7, - "options": { - "bucketOffset": 0, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "editorMode": "builder", - "expr": "bolt_sidecar_http_requests_duration_seconds", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "HTTP Requests Durations in ms", - "type": "histogram" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 3, - "x": 0, - "y": 32 - }, - "id": 3, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": ["lastNotNull"], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "9.5.12", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "editorMode": "builder", - "expr": "bolt_sidecar_latest_head", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Latest Head Slot", - "type": "stat" - } - ], - "refresh": "", - "schemaVersion": 38, - "style": "dark", - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Bolt Sidecar", - "uid": "e5960f6d-a1ed-4538-9c7c-3ecba4d4b4b1", - "version": 3, - "weekStart": "" -} diff --git a/testnets/holesky/grafana/dashboards/dashboard.json b/testnets/holesky/grafana/dashboards/dashboard.json index f903affb2..8823158a8 100644 --- a/testnets/holesky/grafana/dashboards/dashboard.json +++ b/testnets/holesky/grafana/dashboards/dashboard.json @@ -18,28 +18,14 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, + "id": 2, "links": [], - "liveNow": true, + "liveNow": false, "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 12, - "panels": [], - "repeat": "endpoint", - "repeatDirection": "h", - "title": "$endpoint calls", - "type": "row" - }, { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, "fieldConfig": { "defaults": { @@ -47,7 +33,6 @@ "mode": "palette-classic" }, "custom": { - "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", @@ -61,11 +46,7 @@ "tooltip": false, "viz": false }, - "insertNulls": false, "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, "lineWidth": 1, "pointSize": 5, "scaleDistribution": { @@ -82,7 +63,6 @@ } }, "mappings": [], - "min": 0, "thresholds": { "mode": "absolute", "steps": [ @@ -100,12 +80,12 @@ "overrides": [] }, "gridPos": { - "h": 11, - "w": 6, + "h": 8, + "w": 12, "x": 0, - "y": 1 + "y": 0 }, - "id": 11, + "id": 9, "options": { "legend": { "calcs": [], @@ -122,23 +102,22 @@ { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, - "editorMode": "code", - "expr": "sum(increase(cb_pbs_relay_status_code_total{http_status_code=~\"2..\", endpoint=\"$endpoint\"}[1h])) by (relay_id)", - "instant": false, + "editorMode": "builder", + "expr": "bolt_sidecar_transactions_preconfirmed", "legendFormat": "__auto", "range": true, "refId": "A" } ], - "title": "$endpoint Relay Success QPH", + "title": "Transactions Preconfirmed", "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, "fieldConfig": { "defaults": { @@ -146,7 +125,6 @@ "mode": "palette-classic" }, "custom": { - "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", @@ -160,11 +138,7 @@ "tooltip": false, "viz": false }, - "insertNulls": false, "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, "lineWidth": 1, "pointSize": 5, "scaleDistribution": { @@ -181,7 +155,6 @@ } }, "mappings": [], - "min": 0, "thresholds": { "mode": "absolute", "steps": [ @@ -199,12 +172,12 @@ "overrides": [] }, "gridPos": { - "h": 11, - "w": 6, - "x": 6, - "y": 1 + "h": 8, + "w": 12, + "x": 12, + "y": 0 }, - "id": 13, + "id": 10, "options": { "legend": { "calcs": [], @@ -221,23 +194,22 @@ { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, - "editorMode": "code", - "expr": "sum(increase(cb_pbs_relay_status_code_total{http_status_code=~\"4..|5..\", endpoint=\"$endpoint\"}[1h])) by (relay_id)", - "instant": false, + "editorMode": "builder", + "expr": "bolt_sidecar_validation_errors", "legendFormat": "__auto", "range": true, "refId": "A" } ], - "title": "$endpoint Relay Error QPH", + "title": "Invalid Transactions Reasons", "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, "fieldConfig": { "defaults": { @@ -245,7 +217,6 @@ "mode": "palette-classic" }, "custom": { - "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", @@ -259,11 +230,7 @@ "tooltip": false, "viz": false }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, + "lineInterpolation": "stepAfter", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { @@ -280,17 +247,12 @@ } }, "mappings": [], - "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null - }, - { - "color": "red", - "value": 80 } ] } @@ -298,12 +260,12 @@ "overrides": [] }, "gridPos": { - "h": 11, - "w": 6, - "x": 12, - "y": 1 + "h": 8, + "w": 12, + "x": 0, + "y": 8 }, - "id": 43, + "id": 2, "options": { "legend": { "calcs": [], @@ -320,23 +282,22 @@ { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, - "editorMode": "code", - "expr": "sum(increase(cb_pbs_beacon_node_status_code_total{http_status_code=~\"2..\", endpoint=\"$endpoint\"}[1h]))", - "instant": false, + "editorMode": "builder", + "expr": "bolt_sidecar_remote_blocks_proposed", "legendFormat": "__auto", "range": true, "refId": "A" } ], - "title": "$endpoint Beacon Node Success QPH", + "title": "Remote Blocks Proposed", "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, "fieldConfig": { "defaults": { @@ -344,7 +305,6 @@ "mode": "palette-classic" }, "custom": { - "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", @@ -358,11 +318,7 @@ "tooltip": false, "viz": false }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, + "lineInterpolation": "stepAfter", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { @@ -379,7 +335,6 @@ } }, "mappings": [], - "min": 0, "thresholds": { "mode": "absolute", "steps": [ @@ -397,12 +352,12 @@ "overrides": [] }, "gridPos": { - "h": 11, - "w": 6, - "x": 18, - "y": 1 + "h": 8, + "w": 12, + "x": 12, + "y": 8 }, - "id": 44, + "id": 4, "options": { "legend": { "calcs": [], @@ -419,23 +374,22 @@ { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, - "editorMode": "code", - "expr": "sum(increase(cb_pbs_beacon_node_status_code_total{http_status_code=~\"4..|5..\", endpoint=\"$endpoint\"}[1h]))", - "instant": false, + "editorMode": "builder", + "expr": "bolt_sidecar_inclusion_commitments_received", "legendFormat": "__auto", "range": true, "refId": "A" } ], - "title": "$endpoint Beacon Node Error QPH", + "title": "Inclusion Commitments Received", "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, "fieldConfig": { "defaults": { @@ -443,7 +397,6 @@ "mode": "palette-classic" }, "custom": { - "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", @@ -457,18 +410,14 @@ "tooltip": false, "viz": false }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, + "lineInterpolation": "stepAfter", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, - "showPoints": "always", - "spanNulls": true, + "showPoints": "auto", + "spanNulls": false, "stacking": { "group": "A", "mode": "none" @@ -478,7 +427,6 @@ } }, "mappings": [], - "min": 0, "thresholds": { "mode": "absolute", "steps": [ @@ -491,18 +439,42 @@ "value": 80 } ] - }, - "unit": "s" + } }, - "overrides": [] + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "{__name__=\"bolt_sidecar_local_blocks_proposed\", instance=\"172.16.0.25:9063\", job=\"bolt-sidecar\"}" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] }, "gridPos": { - "h": 11, - "w": 6, + "h": 8, + "w": 12, "x": 0, - "y": 12 + "y": 16 }, - "id": 20, + "id": 8, "options": { "legend": { "calcs": [], @@ -515,31 +487,30 @@ "sort": "none" } }, + "pluginVersion": "9.5.12", "targets": [ { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(cb_pbs_relay_latency_bucket{endpoint=\"$endpoint\"}[1m])) by (le, relay_id))", - "fullMetaSearch": false, - "includeNullMetadata": true, + "editorMode": "builder", + "exemplar": false, + "expr": "bolt_sidecar_local_blocks_proposed", "instant": false, + "interval": "", "legendFormat": "__auto", "range": true, - "refId": "A", - "useBackend": false + "refId": "A" } ], - "title": "$endpoint Relay P50", + "title": "Local Blocks Proposed", "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, "fieldConfig": { "defaults": { @@ -547,7 +518,6 @@ "mode": "palette-classic" }, "custom": { - "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", @@ -561,18 +531,14 @@ "tooltip": false, "viz": false }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, + "lineInterpolation": "stepAfter", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, - "showPoints": "always", - "spanNulls": true, + "showPoints": "auto", + "spanNulls": false, "stacking": { "group": "A", "mode": "none" @@ -582,31 +548,25 @@ } }, "mappings": [], - "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null - }, - { - "color": "red", - "value": 80 } ] - }, - "unit": "s" + } }, "overrides": [] }, "gridPos": { - "h": 11, - "w": 6, - "x": 6, - "y": 12 + "h": 8, + "w": 12, + "x": 12, + "y": 16 }, - "id": 29, + "id": 5, "options": { "legend": { "calcs": [], @@ -623,27 +583,22 @@ { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(rate(cb_pbs_relay_latency_bucket{endpoint=\"$endpoint\"}[1m])) by (le, relay_id))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, + "editorMode": "builder", + "expr": "bolt_sidecar_inclusion_commitments_accepted", "legendFormat": "__auto", "range": true, - "refId": "A", - "useBackend": false + "refId": "A" } ], - "title": "$endpoint Relay P90", + "title": "Inclusion Commitments Accepted", "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, "fieldConfig": { "defaults": { @@ -651,7 +606,6 @@ "mode": "palette-classic" }, "custom": { - "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", @@ -665,18 +619,14 @@ "tooltip": false, "viz": false }, - "insertNulls": false, "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, - "showPoints": "always", - "spanNulls": true, + "showPoints": "auto", + "spanNulls": false, "stacking": { "group": "A", "mode": "none" @@ -686,7 +636,6 @@ } }, "mappings": [], - "min": 0, "thresholds": { "mode": "absolute", "steps": [ @@ -699,18 +648,17 @@ "value": 80 } ] - }, - "unit": "s" + } }, "overrides": [] }, "gridPos": { - "h": 11, - "w": 6, - "x": 12, - "y": 12 + "h": 8, + "w": 12, + "x": 0, + "y": 24 }, - "id": 30, + "id": 6, "options": { "legend": { "calcs": [], @@ -727,77 +675,162 @@ { "datasource": { "type": "prometheus", - "uid": "cb_prometheus" + "uid": "bolt-prometheus-holesky" }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(cb_pbs_relay_latency_bucket{endpoint=\"$endpoint\"}[1m])) by (le, relay_id))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, + "editorMode": "builder", + "expr": "bolt_sidecar_http_requests_total", "legendFormat": "__auto", "range": true, - "refId": "A", - "useBackend": false + "refId": "A" } ], - "title": "$endpoint Relay P99", + "title": "Total HTTP Requests", "type": "timeseries" - } - ], - "refresh": "5m", - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [ - { - "current": { - "selected": true, - "text": "All", - "value": "$__all" - }, - "description": "BuilderAPI endpoint", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "endpoint", - "options": [ - { - "selected": true, - "text": "All", - "value": "$__all" + }, + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" }, - { - "selected": false, - "text": "get_header", - "value": "get_header" + "custom": { + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1 }, - { - "selected": false, - "text": "submit_blinded_block", - "value": "submit_blinded_block" + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 24 + }, + "id": 7, + "options": { + "bucketOffset": 0, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" }, - { - "selected": false, - "text": "register_validator", - "value": "register_validator" + "editorMode": "builder", + "expr": "bolt_sidecar_http_requests_duration_seconds", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "HTTP Requests Durations in ms", + "type": "histogram" + }, + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] } - ], - "query": "register_validator, get_header, submit_blinded_block", - "queryValue": "", - "skipUrlSync": false, - "type": "custom" - } - ] + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 0, + "y": 32 + }, + "id": 3, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.12", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "editorMode": "builder", + "expr": "bolt_sidecar_latest_head", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Latest Head Slot", + "type": "stat" + } + ], + "refresh": "", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] }, "time": { - "from": "now-2d", + "from": "now-15m", "to": "now" }, "timepicker": {}, - "timezone": "browser", - "title": "PBS Metrics", - "uid": "cb_prometheus", - "version": 1, + "timezone": "", + "title": "bolt-prometheus-holesky", + "uid": "bolt-prometheus-holesky", + "version": 3, "weekStart": "" -} \ No newline at end of file +} diff --git a/testnets/holesky/grafana/dashboards/system_metrics.json b/testnets/holesky/grafana/dashboards/system_metrics.json deleted file mode 100644 index 93b649d80..000000000 --- a/testnets/holesky/grafana/dashboards/system_metrics.json +++ /dev/null @@ -1,853 +0,0 @@ -{ - "__inputs": [ - { - "name": "DS_PROMETHEUS", - "label": "Prometheus", - "description": "Prometheus as the datasource is obligatory", - "type": "datasource", - "pluginId": "prometheus", - "pluginName": "Prometheus" - } - ], - "__requires": [ - { - "type": "grafana", - "id": "grafana", - "name": "Grafana", - "version": "7.4.5" - }, - { - "type": "panel", - "id": "graph", - "name": "Graph", - "version": "" - }, - { - "type": "datasource", - "id": "prometheus", - "name": "Prometheus", - "version": "1.0.0" - }, - { - "type": "panel", - "id": "table", - "name": "Table", - "version": "" - } - ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "gnetId": 14282, - "graphTooltip": 0, - "id": null, - "iteration": 1617715580880, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "cb_prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 8, - "panels": [], - "title": "CPU", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "prometheus", - "uid": "cb_prometheus" - }, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 15, - "legend": { - "alignAsTable": true, - "avg": true, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(container_cpu_usage_seconds_total{instance=~\"$host\",name=~\"$container\",name=~\".+\"}[5m])) by (name) *100", - "hide": false, - "interval": "", - "legendFormat": "{{name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:606", - "format": "percent", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:607", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "cb_prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 8 - }, - "id": 11, - "panels": [], - "title": "Memory", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "prometheus", - "uid": "cb_prometheus" - }, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "hiddenSeries": false, - "id": 9, - "legend": { - "alignAsTable": true, - "avg": true, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_memory_rss{instance=~\"$host\",name=~\"$container\",name=~\".+\"}) by (name)", - "hide": false, - "interval": "", - "legendFormat": "{{name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:606", - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:607", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "prometheus", - "uid": "cb_prometheus" - }, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 9 - }, - "hiddenSeries": false, - "id": 14, - "legend": { - "alignAsTable": true, - "avg": true, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(container_memory_cache{instance=~\"$host\",name=~\"$container\",name=~\".+\"}) by (name)", - "hide": false, - "interval": "", - "legendFormat": "{{name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory Cached", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:606", - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:607", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "cb_prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 17 - }, - "id": 2, - "panels": [], - "title": "Network", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "prometheus", - "uid": "cb_prometheus" - }, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 18 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "alignAsTable": true, - "avg": true, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(container_network_receive_bytes_total[5m])) by (instance)", - "hide": false, - "interval": "", - "legendFormat": "{{name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Received Network Traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:674", - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:675", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "prometheus", - "uid": "cb_prometheus" - }, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 18 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "alignAsTable": true, - "avg": true, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(container_network_transmit_bytes_total[5m])) by (instance)", - "interval": "", - "legendFormat": "{{name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Sent Network Traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:832", - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:833", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "cb_prometheus" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 26 - }, - "id": 19, - "panels": [], - "title": "Misc", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cb_prometheus" - }, - "fieldConfig": { - "defaults": { - "custom": { - "align": null, - "filterable": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "id" - }, - "properties": [ - { - "id": "custom.width", - "value": 260 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Running" - }, - "properties": [ - { - "id": "unit", - "value": "d" - }, - { - "id": "decimals", - "value": 1 - }, - { - "id": "custom.displayMode", - "value": "color-text" - }, - { - "id": "color", - "value": { - "fixedColor": "dark-green", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 24, - "x": 0, - "y": 27 - }, - "id": 17, - "options": { - "showHeader": true, - "sortBy": [] - }, - "pluginVersion": "7.4.5", - "targets": [ - { - "expr": "(time() - container_start_time_seconds{instance=~\"$host\",name=~\"$container\",name=~\".+\"})/86400", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "{{name}}", - "refId": "A" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Containers Info", - "transformations": [ - { - "id": "filterFieldsByName", - "options": { - "include": { - "names": [ - "container_label_com_docker_compose_project", - "container_label_com_docker_compose_project_working_dir", - "image", - "instance", - "name", - "Value", - "container_label_com_docker_compose_service" - ] - } - } - }, - { - "id": "organize", - "options": { - "excludeByName": {}, - "indexByName": {}, - "renameByName": { - "Value": "Running", - "container_label_com_docker_compose_project": "Label", - "container_label_com_docker_compose_project_working_dir": "Working dir", - "container_label_com_docker_compose_service": "Service", - "image": "Registry Image", - "instance": "Instance", - "name": "Name" - } - } - } - ], - "type": "table" - } - ], - "schemaVersion": 27, - "style": "dark", - "tags": [ - "cadvisor", - "docker" - ], - "templating": { - "list": [ - { - "allValue": ".*", - "current": {}, - "datasource": { - "type": "prometheus", - "uid": "cb_prometheus" - }, - "definition": "label_values({__name__=~\"container.*\"},instance)", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": "Host", - "multi": false, - "name": "host", - "options": [], - "query": { - "query": "label_values({__name__=~\"container.*\"},instance)", - "refId": "Prometheus-host-Variable-Query" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "current": {}, - "datasource": { - "type": "prometheus", - "uid": "cb_prometheus" - }, - "definition": "label_values({__name__=~\"container.*\", instance=~\"$host\"},name)", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": "Container", - "multi": false, - "name": "container", - "options": [], - "query": { - "query": "label_values({__name__=~\"container.*\", instance=~\"$host\"},name)", - "refId": "Prometheus-container-Variable-Query" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Commit-Boost System Metrics", - "uid": "pMEd7m0Mz", - "version": 1, - "description": "Simple exporter for cadvisor only" -} \ No newline at end of file diff --git a/testnets/holesky/grafana/datasources/datasources.yml b/testnets/holesky/grafana/datasources/datasources.yml index 91e10e2b4..10df84a1f 100644 --- a/testnets/holesky/grafana/datasources/datasources.yml +++ b/testnets/holesky/grafana/datasources/datasources.yml @@ -6,6 +6,6 @@ datasources: uid: bolt-prometheus-holesky access: proxy orgId: 1 - url: http://bolt-prometheus-holesky:49090 + url: http://bolt-prometheus-holesky:9090 isDefault: true editable: true diff --git a/testnets/holesky/targets.json b/testnets/holesky/targets.json index 6cd87cbc6..1b14e8d5e 100644 --- a/testnets/holesky/targets.json +++ b/testnets/holesky/targets.json @@ -1,14 +1,8 @@ [ { - "targets": ["bolt-sidecar-holesky:8017"], + "targets": ["bolt-sidecar-holesky:9091"], "labels": { - "job": "bolt-sidecar-rpc" - } - }, - { - "targets": ["bolt-sidecar-holesky:18550"], - "labels": { - "job": "bolt-sidecar-builder-proxy" + "job": "bolt-sidecar-holesky" } } ] From 4a9ea79179d48420f2a25d9332885fc38767d83a Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 24 Oct 2024 17:14:31 +0200 Subject: [PATCH 73/85] chore(holesky): update rc image for Helix --- testnets/holesky/docker-compose.pbs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testnets/holesky/docker-compose.pbs.yml b/testnets/holesky/docker-compose.pbs.yml index 362dc1c2e..27034a7a5 100644 --- a/testnets/holesky/docker-compose.pbs.yml +++ b/testnets/holesky/docker-compose.pbs.yml @@ -64,7 +64,7 @@ services: ["/bin/sh", "-c", "chmod +x /scripts/run-bn.sh && /scripts/run-bn.sh"] helix-relay: - image: ghcr.io/chainbound/helix:v0.3.0-alpha.rc1 + image: ghcr.io/chainbound/helix:v0.3.0-alpha.rc2 restart: unless-stopped depends_on: - db From 44d2bf00529fb211956bc06cc554de21e1d509e0 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 24 Oct 2024 17:25:00 +0200 Subject: [PATCH 74/85] fix(holesky): remove toml volume from dockerfile --- testnets/holesky/docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/testnets/holesky/docker-compose.yml b/testnets/holesky/docker-compose.yml index e0c54cbc7..756708a95 100644 --- a/testnets/holesky/docker-compose.yml +++ b/testnets/holesky/docker-compose.yml @@ -9,7 +9,6 @@ services: entrypoint: /bin/sh -c /usr/local/bin/bolt-sidecar env_file: ./bolt-sidecar.env volumes: - - "./bolt-sidecar.toml:/etc/bolt-sidecar.toml" - "./delegations.json:${BOLT_SIDECAR_DELEGATIONS_PATH:-/etc/delegations.json}" bolt-mev-boost-holesky: From c8e19a65e4d60f7072f8b2e18897f6277a669a4e Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Thu, 24 Oct 2024 18:16:48 +0200 Subject: [PATCH 75/85] feat(holesky): cadvisor dashboard stub --- testnets/holesky/docker-compose.yml | 11 + .../grafana/dashboards/system_metrics.json | 829 ++++++++++++++++++ testnets/holesky/targets.json | 6 + 3 files changed, 846 insertions(+) create mode 100644 testnets/holesky/grafana/dashboards/system_metrics.json diff --git a/testnets/holesky/docker-compose.yml b/testnets/holesky/docker-compose.yml index 756708a95..74bdfc514 100644 --- a/testnets/holesky/docker-compose.yml +++ b/testnets/holesky/docker-compose.yml @@ -28,6 +28,17 @@ services: - ./targets.json:/etc/prometheus/targets.json - prometheus-data:/prometheus + bolt-cadvisor-holesky: + image: gcr.io/cadvisor/cadvisor:latest + container_name: bolt-cadvisor-holesky + restart: unless-stopped + ports: + - "38017:8080" + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - /sys:/sys:ro + - /var/lib/docker/:/var/lib/docker:ro + bolt-grafana-holesky: image: grafana/grafana:latest container_name: bolt-grafana-holesky diff --git a/testnets/holesky/grafana/dashboards/system_metrics.json b/testnets/holesky/grafana/dashboards/system_metrics.json new file mode 100644 index 000000000..ebbad9c48 --- /dev/null +++ b/testnets/holesky/grafana/dashboards/system_metrics.json @@ -0,0 +1,829 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Simple exporter for prometheus only", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 7, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 8, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "refId": "A" + } + ], + "title": "CPU", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 15, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "7.4.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "editorMode": "code", + "expr": "sum(rate(container_cpu_usage_seconds_total{name=~\"bolt-.*-holesky\"}[5m])) by (name) *100", + "hide": false, + "interval": "", + "legendFormat": "{{name}}", + "range": true, + "refId": "A" + } + ], + "title": "CPU Usage", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 11, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "refId": "A" + } + ], + "title": "Memory", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 9, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "7.4.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "editorMode": "code", + "expr": "sum(container_memory_rss{name=~\"bolt-.*-holesky\"}) by (name)", + "hide": false, + "interval": "", + "legendFormat": "{{name}}", + "range": true, + "refId": "A" + } + ], + "title": "Memory Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 14, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "7.4.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "editorMode": "code", + "expr": "sum(container_memory_cache{name=~\"bolt-.*-holesky\"}) by (name)", + "hide": false, + "interval": "", + "legendFormat": "{{name}}", + "range": true, + "refId": "A" + } + ], + "title": "Memory Cached", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 2, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "refId": "A" + } + ], + "title": "Network", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 18 + }, + "id": 4, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "7.4.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "expr": "sum(rate(container_network_receive_bytes_total[5m])) by (instance)", + "hide": false, + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "title": "Received Network Traffic", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 18 + }, + "id": 6, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "7.4.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "expr": "sum(rate(container_network_transmit_bytes_total[5m])) by (instance)", + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "title": "Sent Network Traffic", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 19, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "refId": "A" + } + ], + "title": "Misc", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "type": "auto" + }, + "filterable": false, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "id" + }, + "properties": [ + { + "id": "custom.width", + "value": 260 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Running" + }, + "properties": [ + { + "id": "unit", + "value": "d" + }, + { + "id": "decimals", + "value": 1 + }, + { + "id": "custom.cellOptions", + "value": { + "type": "color-text" + } + }, + { + "id": "color", + "value": { + "fixedColor": "dark-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 27 + }, + "id": 17, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": ["sum"], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "editorMode": "code", + "expr": "(time() - container_start_time_seconds{name=~\"bolt-.*-holesky\"})/86400", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "title": "Containers Info", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "container_label_com_docker_compose_project", + "container_label_com_docker_compose_project_working_dir", + "image", + "instance", + "name", + "Value", + "container_label_com_docker_compose_service" + ] + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "indexByName": {}, + "renameByName": { + "Value": "Running", + "container_label_com_docker_compose_project": "Label", + "container_label_com_docker_compose_project_working_dir": "Working dir", + "container_label_com_docker_compose_service": "Service", + "image": "Registry Image", + "instance": "Instance", + "name": "Name" + } + } + } + ], + "type": "table" + } + ], + "schemaVersion": 39, + "tags": ["prometheus", "docker"], + "templating": { + "list": [ + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "definition": "label_values({__name__=~\"container.*\"},instance)", + "hide": 0, + "includeAll": true, + "label": "Host", + "multi": false, + "name": "host", + "options": [], + "query": { + "query": "label_values({__name__=~\"container.*\"},instance)", + "refId": "Prometheus-host-Variable-Query" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "bolt-prometheus-holesky" + }, + "definition": "label_values({__name__=~\"container.*\", instance=~\"$host\"},name)", + "hide": 0, + "includeAll": true, + "label": "Container", + "multi": false, + "name": "container", + "options": [], + "query": { + "query": "label_values({__name__=~\"container.*\", instance=~\"$host\"},name)", + "refId": "Prometheus-container-Variable-Query" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "System Metrics", + "uid": "pMEd7m0Mz", + "version": 9, + "weekStart": "" +} + diff --git a/testnets/holesky/targets.json b/testnets/holesky/targets.json index 1b14e8d5e..52546f538 100644 --- a/testnets/holesky/targets.json +++ b/testnets/holesky/targets.json @@ -4,5 +4,11 @@ "labels": { "job": "bolt-sidecar-holesky" } + }, + { + "targets": ["bolt-cadvisor-holesky:8080"], + "labels": { + "job": "bolt-cadvisor-holesky" + } } ] From 3fc56a5497227afcbfac91af5e0c9dfe3580af70 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Fri, 25 Oct 2024 12:17:38 +0200 Subject: [PATCH 76/85] fix(sidecar): test/CI --- bolt-sidecar/src/test_util.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/bolt-sidecar/src/test_util.rs b/bolt-sidecar/src/test_util.rs index 6eace3748..c0bac0ddd 100644 --- a/bolt-sidecar/src/test_util.rs +++ b/bolt-sidecar/src/test_util.rs @@ -90,6 +90,7 @@ pub(crate) async fn get_test_config() -> Option { "BOLT_SIDECAR_COMMITMENT_PRIVATE_KEY", EcdsaSecretKeyWrapper::random().to_string(), ); + env::set_var("BOLT_SIDECAR_VALIDATOR_INDEXES", "0..64"); let _ = dotenvy::dotenv(); From 656116c691e175c02e0fe8ece1c92b768736845d Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Fri, 25 Oct 2024 12:31:11 +0200 Subject: [PATCH 77/85] fix(holesky): restore commit-boost observability previosly removed by mistake --- testnets/holesky/README.md | 13 + .../grafana/dashboards/bolt_dashboard.json | 236 +++++ .../grafana/dashboards/dashboard.json | 984 ++++++++++++++++++ .../grafana/dashboards/dashboards.yml | 13 + .../grafana/dashboards/system_metrics.json | 853 +++++++++++++++ .../grafana/datasources/datasources.yml | 11 + .../holesky/commit-boost/update-grafana.sh | 4 +- 7 files changed, 2112 insertions(+), 2 deletions(-) create mode 100644 testnets/holesky/commit-boost/grafana/dashboards/bolt_dashboard.json create mode 100644 testnets/holesky/commit-boost/grafana/dashboards/dashboard.json create mode 100644 testnets/holesky/commit-boost/grafana/dashboards/dashboards.yml create mode 100644 testnets/holesky/commit-boost/grafana/dashboards/system_metrics.json create mode 100644 testnets/holesky/commit-boost/grafana/datasources/datasources.yml diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index b78a75acb..f9924532d 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -224,6 +224,19 @@ This will run all modules in Docker containers. > with `BOLT_SIDECAR_BUILDER_PROXY_PORT`), and your beacon node MUST be > configured to point the `builder-api` to this port for Bolt to work. +**Observability** + +Commit-Boost comes with various observability tools, such as Prometheus, +cadvisor, and Grafana. It also comes with some pre-built dashboards, which can +be found in the `commit-boost/grafana` directory. + +To update these dashboards, run the following command from the `commit-boost` +directory: + +`bash ./update-grafana.sh ` +In this directory, you can also find a Bolt dashboard, which will be launched +alongside the other dashboards. + ## Native Mode (advanced) For running the Bolt Sidecar as a standalone binary you need to have the diff --git a/testnets/holesky/commit-boost/grafana/dashboards/bolt_dashboard.json b/testnets/holesky/commit-boost/grafana/dashboards/bolt_dashboard.json new file mode 100644 index 000000000..ea72e6d2f --- /dev/null +++ b/testnets/holesky/commit-boost/grafana/dashboards/bolt_dashboard.json @@ -0,0 +1,236 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Metrics related to the bolt-sidecar and bolt-boost.", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 3, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 2, + "panels": [], + "title": "Bolt sidecar", + "type": "row" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 1, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "bolt_sidecar_latest_head", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Latest head", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 4, + "panels": [], + "title": "Bolt boost", + "type": "row" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 10 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "cb_pbs_constraints_cache_size", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Constraints cache size", + "type": "timeseries" + } + ], + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Bolt Metrics", + "uid": "edxnwlpgaw934c", + "version": 3, + "weekStart": "" +} diff --git a/testnets/holesky/commit-boost/grafana/dashboards/dashboard.json b/testnets/holesky/commit-boost/grafana/dashboards/dashboard.json new file mode 100644 index 000000000..94dd06265 --- /dev/null +++ b/testnets/holesky/commit-boost/grafana/dashboards/dashboard.json @@ -0,0 +1,984 @@ +{ + "__inputs": [], + "__elements": {}, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "11.1.0" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": true, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "red", + "mode": "thresholds" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "yellow", + "value": null + }, + { + "color": "green", + "value": 100 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 61, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "cb_pbs_relay_last_slot", + "format": "time_series", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{relay_id}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Last delivered slot", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "text", + "mode": "thresholds" + }, + "decimals": 6, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "text", + "value": null + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 78, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "cb_pbs_relay_header_value / 1e9", + "format": "time_series", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{relay_id}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Last delivered header value", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 11 + }, + "id": 12, + "panels": [], + "repeat": "endpoint", + "repeatDirection": "h", + "title": "$endpoint calls", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 0, + "y": 12 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(cb_pbs_relay_status_code_total{http_status_code=~\"2..\", endpoint=\"$endpoint\"}[1h])) by (relay_id)", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "$endpoint Relay Success QPH", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 6, + "y": 12 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(cb_pbs_relay_status_code_total{http_status_code=~\"4..|5..\", endpoint=\"$endpoint\"}[1h])) by (relay_id)", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "$endpoint Relay Error QPH", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 12, + "y": 12 + }, + "id": 43, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(cb_pbs_beacon_node_status_code_total{http_status_code=~\"2..\", endpoint=\"$endpoint\"}[1h]))", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "$endpoint Beacon Node Success QPH", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 18, + "y": 12 + }, + "id": 44, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(cb_pbs_beacon_node_status_code_total{http_status_code=~\"4..|5..\", endpoint=\"$endpoint\"}[1h]))", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "$endpoint Beacon Node Error QPH", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 0, + "y": 23 + }, + "id": 20, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.50, sum(rate(cb_pbs_relay_latency_bucket{endpoint=\"$endpoint\"}[1m])) by (le, relay_id))", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "$endpoint Relay P50", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 6, + "y": 23 + }, + "id": 29, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.90, sum(rate(cb_pbs_relay_latency_bucket{endpoint=\"$endpoint\"}[1m])) by (le, relay_id))", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "$endpoint Relay P90", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 6, + "x": 12, + "y": 23 + }, + "id": 30, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.99, sum(rate(cb_pbs_relay_latency_bucket{endpoint=\"$endpoint\"}[1m])) by (le, relay_id))", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "$endpoint Relay P99", + "type": "timeseries" + } + ], + "refresh": "5m", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "description": "BuilderAPI endpoint", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "endpoint", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "register_validator", + "value": "register_validator" + }, + { + "selected": false, + "text": "get_header", + "value": "get_header" + }, + { + "selected": false, + "text": "submit_blinded_block", + "value": "submit_blinded_block" + } + ], + "query": "register_validator, get_header, submit_blinded_block", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-2d", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "PBS Metrics", + "uid": "cb_pbs_metrics", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/testnets/holesky/commit-boost/grafana/dashboards/dashboards.yml b/testnets/holesky/commit-boost/grafana/dashboards/dashboards.yml new file mode 100644 index 000000000..db50699f9 --- /dev/null +++ b/testnets/holesky/commit-boost/grafana/dashboards/dashboards.yml @@ -0,0 +1,13 @@ +apiVersion: 1 + +providers: + - name: "default" + orgId: 1 + folder: "" + folderUid: "" + type: file + disableDeletion: false + editable: true + allowUiUpdates: true + options: + path: /etc/grafana/provisioning/dashboards diff --git a/testnets/holesky/commit-boost/grafana/dashboards/system_metrics.json b/testnets/holesky/commit-boost/grafana/dashboards/system_metrics.json new file mode 100644 index 000000000..93b649d80 --- /dev/null +++ b/testnets/holesky/commit-boost/grafana/dashboards/system_metrics.json @@ -0,0 +1,853 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "Prometheus as the datasource is obligatory", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "7.4.5" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": 14282, + "graphTooltip": 0, + "id": null, + "iteration": 1617715580880, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 8, + "panels": [], + "title": "CPU", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 15, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.4.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(container_cpu_usage_seconds_total{instance=~\"$host\",name=~\"$container\",name=~\".+\"}[5m])) by (name) *100", + "hide": false, + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:606", + "format": "percent", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:607", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 11, + "panels": [], + "title": "Memory", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 9 + }, + "hiddenSeries": false, + "id": 9, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.4.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_rss{instance=~\"$host\",name=~\"$container\",name=~\".+\"}) by (name)", + "hide": false, + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:606", + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:607", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 9 + }, + "hiddenSeries": false, + "id": 14, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.4.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_cache{instance=~\"$host\",name=~\"$container\",name=~\".+\"}) by (name)", + "hide": false, + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Cached", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:606", + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:607", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 2, + "panels": [], + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 18 + }, + "hiddenSeries": false, + "id": 4, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.4.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(container_network_receive_bytes_total[5m])) by (instance)", + "hide": false, + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Received Network Traffic", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:674", + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:675", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 18 + }, + "hiddenSeries": false, + "id": 6, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.4.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(container_network_transmit_bytes_total[5m])) by (instance)", + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Sent Network Traffic", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:832", + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:833", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 19, + "panels": [], + "title": "Misc", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "custom": { + "align": null, + "filterable": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "id" + }, + "properties": [ + { + "id": "custom.width", + "value": 260 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Running" + }, + "properties": [ + { + "id": "unit", + "value": "d" + }, + { + "id": "decimals", + "value": 1 + }, + { + "id": "custom.displayMode", + "value": "color-text" + }, + { + "id": "color", + "value": { + "fixedColor": "dark-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 27 + }, + "id": 17, + "options": { + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "7.4.5", + "targets": [ + { + "expr": "(time() - container_start_time_seconds{instance=~\"$host\",name=~\"$container\",name=~\".+\"})/86400", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Containers Info", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "container_label_com_docker_compose_project", + "container_label_com_docker_compose_project_working_dir", + "image", + "instance", + "name", + "Value", + "container_label_com_docker_compose_service" + ] + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "indexByName": {}, + "renameByName": { + "Value": "Running", + "container_label_com_docker_compose_project": "Label", + "container_label_com_docker_compose_project_working_dir": "Working dir", + "container_label_com_docker_compose_service": "Service", + "image": "Registry Image", + "instance": "Instance", + "name": "Name" + } + } + } + ], + "type": "table" + } + ], + "schemaVersion": 27, + "style": "dark", + "tags": [ + "cadvisor", + "docker" + ], + "templating": { + "list": [ + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "definition": "label_values({__name__=~\"container.*\"},instance)", + "description": null, + "error": null, + "hide": 0, + "includeAll": true, + "label": "Host", + "multi": false, + "name": "host", + "options": [], + "query": { + "query": "label_values({__name__=~\"container.*\"},instance)", + "refId": "Prometheus-host-Variable-Query" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "definition": "label_values({__name__=~\"container.*\", instance=~\"$host\"},name)", + "description": null, + "error": null, + "hide": 0, + "includeAll": true, + "label": "Container", + "multi": false, + "name": "container", + "options": [], + "query": { + "query": "label_values({__name__=~\"container.*\", instance=~\"$host\"},name)", + "refId": "Prometheus-container-Variable-Query" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Commit-Boost System Metrics", + "uid": "pMEd7m0Mz", + "version": 1, + "description": "Simple exporter for cadvisor only" +} \ No newline at end of file diff --git a/testnets/holesky/commit-boost/grafana/datasources/datasources.yml b/testnets/holesky/commit-boost/grafana/datasources/datasources.yml new file mode 100644 index 000000000..6d29d617b --- /dev/null +++ b/testnets/holesky/commit-boost/grafana/datasources/datasources.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +datasources: + - name: cb-prometheus + type: prometheus + uid: cb_prometheus + access: proxy + orgId: 1 + url: http://cb_prometheus:9090 + isDefault: true + editable: true diff --git a/testnets/holesky/commit-boost/update-grafana.sh b/testnets/holesky/commit-boost/update-grafana.sh index 1f832d32b..4e5a16695 100755 --- a/testnets/holesky/commit-boost/update-grafana.sh +++ b/testnets/holesky/commit-boost/update-grafana.sh @@ -1,5 +1,5 @@ #!/bin/bash # Fetches the latest dashboards from commit-boost main -curl https://raw.githubusercontent.com/Commit-Boost/commit-boost-client/main/grafana/dashboards/dashboard.json -o ../grafana/dashboards/dashboard.json -curl https://raw.githubusercontent.com/Commit-Boost/commit-boost-client/main/grafana/dashboards/system_metrics.json -o ../grafana/dashboards/system_metrics.json +curl https://raw.githubusercontent.com/Commit-Boost/commit-boost-client/main/grafana/dashboards/dashboard.json -o ./grafana/dashboards/dashboard.json +curl https://raw.githubusercontent.com/Commit-Boost/commit-boost-client/main/grafana/dashboards/system_metrics.json -o ./grafana/dashboards/system_metrics.json From fefc31cfc939a98ea723f4a65cbde9183f40f1d5 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Fri, 25 Oct 2024 13:48:41 +0200 Subject: [PATCH 78/85] fix(holesky/docs): broken links --- testnets/holesky/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index f9924532d..7f11ad361 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -6,9 +6,9 @@ This document provides instructions for running the Bolt sidecar on the Holesky * [Prerequisites](#prerequisites) * [Off-Chain Setup](#off-chain-setup) - * [Docker Mode (recommended)](#docker-mode-(recommended)) + * [Docker Mode (recommended)](#docker-mode-recommended) * [Commit-Boost Mode](#commit-boost-mode) - * [Native Mode (advanced)](#native-mode-(advanced)) + * [Native Mode (advanced)](#native-mode-advanced) * [Building and running the MEV-Boost fork binary](#building-and-running-the-mev-boost-fork-binary) * [Building and running the Bolt sidecar binary](#building-and-running-the-bolt-sidecar-binary) * [Configuration file](#configuration-file) From cfa8e46dffc6745d09fd902c384a1b308428f89b Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Fri, 25 Oct 2024 13:57:44 +0200 Subject: [PATCH 79/85] feat(holesky): update networking & default values --- testnets/holesky/bolt-sidecar.env.example | 8 ++++---- testnets/holesky/docker-compose.yml | 9 +++++++++ testnets/holesky/mev-boost.env.example | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/testnets/holesky/bolt-sidecar.env.example b/testnets/holesky/bolt-sidecar.env.example index a094ec52d..8792c94a2 100644 --- a/testnets/holesky/bolt-sidecar.env.example +++ b/testnets/holesky/bolt-sidecar.env.example @@ -4,17 +4,17 @@ # port should be open on your firewall in order to receive external requests! BOLT_SIDECAR_PORT=8017 # Execution client API URL -BOLT_SIDECAR_EXECUTION_API_URL="http://localhost:8545" +BOLT_SIDECAR_EXECUTION_API_URL="http://172.56.0.1:8545" # URL for the beacon client -BOLT_SIDECAR_BEACON_API_URL="http://localhost:5052" +BOLT_SIDECAR_BEACON_API_URL="http://172.56.0.1:5052" # Execution client Engine API URL. This is needed for fallback block building # and must be a synced Geth node -BOLT_SIDECAR_ENGINE_API_URL="http://localhost:8551" +BOLT_SIDECAR_ENGINE_API_URL="http://172.56.0.1:8551" # The port from which the Bolt sidecar will receive Builder-API requests from the Beacon client BOLT_SIDECAR_CONSTRAINTS_PROXY_PORT=18550 # URL to forward the constraints produced by the Bolt sidecar to a server # supporting the Constraints API, such as an MEV-Boost fork -BOLT_SIDECAR_CONSTRAINTS_API_URL="http://localhost:18551" +BOLT_SIDECAR_CONSTRAINTS_API_URL="http://bolt-mev-boost-holesky:18551" # Validator indexes of connected validators that the sidecar should accept # commitments on behalf of. # Accepted values: diff --git a/testnets/holesky/docker-compose.yml b/testnets/holesky/docker-compose.yml index 74bdfc514..fb009da12 100644 --- a/testnets/holesky/docker-compose.yml +++ b/testnets/holesky/docker-compose.yml @@ -56,3 +56,12 @@ volumes: driver: local grafana-data: driver: local + +networks: + bolt-default: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.56.0.0/16 + gateway: 172.56.0.1 diff --git a/testnets/holesky/mev-boost.env.example b/testnets/holesky/mev-boost.env.example index 8815677dc..942149d0b 100644 --- a/testnets/holesky/mev-boost.env.example +++ b/testnets/holesky/mev-boost.env.example @@ -6,7 +6,7 @@ LOG_SERVICE_TAG= # Optional: Add a custom service tag to all DISABLE_LOG_VERSION=false # Set to true to disable logging the version # Server settings -BOOST_LISTEN_ADDR=localhost:18550 # Address for mev-boost server to listen on +BOOST_LISTEN_ADDR=0.0.0.0:18551 # Address for mev-boost server to listen on RELAY_STARTUP_CHECK=false # Set to true to check relay status on startup # Relay settings From fe21cff2ebeeb080b8c25a6cce542ceb79f59ddf Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Fri, 25 Oct 2024 14:06:31 +0200 Subject: [PATCH 80/85] fix(holesky): add custom network to compose --- testnets/holesky/docker-compose.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/testnets/holesky/docker-compose.yml b/testnets/holesky/docker-compose.yml index fb009da12..66ab25379 100644 --- a/testnets/holesky/docker-compose.yml +++ b/testnets/holesky/docker-compose.yml @@ -38,6 +38,11 @@ services: - /var/run/docker.sock:/var/run/docker.sock:ro - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro + networks: + - bolt-default + command: + - --housekeeping_interval=10s + - --docker_only bolt-grafana-holesky: image: grafana/grafana:latest @@ -48,6 +53,8 @@ services: - ./grafana/dashboards:/etc/grafana/provisioning/dashboards - ./grafana/datasources:/etc/grafana/provisioning/datasources - grafana-data:/var/lib/grafana + networks: + - bolt-default depends_on: - bolt-prometheus-holesky From 16ee99b9893ba88a1b52bb4353a342061036edbc Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Fri, 25 Oct 2024 14:20:14 +0200 Subject: [PATCH 81/85] fix(holesky): typo --- testnets/holesky/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 7f11ad361..c2847c66f 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -344,7 +344,7 @@ to configure such sidecar options properly. After you've set up the configuration file you can run the Bolt sidecar with ```bash -./bolt-sidecar-cli +./bolt-sidecar ``` ### Observability From 14c3385fccb28670b5a41c289ae872aeb80411fd Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Fri, 25 Oct 2024 16:00:17 +0200 Subject: [PATCH 82/85] fix(holesky): genesis fork version on builder --- testnets/holesky/scripts/run-builder.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/testnets/holesky/scripts/run-builder.sh b/testnets/holesky/scripts/run-builder.sh index c1bc12035..4af4bbf93 100755 --- a/testnets/holesky/scripts/run-builder.sh +++ b/testnets/holesky/scripts/run-builder.sh @@ -28,5 +28,6 @@ geth --datadir=/var/lib/chaindata/geth \ --builder \ --builder.remote_relay_endpoint=http://helix-relay:4040 \ --builder.beacon_endpoints=http://beacon:4000 \ + --builder.genesis_fork_version=0x01017000 \ --miner.etherbase=0x614561D2d143621E126e87831AEF287678B442b8 \ --miner.extradata="Bolt Builder" From c0839baf57b884e36ec6bfe67e4f18bada124d09 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Sun, 27 Oct 2024 10:11:41 +0100 Subject: [PATCH 83/85] fix(holesky): cb port description --- testnets/holesky/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index c2847c66f..0b8e83ca0 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -220,8 +220,8 @@ commit-boost start --docker cb.docker-compose.yml --env .cb.env This will run all modules in Docker containers. > [!IMPORTANT] -> The `bolt-boost` service will be exposed at `pbs.port` (18551 by default, set -> with `BOLT_SIDECAR_BUILDER_PROXY_PORT`), and your beacon node MUST be +> The `bolt-sidecar` service will be exposed at 18551 by default, set +> with `BOLT_SIDECAR_BUILDER_PROXY_PORT`, and your beacon node MUST be > configured to point the `builder-api` to this port for Bolt to work. **Observability** From d78c3c7135e631415ccab779ebbc91816dcb9dd6 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Mon, 28 Oct 2024 10:22:28 +0100 Subject: [PATCH 84/85] docs(holesky): document cb status --- testnets/holesky/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/testnets/holesky/README.md b/testnets/holesky/README.md index 0b8e83ca0..c4bc81e6a 100644 --- a/testnets/holesky/README.md +++ b/testnets/holesky/README.md @@ -168,6 +168,10 @@ can find at `http://localhost:28017`. ## Commit-Boost Mode +> [!IMPORTANT] +> Running with commit-boost is still in the process of being tested. Keep track of the issue +> here: https://github.com/chainbound/bolt/issues/328. + First download the `commit-boost-cli` binary from the Commit-Boost [official releases page](https://github.com/Commit-Boost/commit-boost-client/releases) From 3840e243e44505dec9e4fcdee4f61abd567676a8 Mon Sep 17 00:00:00 2001 From: thedevbirb Date: Mon, 28 Oct 2024 11:18:10 +0100 Subject: [PATCH 85/85] chore(holesky): re-add bolt-default network to all services --- testnets/holesky/docker-compose.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/testnets/holesky/docker-compose.yml b/testnets/holesky/docker-compose.yml index 66ab25379..397ce0e63 100644 --- a/testnets/holesky/docker-compose.yml +++ b/testnets/holesky/docker-compose.yml @@ -10,6 +10,8 @@ services: env_file: ./bolt-sidecar.env volumes: - "./delegations.json:${BOLT_SIDECAR_DELEGATIONS_PATH:-/etc/delegations.json}" + networks: + - bolt-default bolt-mev-boost-holesky: image: ghcr.io/chainbound/bolt-mev-boost:v0.3.0-alpha.rc1 @@ -17,6 +19,8 @@ services: restart: unless-stopped env_file: ./mev-boost.env entrypoint: /bin/sh -c '/app/mev-boost' + networks: + - bolt-default bolt-prometheus-holesky: image: prom/prometheus:latest @@ -27,6 +31,8 @@ services: - ./prometheus.yml:/etc/prometheus/prometheus.yml - ./targets.json:/etc/prometheus/targets.json - prometheus-data:/prometheus + networks: + - bolt-default bolt-cadvisor-holesky: image: gcr.io/cadvisor/cadvisor:latest