diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9fde3899..5677b703 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: CI fmt clippy and test +name: CI on: pull_request: @@ -33,4 +33,4 @@ jobs: uses: actions/checkout@v4 - name: Install stable toolchain uses: dtolnay/rust-toolchain@stable - - run: cargo test --all-features \ No newline at end of file + - run: cargo test --all-features diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index d6e8f0f8..c2982c3f 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,4 +1,4 @@ -name: Deploy Docs to GitHub Pages +name: Docs on: push: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8726cbad..4f79217b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -132,7 +132,7 @@ jobs: ghcr.io/commit-boost/pbs:latest cache-from: type=registry,ref=ghcr.io/commit-boost/pbs:buildcache cache-to: type=registry,ref=ghcr.io/commit-boost/pbs:buildcache,mode=max - file: docker/pbs.Dockerfile + file: provisioning/pbs.Dockerfile build-and-push-signer-docker: runs-on: ubuntu-latest @@ -166,7 +166,7 @@ jobs: ghcr.io/commit-boost/signer:latest cache-from: type=registry,ref=ghcr.io/commit-boost/signer:buildcache cache-to: type=registry,ref=ghcr.io/commit-boost/signer:buildcache,mode=max - file: docker/signer.Dockerfile + file: provisioning/signer.Dockerfile finalize-release: needs: diff --git a/.gitignore b/.gitignore index 190f5be1..b8eaa77a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ target/ cb.docker-compose.yml targets.json .idea/ -logs \ No newline at end of file +logs +.vscode/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 0e8a88da..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rust-analyzer.rustfmt.extraArgs": [ - "+nightly" - ] -} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..94d6767a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,39 @@ +# Contributors Guide + +Commit-Boost is community driven and we welcome all contributions. + +If you contribute to this repo, your contributions will be made to the project under both [Apache 2.0](/LICENSE-APACHE) and the [MIT](/LICENSE-MIT) +license. + +There are fundamentally three ways you can contribute: + +1. **By opening an issue:** For example, if you believe that you have uncovered a bug +2. **By adding context:** Providing additional context to existing issues +3. **By resolving issues:** For example by opening a PR + +### Contributions Related to Spelling and Grammar + +For first-time contributors we will not be accepting PRs that only fix spelling or grammatical errors in documentation, code or +elsewhere. + +### Submitting a bug report + +If you believe you have found a security issues, please **do not** open a public issue but check out our [Security](/SECURITY.md) policy instead. + +If you find a non-security related bug, please file an issue detailing: +- Release version you are using +- Code snippets and/or logs that can help identifying the bug +- Concrete steps to reproduce the bug + +### Submitting a feature request +If you have a suggestion for a new feature or an improvement to an existing one, please open a new issue and provide: + +- A clear and concise description of the feature you’d like to see implemented. +- An explanation of why this feature would be helpful or what problem it would solve. +- Any relevant examples, mock-ups, or references that can help illustrate your idea. + +We value your input and appreciate all suggestions to help make this project better! + +### Resolving an issue +We welcome PRs from any community member. Before making a large change, it is usually a good idea to first open an issue describing the change to solicit feedback and guidance. +This will increase the likelihood of the PR getting merged. diff --git a/Cargo.lock b/Cargo.lock index bd6461ed..52dac066 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -71,21 +71,27 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8ebf106e84a1c37f86244df7da0c7587e697b71a0d565cce079449b85ac6f8" +checksum = "689e271a72a5c0b05bfdf41c9d0424f11e9df721385dc5bd9045a51f9ea3313b" 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]] @@ -100,25 +106,62 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed961a48297c732a5d97ee321aa8bb5009ecadbcb077d8bec90cb54e651629" +checksum = "8ba14856660f31807ebb26ce8f667e814c72694e1077e97ef102e326ad580f3f" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-serde", + "alloy-trie", "auto_impl", "c-kzg", "derive_more", + "k256", + "serde", +] + +[[package]] +name = "alloy-consensus-any" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28666307e76441e7af37a2b90cde7391c28112121bea59f4e0d804df8b20057e" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", "serde", ] +[[package]] +name = "alloy-contract" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3510769905590b8991a8e63a5e0ab4aa72cf07a13ab5fbe23f12f4454d161da" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "thiserror 2.0.6", +] + [[package]] name = "alloy-core" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8316d83e590f4163b221b8180008f302bda5cf5451202855cdd323e588849c" +checksum = "c618bd382f0bc2ac26a7e4bfae01c9b015ca8f21b37ca40059ae35a7e62b3dc6" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -129,9 +172,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2364c782a245cf8725ea6dbfca5f530162702b5d685992ea03ce64529136cc" +checksum = "41056bde53ae10ffbbf11618efbe1e0290859e5eab0fe9ef82ebdb62f12a866f" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -157,21 +200,22 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.3.2" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ffc577390ce50234e02d841214b3dc0bea6aaaae8e04bbf3cb82e9a45da9eb" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" dependencies = [ "alloy-primitives", "alloy-rlp", "derive_more", + "k256", "serde", ] [[package]] name = "alloy-eips" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b69e06cf9c37be824b9d26d6d101114fdde6af0c87de2828b414c05c4b3daa71" +checksum = "47e922d558006ba371681d484d12aa73fe673d84884f83747730af7433c0e86d" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -189,20 +233,21 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde15e14944a88bd6a57d325e9a49b75558746fe16aaccc79713ae50a6a9574c" +checksum = "5dca170827a7ca156b43588faebf9e9d27c27d0fb07cab82cfd830345e2b24f5" dependencies = [ "alloy-primitives", "alloy-serde", + "alloy-trie", "serde", ] [[package]] name = "alloy-json-abi" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84c506bf264110fa7e90d9924f742f40ef53c6572ea56a0b0bd714a567ed389" +checksum = "c357da577dfb56998d01f574d81ad7a1958d248740a7981b205d69d65a7da404" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -212,29 +257,31 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af5979e0d5a7bf9c7eb79749121e8256e59021af611322aee56e77e20776b4b3" +checksum = "9335278f50b0273e0a187680ee742bb6b154a948adf036f448575bacc5ccb315" dependencies = [ "alloy-primitives", "alloy-sol-types", "serde", "serde_json", - "thiserror", + "thiserror 2.0.6", "tracing", ] [[package]] name = "alloy-network" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "204237129086ce5dc17a58025e93739b01b45313841f98fa339eb1d780511e57" +checksum = "ad4e6ad4230df8c4a254c20f8d6a84ab9df151bfca13f463177dbc96571cc1f8" dependencies = [ "alloy-consensus", + "alloy-consensus-any", "alloy-eips", "alloy-json-rpc", "alloy-network-primitives", "alloy-primitives", + "alloy-rpc-types-any", "alloy-rpc-types-eth", "alloy-serde", "alloy-signer", @@ -242,14 +289,16 @@ dependencies = [ "async-trait", "auto_impl", "futures-utils-wasm", - "thiserror", + "serde", + "serde_json", + "thiserror 2.0.6", ] [[package]] name = "alloy-network-primitives" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514f70ee2a953db21631cd817b13a1571474ec77ddc03d47616d5e8203489fde" +checksum = "c4df88a2f8020801e0fefce79471d3946d39ca3311802dbbd0ecfdeee5e972e3" dependencies = [ "alloy-consensus", "alloy-eips", @@ -260,9 +309,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fce5dbd6a4f118eecc4719eaa9c7ffc31c315e6c5ccde3642db927802312425" +checksum = "6259a506ab13e1d658796c31e6e39d2e2ee89243bcc505ddc613b35732e0a430" dependencies = [ "alloy-rlp", "bytes", @@ -273,7 +322,7 @@ dependencies = [ "getrandom", "hashbrown 0.15.1", "hex-literal", - "indexmap 2.6.0", + "indexmap", "itoa", "k256", "keccak-asm", @@ -289,9 +338,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4814d141ede360bb6cd1b4b064f1aab9de391e7c4d0d4d50ac89ea4bc1e25fbd" +checksum = "5115c74c037714e1b02a86f742289113afa5d494b5ea58308ba8aa378e739101" dependencies = [ "alloy-chains", "alloy-consensus", @@ -300,10 +349,13 @@ dependencies = [ "alloy-network", "alloy-network-primitives", "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", @@ -317,18 +369,37 @@ dependencies = [ "schnellru", "serde", "serde_json", - "thiserror", + "thiserror 2.0.6", "tokio", "tracing", "url", "wasmtimer", ] +[[package]] +name = "alloy-pubsub" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b073afa409698d1b9a30522565815f3bf7010e5b47b997cf399209e6110df097" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "bimap", + "futures", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.0", + "tracing", +] + [[package]] name = "alloy-rlp" -version = "0.3.4" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d58d9f5da7b40e9bfff0b7e7816700be4019db97d4b6359fe7f94a9e22e42ac" +checksum = "f542548a609dca89fcd72b3b9f355928cf844d4363c5eed9c5273a3dd225e097" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -337,25 +408,28 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.4" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a047897373be4bbb0224c1afdabca92648dc57a9c9ef6e7b0be3aff7a859c83" +checksum = "5a833d97bf8a5f0f878daf2c8451fff7de7f9de38baa5a45d936ec718d81255a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] name = "alloy-rpc-client" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc2bd1e7403463a5f2c61e955bcc9d3072b63aa177442b0f9aa6a6d22a941e3" +checksum = "5c6a0bd0ce5660ac48e4f3bb0c7c5c3a94db287a0be94971599d83928476cbcd" dependencies = [ "alloy-json-rpc", "alloy-primitives", + "alloy-pubsub", "alloy-transport", "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", "futures", "pin-project", "reqwest", @@ -371,9 +445,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea9bf1abdd506f985a53533f5ac01296bcd6102c5e139bbc5d40bc468d2c916" +checksum = "374ac12e35bb90ebccd86e7c943ddba9590149a6e35cc4d9cd860d6635fd1018" dependencies = [ "alloy-primitives", "alloy-rpc-types-beacon", @@ -383,27 +457,39 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-rpc-types-any" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea98f81bcd759dbfa3601565f9d7a02220d8ef1d294ec955948b90aaafbfd857" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + [[package]] name = "alloy-rpc-types-beacon" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45357a642081c8ce235c0ad990c4e9279f5f18a723545076b38cfcc05cc25234" +checksum = "6e13e94be8f6f5cb735e604f9db436430bf3773fdd41db7221edaa58c07c4c8a" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", + "alloy-serde", "ethereum_ssz 0.8.0", "ethereum_ssz_derive", "serde", "serde_with", - "thiserror", + "thiserror 2.0.6", ] [[package]] name = "alloy-rpc-types-engine" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "886d22d41992287a235af2f3af4299b5ced2bcafb81eb835572ad35747476946" +checksum = "9ca5898f753ff0d15a0dc955c169523d8fee57e05bb5a38a398b3451b0b988be" dependencies = [ "alloy-consensus", "alloy-eips", @@ -419,11 +505,12 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b034779a4850b4b03f5be5ea674a1cf7d746b2da762b34d1860ab45e48ca27" +checksum = "0e518b0a7771e00728f18be0708f828b18a1cfc542a7153bef630966a26388e0" dependencies = [ "alloy-consensus", + "alloy-consensus-any", "alloy-eips", "alloy-network-primitives", "alloy-primitives", @@ -438,9 +525,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "028e72eaa9703e4882344983cfe7636ce06d8cce104a78ea62fd19b46659efc4" +checksum = "ed3dc8d4a08ffc90c1381d39a4afa2227668259a42c97ab6eecf51cbd82a8761" dependencies = [ "alloy-primitives", "serde", @@ -449,70 +536,89 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592c185d7100258c041afac51877660c7bf6213447999787197db4842f0e938e" +checksum = "16188684100f6e0f2a2b949968fe3007749c5be431549064a1bce4e7b3a196a9" dependencies = [ "alloy-primitives", "async-trait", "auto_impl", "elliptic-curve", "k256", - "thiserror", + "thiserror 2.0.6", +] + +[[package]] +name = "alloy-signer-local" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2184dab8c9493ab3e1c9f6bd3bdb563ed322b79023d81531935e84a4fdf7cf1" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand", + "thiserror 2.0.6", ] [[package]] name = "alloy-sol-macro" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9343289b4a7461ed8bab8618504c995c049c082b70c7332efd7b32125633dc05" +checksum = "d9d64f851d95619233f74b310f12bcf16e0cbc27ee3762b6115c14a84809280a" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4222d70bec485ceccc5d8fd4f2909edd65b5d5e43d4aca0b5dcee65d519ae98f" +checksum = "6bf7ed1574b699f48bf17caab4e6e54c6d12bc3c006ab33d58b1e227c1c3559f" dependencies = [ + "alloy-json-abi", "alloy-sol-macro-input", "const-hex", "heck 0.5.0", - "indexmap 2.6.0", + "indexmap", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e17f2677369571b976e51ea1430eb41c3690d344fef567b840bfc0b01b6f83a" +checksum = "8c02997ccef5f34f9c099277d4145f183b422938ed5322dc57a089fe9b9ad9ee" dependencies = [ + "alloy-json-abi", "const-hex", "dunce", "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "serde_json", + "syn 2.0.90", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa64d80ae58ffaafdff9d5d84f58d03775f66c84433916dc9a64ed16af5755da" +checksum = "ce13ff37285b0870d0a0746992a4ae48efaf34b766ae4c2640fa15e5305f8e73" dependencies = [ "serde", "winnow 0.6.13", @@ -520,9 +626,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6520d427d4a8eb7aa803d852d7a52ceb0c519e784c292f64bb339e636918cf27" +checksum = "1174cafd6c6d810711b4e00383037bdb458efc4fe3dbafafa16567e0320c54d8" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -533,9 +639,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be77579633ebbc1266ae6fd7694f75c408beb1aeb6865d0b18f22893c265a061" +checksum = "628be5b9b75e4f4c4f2a71d985bbaca4f23de356dc83f1625454c505f5eef4df" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -543,7 +649,7 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror", + "thiserror 2.0.6", "tokio", "tower 0.5.0", "tracing", @@ -553,9 +659,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.5.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fd1a5d0827939847983b46f2f79510361f901dc82f8e3c38ac7397af142c6e" +checksum = "4e24412cf72f79c95cd9b1d9482e3a31f9d94c24b43c4b3b710cc8d4341eaab0" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -567,18 +673,56 @@ dependencies = [ ] [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "alloy-transport-ipc" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "0577a1f67ce70ece3f2b27cf1011da7222ef0a5701f7dcb558e5356278eeb531" +dependencies = [ + "alloy-json-rpc", + "alloy-pubsub", + "alloy-transport", + "bytes", + "futures", + "interprocess", + "pin-project", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] [[package]] -name = "android_system_properties" -version = "0.1.5" +name = "alloy-transport-ws" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "1ca46272d17f9647fdb56080ed26c72b3ea5078416831130f5ed46f3b4be0ed6" dependencies = [ - "libc", + "alloy-pubsub", + "alloy-transport", + "futures", + "http", + "rustls", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "ws_stream_wasm", +] + +[[package]] +name = "alloy-trie" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a5fd8fea044cc9a8c8a50bb6f28e31f0385d820f116c5b98f6f4e55d6e5590b" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more", + "nybbles", + "serde", + "smallvec", + "tracing", ] [[package]] @@ -768,6 +912,9 @@ name = "arrayvec" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +dependencies = [ + "serde", +] [[package]] name = "async-stream" @@ -788,7 +935,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -799,7 +946,18 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", +] + +[[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]] @@ -816,7 +974,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -913,7 +1071,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -1053,7 +1211,7 @@ dependencies = [ [[package]] name = "builder_log" -version = "0.4.0" +version = "0.5.0" dependencies = [ "async-trait", "commit-boost", @@ -1105,7 +1263,7 @@ dependencies = [ [[package]] name = "cb-bench-pbs" -version = "0.4.0" +version = "0.5.0" dependencies = [ "alloy", "axum", @@ -1128,14 +1286,14 @@ dependencies = [ [[package]] name = "cb-cli" -version = "0.4.0" +version = "0.5.0" dependencies = [ "cb-common", "clap", "docker-compose-types", "dotenvy", "eyre", - "indexmap 2.6.0", + "indexmap", "serde", "serde_json", "serde_yaml", @@ -1143,7 +1301,7 @@ dependencies = [ [[package]] name = "cb-common" -version = "0.4.0" +version = "0.5.0" dependencies = [ "aes 0.8.4", "alloy", @@ -1166,7 +1324,7 @@ dependencies = [ "serde_yaml", "sha2 0.10.8", "ssz_types", - "thiserror", + "thiserror 1.0.61", "tokio", "toml", "tracing", @@ -1180,20 +1338,20 @@ dependencies = [ [[package]] name = "cb-metrics" -version = "0.4.0" +version = "0.5.0" dependencies = [ "axum", "cb-common", "eyre", "prometheus", - "thiserror", + "thiserror 1.0.61", "tokio", "tracing", ] [[package]] name = "cb-pbs" -version = "0.4.0" +version = "0.5.0" dependencies = [ "alloy", "async-trait", @@ -1209,7 +1367,7 @@ dependencies = [ "prometheus", "reqwest", "serde_json", - "thiserror", + "thiserror 1.0.61", "tokio", "tracing", "url", @@ -1218,7 +1376,7 @@ dependencies = [ [[package]] name = "cb-signer" -version = "0.4.0" +version = "0.5.0" dependencies = [ "alloy", "axum", @@ -1226,12 +1384,14 @@ dependencies = [ "bimap", "blst", "cb-common", + "cb-metrics", "derive_more", "eyre", "headers", "k256", "lazy_static", - "thiserror", + "prometheus", + "thiserror 1.0.61", "tokio", "tracing", "tree_hash 0.8.0", @@ -1241,7 +1401,7 @@ dependencies = [ [[package]] name = "cb-tests" -version = "0.4.0" +version = "0.5.0" dependencies = [ "alloy", "axum", @@ -1274,11 +1434,8 @@ version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ - "android-tzdata", - "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.5", ] [[package]] @@ -1331,7 +1488,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -1387,7 +1544,7 @@ dependencies = [ [[package]] name = "commit-boost" -version = "0.4.0" +version = "0.5.0" dependencies = [ "cb-cli", "cb-common", @@ -1405,9 +1562,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.11.4" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ff96486ccc291d36a958107caf2c0af8c78c0af7d31ae2f35ce055130de1a6" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" dependencies = [ "cfg-if", "cpufeatures", @@ -1514,9 +1671,9 @@ dependencies = [ [[package]] name = "crypto-mac" -version = "0.11.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -1542,7 +1699,7 @@ dependencies = [ [[package]] name = "da_commit" -version = "0.4.0" +version = "0.5.0" dependencies = [ "alloy", "color-eyre", @@ -1577,7 +1734,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -1588,7 +1745,7 @@ checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -1618,6 +1775,12 @@ dependencies = [ "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.7.9" @@ -1635,7 +1798,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", - "serde", ] [[package]] @@ -1657,7 +1819,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -1678,7 +1840,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -1688,7 +1850,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -1708,7 +1870,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", "unicode-xid", ] @@ -1740,11 +1902,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9213a368b9c0767c81ef9ced0f712cfd99d27d7de2a22a60e7ac9b1342c8a395" dependencies = [ "derive_builder", - "indexmap 2.6.0", + "indexmap", "serde", "serde_yaml", ] +[[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" @@ -1978,7 +2146,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -2128,7 +2296,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -2224,19 +2392,13 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.6.0", + "indexmap", "slab", "tokio", "tokio-util", "tracing", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.13.2" @@ -2326,7 +2488,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62b8d85713ddc62e5e78db13bf9f9305610d0419276faa845076a68b7165872" dependencies = [ - "thiserror", + "thiserror 1.0.61", ] [[package]] @@ -2451,29 +2613,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -2534,17 +2673,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - [[package]] name = "indexmap" version = "2.6.0" @@ -2565,6 +2693,21 @@ dependencies = [ "generic-array", ] +[[package]] +name = "interprocess" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "894148491d817cb36b6f778017b8ac46b17408d522dd90f539d677ea938362eb" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -2861,7 +3004,20 @@ checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", +] + +[[package]] +name = "nybbles" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95f06be0417d97f81fe4e5c86d7d01b392655a9cac9c19a848aa033e18937b23" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", ] [[package]] @@ -2908,7 +3064,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -3028,10 +3184,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.61", "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" @@ -3049,7 +3215,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -3133,14 +3299,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] name = "proc-macro2" -version = "1.0.83" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -3157,7 +3323,7 @@ dependencies = [ "memchr", "parking_lot", "protobuf", - "thiserror", + "thiserror 1.0.61", ] [[package]] @@ -3247,6 +3413,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.1" @@ -3473,6 +3645,20 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rustls" +version = "0.23.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +dependencies = [ + "once_cell", + "ring 0.17.8", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" version = "2.1.2" @@ -3485,9 +3671,20 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring 0.17.8", + "rustls-pki-types", + "untrusted 0.9.0", +] [[package]] name = "rustversion" @@ -3621,6 +3818,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.202" @@ -3638,7 +3841,7 @@ checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -3670,7 +3873,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -3703,8 +3906,6 @@ dependencies = [ "base64 0.22.1", "chrono", "hex", - "indexmap 1.9.3", - "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -3721,7 +3922,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -3730,7 +3931,7 @@ version = "0.9.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0623d197252096520c6f2a5e1171ee436e5af99a5d7caa2891e55e61950e6d9" dependencies = [ - "indexmap 2.6.0", + "indexmap", "itoa", "ryu", "serde", @@ -3834,6 +4035,9 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -3892,7 +4096,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "status_api" -version = "0.4.0" +version = "0.5.0" dependencies = [ "async-trait", "axum", @@ -3932,14 +4136,14 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -3954,9 +4158,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -3965,14 +4169,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f76fe0a3e1476bdaa0775b9aec5b869ed9520c2b2fedfe9c6df3618f8ea6290b" +checksum = "219389c1ebe89f8333df8bdfb871f6631c552ff399c23cac02480b6088aad8f0" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -4032,7 +4236,16 @@ version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.61", +] + +[[package]] +name = "thiserror" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" +dependencies = [ + "thiserror-impl 2.0.6", ] [[package]] @@ -4043,7 +4256,18 @@ checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] @@ -4147,7 +4371,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -4160,6 +4384,16 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.15" @@ -4172,6 +4406,22 @@ dependencies = [ "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]] name = "tokio-util" version = "0.7.11" @@ -4212,7 +4462,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.6.0", + "indexmap", "toml_datetime", "winnow 0.5.40", ] @@ -4223,7 +4473,7 @@ version = "0.22.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" dependencies = [ - "indexmap 2.6.0", + "indexmap", "serde", "serde_spanned", "toml_datetime", @@ -4291,7 +4541,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", - "thiserror", + "thiserror 1.0.61", "time", "tracing-subscriber", ] @@ -4304,7 +4554,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -4400,7 +4650,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -4409,6 +4659,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 1.0.61", + "utf-8", +] + [[package]] name = "typenum" version = "1.17.0" @@ -4502,6 +4772,12 @@ dependencies = [ "serde", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8parse" version = "0.2.1" @@ -4592,7 +4868,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", "wasm-bindgen-shared", ] @@ -4626,7 +4902,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4652,9 +4928,9 @@ dependencies = [ [[package]] name = "wasmtimer" -version = "0.2.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7ed9d8b15c7fb594d72bfb4b5a276f3d2029333cd93a932f376f5937f6f80ee" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" dependencies = [ "futures", "js-sys", @@ -4674,6 +4950,21 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.26.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +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" @@ -4696,15 +4987,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.5", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -4872,6 +5154,25 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.0", + "send_wrapper", + "thiserror 1.0.61", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "wyz" version = "0.5.1" @@ -4898,7 +5199,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -4918,5 +5219,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] diff --git a/Cargo.toml b/Cargo.toml index 5700d713..c8e5ecc3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,15 @@ members = [ "tests", "benches/*", - "examples/*", + "examples/builder_log", + "examples/da_commit", + "examples/status_api", ] resolver = "2" [workspace.package] -version = "0.4.0" -rust-version = "1.80" +version = "0.5.0" +rust-version = "1.83" edition = "2021" [workspace.dependencies] @@ -27,7 +29,8 @@ cb-pbs = { path = "crates/pbs" } cb-signer = { path = "crates/signer" } # ethereum -alloy = { version = "0.5.4", features = [ +alloy = { version = "0.8.0", features = [ + "full", "rpc-types-beacon", "serde", "ssz", diff --git a/README.md b/README.md index 71057e98..c28c28b5 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,12 @@ # Commit-Boost -A new Ethereum validator sidecar focused on standardizing the last mile of communication between validators and third-party protocols. +[![Ci](https://github.com/Commit-Boost/commit-boost-client/actions/workflows/ci.yml/badge.svg)](https://github.com/Commit-Boost/commit-boost-client/actions/workflows/ci.yml) +[![Docs](https://img.shields.io/badge/docs-latest-blue.svg)](https://commit-boost.github.io/commit-boost-client/) +[![Release](https://img.shields.io/github/v/release/Commit-Boost/commit-boost-client)](https://github.com/Commit-Boost/commit-boost-client/releases) +[![Chat](https://img.shields.io/endpoint?color=neon&logo=telegram&label=chat&url=https%3A%2F%2Ftg.sumanjay.workers.dev%2F%2BPcs9bykxK3BiMzk5)](https://t.me/+Pcs9bykxK3BiMzk5) +[![X](https://img.shields.io/twitter/follow/Commit_Boost)](https://x.com/Commit_Boost) -[Docs](https://commit-boost.github.io/commit-boost-client/) | -[X (Twitter)](https://x.com/Commit_Boost) +A new Ethereum validator sidecar focused on standardizing the last mile of communication between validators and third-party protocols. ## Overview Commit-Boost is a modular sidecar that allows Ethereum validators to opt-in to different commitment protocols @@ -13,67 +16,17 @@ Commit-Boost is a modular sidecar that allows Ethereum validators to opt-in to d - Out-of-the-box support for metrics reporting and dashboards to have clear insight into what is happening in your validator - Plug-in system to add custom modules, e.g. receive a notification on Telegram if a relay fails to deliver a block -For more information on how to run Commit-Boost, check out our [docs](https://commit-boost.github.io/commit-boost-client/get_started/overview). - ### For developers - A modular platform to develop and distribute proposer commitments protocols - A single API to interact with validators - Support for hard-forks and new protocol requirements -For more information on how to develop a module on Commit-Boost, check out our [docs](https://commit-boost.github.io/commit-boost-client/category/developing). - -### Example -> **_NOTE:_** The code is unaudited and NOT ready for production. All APIs are subject to change - -A basic commit module with Commit-Boost. - -Add the `commit-boost` crate to your `Cargo.toml`: - -```toml -commit-boost = { git = "https://github.com/Commit-Boost/commit-boost-client", rev = "..." } -``` - -Then in `main.rs`: - -```rust -use commit_boost::prelude::*; - -#[derive(Debug, TreeHash)] -struct Datagram { - data: u64, -} - -#[tokio::main] -async fn main() { - let config = load_commit_module_config::<()>().unwrap(); - let pubkeys = config.signer_client.get_pubkeys().await.unwrap().keys; - - let pubkey = *pubkeys.consensus.first().unwrap().consensus; - - let datagram = Datagram { data: 42 }; - let request = SignConsensusRequest::builder(pubkey).with_msg(&datagram); - let signature = config - .signer_client - .request_consensus_signature(&request) - .await - .unwrap(); - - println!("Data: {datagram:?} - Commitment: {signature}"); -} -``` - -Finally, create a Docker image with your binary, e.g. `my_commit_module`, and add it to the `cb-config.toml` file: - -```toml -[[modules]] -id = "MY_MODULE" -docker_image = "my_commit_module" -``` - -For a more detailed example check out [here](/examples/da_commit) and our docs on how to [setup Commit-Boost](https://commit-boost.github.io/commit-boost-client/get_started/overview) for development. +## Get started +- [Node operators](https://commit-boost.github.io/commit-boost-client/category/get-started) +- [Developers](https://commit-boost.github.io/commit-boost-client/category/developing). Check out also the [examples](/examples) ## Audit -Commit Boost received an audit from [Sigma Prime](https://sigmaprime.io/). Find the report [here](/audit/Sigma_Prime_Commit_Boost_Client_Security_Assessment_Report_v2_0.pdf). +Commit-Boost received an audit from [Sigma Prime](https://sigmaprime.io/). Find the report [here](/audit/Sigma_Prime_Commit_Boost_Client_Security_Assessment_Report_v2_0.pdf). ## Acknowledgements - [MEV boost](https://github.com/flashbots/mev-boost) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..733897af --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,11 @@ +# Security Policy + +## Supported Versions + +Please see [Releases](https://github.com/Commit-Boost/commit-boost-client/releases). We recommend using the [most recently released version](https://github.com/Commit-Boost/commit-boost-client/releases/latest). + +## Reporting a Vulnerability + +Please send vulnerability reports to commit.boost@gmail.com + +**Please do not file a public ticket** mentioning the vulnerability, as doing so could increase the likelihood of the vulnerability being used before a fix has been created, released and installed on the network. diff --git a/benches/pbs/README.md b/benches/pbs/README.md index 7393d101..39555dea 100644 --- a/benches/pbs/README.md +++ b/benches/pbs/README.md @@ -94,7 +94,7 @@ commit-boost-cli start --docker benches/pbs/bench.docker-compose.yml ``` or regenerate it using `commit-boost-cli init`. -To clean up after then benchmark, run: +To clean up after the benchmark, run: ```bash commit-boost-cli stop --docker benches/pbs/bench.docker-compose.yml ``` diff --git a/bin/cli.rs b/bin/cli.rs index 880debb3..da89ca39 100644 --- a/bin/cli.rs +++ b/bin/cli.rs @@ -1,6 +1,6 @@ use clap::Parser; -/// Main entry point of the Commit Boost CLI +/// Main entry point of the Commit-Boost CLI #[tokio::main] async fn main() -> eyre::Result<()> { color_eyre::install()?; diff --git a/bin/pbs.rs b/bin/pbs.rs index b8039bec..1514cf10 100644 --- a/bin/pbs.rs +++ b/bin/pbs.rs @@ -14,10 +14,10 @@ async fn main() -> Result<()> { if std::env::var_os("RUST_BACKTRACE").is_none() { std::env::set_var("RUST_BACKTRACE", "1"); } - - let pbs_config = load_pbs_config()?; let _guard = initialize_pbs_tracing_log(); + let pbs_config = load_pbs_config().await?; + let state = PbsState::new(pbs_config); PbsService::init_metrics()?; let server = PbsService::run::<_, DefaultBuilderApi>(state); diff --git a/bin/signer.rs b/bin/signer.rs index cd9480ad..8ae24046 100644 --- a/bin/signer.rs +++ b/bin/signer.rs @@ -14,9 +14,9 @@ async fn main() -> Result<()> { if std::env::var_os("RUST_BACKTRACE").is_none() { std::env::set_var("RUST_BACKTRACE", "1"); } + let _guard = initialize_tracing_log(SIGNER_MODULE_NAME); let config = StartSignerConfig::load_from_env()?; - let _guard = initialize_tracing_log(SIGNER_MODULE_NAME); let server = SigningService::run(config); tokio::select! { diff --git a/config.example.toml b/config.example.toml index 7b6a4a11..253d35d1 100644 --- a/config.example.toml +++ b/config.example.toml @@ -37,7 +37,7 @@ 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 +# Whether to skip signature verification of headers and pubkey matching against the relay pubkey # OPTIONAL, DEFAULT: false skip_sigverify = false # Minimum bid in ETH that will be accepted from `get_header` @@ -57,7 +57,7 @@ late_in_slot_time_ms = 2000 extra_validation_enabled = false # Execution Layer RPC url to use for extra validation # OPTIONAL -rpc_url = "http://abc.xyz" +rpc_url = "https://ethereum-holesky-rpc.publicnode.com" # The PBS module needs one or more [[relays]] as defined below. [[relays]] @@ -111,17 +111,22 @@ validator_pubkeys = [ "0x80c7f782b2467c5898c5516a8b6595d75623960b4afc4f71ee07d40985d20e117ba35e7cd352a3e75fb85a8668a3b745", "0xa119589bb33ef52acbb8116832bec2b58fca590fe5c85eac5d3230b44d5bc09fe73ccd21f88eab31d6de16194d17782e", ] -# Path to a file containing a list of validator pubkeys +# Path to a file containing a list of validator pubkeys or details of a registry to load keys from. +# Supported registries: +# - Lido: NodeOperatorsRegistry +# - SSV: SSV API # OPTIONAL -loader = "./mux_keys.example.json" +loader = "./tests/data/mux_keys.example.json" +# loader = { registry = "lido", node_operator_id = 8 } +# loader = { registry = "ssv", node_operator_id = 8 } timeout_get_header_ms = 900 late_in_slot_time_ms = 1500 -# For each mux, one or more [[pbs_mux.relays]] can be defined, which will be used for the matching validator pubkeys -# Only the relays defined here will be used, and the rest of the relays defined in the main config will be ignored -# Any field defined here will override the default value from the relay config with the same id in [[relays]] +# For each mux, one or more [[mux.relays]] can be defined, which will be used for the matching validator pubkeys +# Only the relays defined here will be used, and the relays defined in the main [[relays]] config will be ignored +# The fields specified here are the same as in [[relays]] (headers, enable_timing_games, target_first_request_ms, frequency_get_header_ms) [[mux.relays]] -id = "example-relay" -headers = { X-MyCustomHeader = "ADifferentCustomValue" } +id = "mux-relay-1" +url = "http://0xa119589bb33ef52acbb8116832bec2b58fca590fe5c85eac5d3230b44d5bc09fe73ccd21f88eab31d6de16194d17782e@def.xyz" # Configuration for the Signer Module, only required if any `commit` module is present, or if `pbs.with_signer = true` # Currently two types of Signer modules are supported (only one can be used at a time): @@ -143,7 +148,7 @@ docker_image = "ghcr.io/commit-boost/signer:latest" # - ValidatorsDir: load keys from a `keys` and `secrets` file/folder (ERC-2335 style keystores). More details can be found in the docs (https://commit-boost.github.io/commit-boost-client/get_started/configuration/) [signer.local.loader] # File: path to the keys file -key_path = "./keys.example.json" +key_path = "./tests/data/keys.example.json" # ValidatorsDir: format of the keystore (lighthouse, prysm, teku or lodestar) # format = "lighthouse" # ValidatorsDir: full path to the keys directory @@ -209,10 +214,13 @@ host = "127.0.0.1" # - /etc/prometheus/targets.json # ``` # and use the `targets.json` file generated by `commit-boost-cli init` -prometheus_config = "./docker/prometheus.yml" +prometheus_config = "./provisioning/prometheus.yml" # Whether to start Grafana with built-in dashboards # OPTIONAL, DEFAULT: true use_grafana = true +# Path to a folder containing a `dashboards` and `datasources` folder for Grafana. +# OPTIONAL +grafana_path = "./provisioning/grafana" # Whether to start cadvisor for system monitoring # OPTIONAL, DEFAULT: true use_cadvisor = true diff --git a/crates/cli/src/docker_init.rs b/crates/cli/src/docker_init.rs index 1f135f66..5d257365 100644 --- a/crates/cli/src/docker_init.rs +++ b/crates/cli/src/docker_init.rs @@ -15,6 +15,7 @@ use cb_common::{ SIGNER_DIR_SECRETS_ENV, SIGNER_KEYS_ENV, SIGNER_MODULE_NAME, SIGNER_PORT_ENV, SIGNER_URL_ENV, }, + pbs::{BUILDER_API_PATH, GET_STATUS_PATH}, signer::{ProxyStore, SignerLoader}, types::ModuleId, utils::random_jwt, @@ -38,12 +39,12 @@ const METRICS_NETWORK: &str = "monitoring_network"; const SIGNER_NETWORK: &str = "signer_network"; /// Builds the docker compose file for the Commit-Boost services - // TODO: do more validation for paths, images, etc - -pub fn handle_docker_init(config_path: String, output_dir: String) -> Result<()> { +pub async fn handle_docker_init(config_path: String, output_dir: String) -> Result<()> { println!("Initializing Commit-Boost with config file: {}", config_path); let cb_config = CommitBoostConfig::from_file(&config_path)?; + cb_config.validate().await?; + let chain_spec_path = CommitBoostConfig::chain_spec_file(&config_path); let metrics_enabled = cb_config.metrics.is_some(); @@ -85,7 +86,7 @@ pub fn handle_docker_init(config_path: String, output_dir: String) -> Result<()> let builder_events_port = 30000; let mut builder_events_modules = Vec::new(); - let mut exposed_ports_warn = Vec::new(); + let mut warnings = Vec::new(); let mut needs_signer_module = cb_config.pbs.with_signer; @@ -268,8 +269,7 @@ pub fn handle_docker_init(config_path: String, output_dir: String) -> Result<()> let host_endpoint = SocketAddr::from((cb_config.pbs.pbs_config.host, cb_config.pbs.pbs_config.port)); let ports = Ports::Short(vec![format!("{}:{}", host_endpoint, cb_config.pbs.pbs_config.port)]); - exposed_ports_warn - .push(format!("pbs has an exported port on {}", cb_config.pbs.pbs_config.port)); + warnings.push(format!("pbs has an exported port on {}", cb_config.pbs.pbs_config.port)); // inside the container expose on 0.0.0.0 let container_endpoint = @@ -295,6 +295,17 @@ pub fn handle_docker_init(config_path: String, output_dir: String) -> Result<()> networks: pbs_networs, volumes: pbs_volumes, environment: Environment::KvPair(pbs_envs), + healthcheck: Some(Healthcheck { + test: Some(HealthcheckTest::Single(format!( + "curl -f http://localhost:{}{}{}", + cb_config.pbs.pbs_config.port, BUILDER_API_PATH, GET_STATUS_PATH + ))), + interval: Some("30s".into()), + timeout: Some("5s".into()), + retries: 3, + start_period: Some("5s".into()), + disable: false, + }), ..Service::default() }; @@ -413,10 +424,10 @@ pub fn handle_docker_init(config_path: String, output_dir: String) -> Result<()> test: Some(HealthcheckTest::Single(format!( "curl -f http://localhost:{signer_port}/status" ))), - interval: Some("5s".into()), + interval: Some("30s".into()), timeout: Some("5s".into()), - retries: 5, - start_period: Some("0s".into()), + retries: 3, + start_period: Some("5s".into()), disable: false, }), ..Service::default() @@ -454,7 +465,7 @@ pub fn handle_docker_init(config_path: String, output_dir: String) -> Result<()> if let Some(metrics_config) = cb_config.metrics { // prometheus - exposed_ports_warn.push("prometheus has an exported port on 9090".to_string()); + warnings.push("prometheus has an exported port on 9090".to_string()); let prom_volume = Volumes::Simple(format!( "{}:/etc/prometheus/prometheus.yml", @@ -491,13 +502,30 @@ pub fn handle_docker_init(config_path: String, output_dir: String) -> Result<()> // grafana if metrics_config.use_grafana { - exposed_ports_warn.push("grafana has an exported port on 3000".to_string()); - exposed_ports_warn.push( + warnings.push("grafana has an exported port on 3000".to_string()); + warnings.push( "Grafana has the default admin password of 'admin'. Login to change it".to_string(), ); let grafana_data_volume = - Volumes::Simple(format!("{}:/var/lib/grafana", GRAFANA_DATA_VOLUME)); + vec![Volumes::Simple(format!("{}:/var/lib/grafana", GRAFANA_DATA_VOLUME))]; + + let grafana_source_volumes = if let Some(path) = metrics_config.grafana_path { + vec![ + Volumes::Simple(format!( + "{}:/etc/grafana/provisioning/dashboards", + path.join("dashboards").display() + )), + Volumes::Simple(format!( + "{}:/etc/grafana/provisioning/datasources", + path.join("datasources").display() + )), + ] + } else { + vec![] + }; + + let grafana_volumes = [grafana_data_volume, grafana_source_volumes].concat(); let grafana_service = Service { container_name: Some("cb_grafana".to_owned()), @@ -506,15 +534,7 @@ pub fn handle_docker_init(config_path: String, output_dir: String) -> Result<()> networks: Networks::Simple(vec![METRICS_NETWORK.to_owned()]), depends_on: DependsOnOptions::Simple(vec!["cb_prometheus".to_owned()]), environment: Environment::List(vec!["GF_SECURITY_ADMIN_PASSWORD=admin".to_owned()]), - volumes: vec![ - Volumes::Simple( - "./grafana/dashboards:/etc/grafana/provisioning/dashboards".to_owned(), - ), - Volumes::Simple( - "./grafana/datasources:/etc/grafana/provisioning/datasources".to_owned(), - ), - grafana_data_volume, - ], + volumes: grafana_volumes, // disable verbose grafana logs logging: Some(LoggingParameters { driver: Some("none".to_owned()), options: None }), ..Service::default() @@ -535,7 +555,7 @@ pub fn handle_docker_init(config_path: String, output_dir: String) -> Result<()> // cadvisor if metrics_config.use_cadvisor { - exposed_ports_warn.push("cadvisor has an exported port on 8080".to_string()); + warnings.push("cadvisor has an exported port on 8080".to_string()); services.insert( "cb_cadvisor".to_owned(), @@ -566,9 +586,9 @@ pub fn handle_docker_init(config_path: String, output_dir: String) -> Result<()> let compose_str = serde_yaml::to_string(&compose)?; let compose_path = Path::new(&output_dir).join(CB_COMPOSE_FILE); std::fs::write(&compose_path, compose_str)?; - if !exposed_ports_warn.is_empty() { + if !warnings.is_empty() { println!("\n"); - for exposed_port in exposed_ports_warn { + for exposed_port in warnings { println!("Warning: {}", exposed_port); } println!("\n"); diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index 9e382af2..3b80ff9e 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -73,7 +73,7 @@ impl Args { match self.cmd { Command::Init { config_path, output_path } => { - docker_init::handle_docker_init(config_path, output_path) + docker_init::handle_docker_init(config_path, output_path).await } Command::Start { compose_path, env_path } => { diff --git a/crates/common/src/abi/LidoNORegistry.json b/crates/common/src/abi/LidoNORegistry.json new file mode 100644 index 00000000..296a26bd --- /dev/null +++ b/crates/common/src/abi/LidoNORegistry.json @@ -0,0 +1,56 @@ +[ + { + "constant": true, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + } + ], + "name": "getTotalSigningKeyCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_offset", + "type": "uint256" + }, + { + "name": "_limit", + "type": "uint256" + } + ], + "name": "getSigningKeys", + "outputs": [ + { + "name": "pubkeys", + "type": "bytes" + }, + { + "name": "signatures", + "type": "bytes" + }, + { + "name": "used", + "type": "bool[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/crates/common/src/config/metrics.rs b/crates/common/src/config/metrics.rs index 5a812b11..9a110a0b 100644 --- a/crates/common/src/config/metrics.rs +++ b/crates/common/src/config/metrics.rs @@ -1,4 +1,4 @@ -use std::net::Ipv4Addr; +use std::{net::Ipv4Addr, path::PathBuf}; use eyre::Result; use serde::{Deserialize, Serialize}; @@ -16,6 +16,8 @@ pub struct MetricsConfig { /// Whether to start the grafana service #[serde(default = "default_bool::")] pub use_grafana: bool, + /// Path to grafana config folder + pub grafana_path: Option, /// Whether to start the cadvisor service #[serde(default = "default_bool::")] pub use_cadvisor: bool, diff --git a/crates/common/src/config/mod.rs b/crates/common/src/config/mod.rs index 70acfadd..b097d02a 100644 --- a/crates/common/src/config/mod.rs +++ b/crates/common/src/config/mod.rs @@ -38,14 +38,13 @@ pub struct CommitBoostConfig { impl CommitBoostConfig { /// Validate config - pub fn validate(&self) -> Result<()> { - self.pbs.pbs_config.validate()?; + pub async fn validate(&self) -> Result<()> { + self.pbs.pbs_config.validate(self.chain).await?; Ok(()) } pub fn from_file(path: &str) -> Result { let config: Self = load_from_file(path)?; - config.validate()?; Ok(config) } @@ -83,7 +82,6 @@ impl CommitBoostConfig { logs: helper_config.logs, }; - config.validate()?; Ok(config) } diff --git a/crates/common/src/config/mux.rs b/crates/common/src/config/mux.rs index 17ab084b..32ff8e97 100644 --- a/crates/common/src/config/mux.rs +++ b/crates/common/src/config/mux.rs @@ -4,12 +4,19 @@ use std::{ sync::Arc, }; -use alloy::rpc::types::beacon::BlsPublicKey; -use eyre::{bail, ensure, eyre, Context}; +use alloy::{ + primitives::{address, Address, U256}, + providers::ProviderBuilder, + rpc::types::beacon::BlsPublicKey, + sol, +}; +use eyre::{bail, ensure, Context}; use serde::{Deserialize, Serialize}; +use tracing::{debug, info}; +use url::Url; use super::{load_optional_env_var, PbsConfig, RelayConfig, MUX_PATH_ENV}; -use crate::pbs::{RelayClient, RelayEntry}; +use crate::{pbs::RelayClient, types::Chain}; #[derive(Debug, Deserialize, Serialize)] pub struct PbsMuxes { @@ -26,18 +33,26 @@ pub struct RuntimeMuxConfig { } impl PbsMuxes { - pub fn validate_and_fill( + pub async fn validate_and_fill( self, + chain: Chain, default_pbs: &PbsConfig, - default_relays: &[RelayConfig], ) -> eyre::Result> { let mut muxes = self.muxes; for mux in muxes.iter_mut() { + ensure!(!mux.relays.is_empty(), "mux config {} must have at least one relay", mux.id); + if let Some(loader) = &mux.loader { - let extra_keys = loader.load(&mux.id)?; + let extra_keys = loader.load(&mux.id, chain, default_pbs.rpc_url.clone()).await?; mux.validator_pubkeys.extend(extra_keys); } + + ensure!( + !mux.validator_pubkeys.is_empty(), + "mux config {} must have at least one validator pubkey", + mux.id + ); } // check that validator pubkeys are in disjoint sets @@ -53,41 +68,16 @@ impl PbsMuxes { let mut configs = HashMap::new(); // fill the configs using the default pbs config and relay entries for mux in muxes { - ensure!(!mux.relays.is_empty(), "mux config {} must have at least one relay", mux.id); - ensure!( - !mux.validator_pubkeys.is_empty(), - "mux config {} must have at least one validator pubkey", - mux.id + info!( + id = mux.id, + keys = mux.validator_pubkeys.len(), + relays = mux.relays.len(), + "using mux" ); let mut relay_clients = Vec::with_capacity(mux.relays.len()); - for partial_relay in mux.relays.into_iter() { - // create a new config overriding only the missing fields - let partial_id = partial_relay.id()?; - // assume that there is always a relay defined in the default config. If this - // becomes too much of a burden, we can change this to allow defining relays - // that are exclusively used by a mux - let default_relay = default_relays - .iter() - .find(|r| r.id() == partial_id) - .ok_or_else(|| eyre!("default relay config not found for: {}", partial_id))?; - - let full_config = RelayConfig { - id: Some(partial_id.to_string()), - entry: partial_relay.entry.unwrap_or(default_relay.entry.clone()), - headers: partial_relay.headers.or(default_relay.headers.clone()), - enable_timing_games: partial_relay - .enable_timing_games - .unwrap_or(default_relay.enable_timing_games), - target_first_request_ms: partial_relay - .target_first_request_ms - .or(default_relay.target_first_request_ms), - frequency_get_header_ms: partial_relay - .frequency_get_header_ms - .or(default_relay.frequency_get_header_ms), - }; - - relay_clients.push(RelayClient::new(full_config)?); + for config in mux.relays.into_iter() { + relay_clients.push(RelayClient::new(config)?); } let config = PbsConfig { @@ -117,7 +107,7 @@ pub struct MuxConfig { /// Identifier for this mux config pub id: String, /// Relays to use for this mux config - pub relays: Vec, + pub relays: Vec, /// Which validator pubkeys to match against this mux config #[serde(default)] pub validator_pubkeys: Vec, @@ -128,56 +118,48 @@ pub struct MuxConfig { } impl MuxConfig { - /// Returns the env, actual path, and internal path to use for the loader + /// Returns the env, actual path, and internal path to use for the file + /// loader pub fn loader_env(&self) -> Option<(String, String, String)> { - self.loader.as_ref().map(|loader| match loader { + self.loader.as_ref().and_then(|loader| match loader { MuxKeysLoader::File(path_buf) => { let path = path_buf.to_str().unwrap_or_else(|| panic!("invalid path: {:?}", path_buf)); let internal_path = get_mux_path(&self.id); - (get_mux_env(&self.id), path.to_owned(), internal_path) + Some((get_mux_env(&self.id), path.to_owned(), internal_path)) } + MuxKeysLoader::Registry { .. } => None, }) } } -#[derive(Debug, Clone, Deserialize, Serialize)] -/// A relay config with all optional fields. See [`RelayConfig`] for the -/// description of the fields. -pub struct PartialRelayConfig { - pub id: Option, - #[serde(rename = "url")] - pub entry: Option, - pub headers: Option>, - pub enable_timing_games: Option, - pub target_first_request_ms: Option, - pub frequency_get_header_ms: Option, -} - -impl PartialRelayConfig { - pub fn id(&self) -> eyre::Result<&str> { - match &self.id { - Some(id) => Ok(id.as_str()), - None => { - let entry = self.entry.as_ref().ok_or_else(|| { - eyre!("relays in [[mux]] need to specifify either an `id` or a `url`") - })?; - Ok(entry.id.as_str()) - } - } - } -} - #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(untagged)] pub enum MuxKeysLoader { /// A file containing a list of validator pubkeys File(PathBuf), + Registry { + registry: NORegistry, + node_operator_id: u64, + }, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub enum NORegistry { + #[serde(alias = "lido")] + Lido, + #[serde(alias = "ssv")] + SSV, } impl MuxKeysLoader { - pub fn load(&self, mux_id: &str) -> eyre::Result> { + pub async fn load( + &self, + mux_id: &str, + chain: Chain, + rpc_url: Option, + ) -> eyre::Result> { match self { Self::File(config_path) => { // First try loading from env @@ -187,6 +169,17 @@ impl MuxKeysLoader { let file = load_file(path)?; serde_json::from_str(&file).wrap_err("failed to parse mux keys file") } + + Self::Registry { registry, node_operator_id } => match registry { + NORegistry::Lido => { + let Some(rpc_url) = rpc_url else { + bail!("Lido registry requires RPC URL to be set in the PBS config"); + }; + + fetch_lido_registry_keys(rpc_url, chain, U256::from(*node_operator_id)).await + } + NORegistry::SSV => fetch_ssv_pubkeys(chain, U256::from(*node_operator_id)).await, + }, } } } @@ -204,3 +197,191 @@ fn get_mux_env(mux_id: &str) -> String { fn get_mux_path(mux_id: &str) -> String { format!("/{mux_id}-mux_keys.json") } + +sol! { + #[allow(missing_docs)] + #[sol(rpc)] + LidoRegistry, + "src/abi/LidoNORegistry.json" +} + +fn lido_registry_address(chain: Chain) -> eyre::Result
{ + match chain { + Chain::Mainnet => Ok(address!("55032650b14df07b85bF18A3a3eC8E0Af2e028d5")), + Chain::Holesky => Ok(address!("595F64Ddc3856a3b5Ff4f4CC1d1fb4B46cFd2bAC")), + Chain::Sepolia => Ok(address!("33d6E15047E8644F8DDf5CD05d202dfE587DA6E3")), + _ => bail!("Lido registry not supported for chain: {chain:?}"), + } +} + +async fn fetch_lido_registry_keys( + rpc_url: Url, + chain: Chain, + node_operator_id: U256, +) -> eyre::Result> { + debug!(?chain, %node_operator_id, "loading operator keys from Lido registry"); + + let provider = ProviderBuilder::new().on_http(rpc_url); + let registry_address = lido_registry_address(chain)?; + let registry = LidoRegistry::new(registry_address, provider); + + let total_keys = + registry.getTotalSigningKeyCount(node_operator_id).call().await?._0.try_into()?; + + debug!("fetching {total_keys} total keys"); + + const CALL_BATCH_SIZE: u64 = 250u64; + const BLS_PK_LEN: usize = BlsPublicKey::len_bytes(); + + let mut keys = vec![]; + let mut offset = 0; + + while offset < total_keys { + let limit = CALL_BATCH_SIZE.min(total_keys - offset); + + let pubkeys = registry + .getSigningKeys(node_operator_id, U256::from(offset), U256::from(limit)) + .call() + .await? + .pubkeys; + + ensure!( + pubkeys.len() % BLS_PK_LEN == 0, + "unexpected number of keys in batch, expected multiple of {BLS_PK_LEN}, got {}", + pubkeys.len() + ); + + for chunk in pubkeys.chunks(BLS_PK_LEN) { + keys.push(BlsPublicKey::try_from(chunk)?); + } + + offset += limit; + + if offset % 1000 == 0 { + debug!("fetched {offset} keys"); + } + } + + ensure!(keys.len() == total_keys as usize, "expected {total_keys} keys, got {}", keys.len()); + let unique = keys.iter().collect::>(); + ensure!(unique.len() == keys.len(), "found duplicate keys in registry"); + + Ok(keys) +} + +async fn fetch_ssv_pubkeys( + chain: Chain, + node_operator_id: U256, +) -> eyre::Result> { + const MAX_PER_PAGE: usize = 100; + + let chain_name = match chain { + Chain::Mainnet => "mainnet", + Chain::Holesky => "holesky", + _ => bail!("SSV network is not supported for chain: {chain:?}"), + }; + + let client = reqwest::Client::new(); + let mut pubkeys: Vec = vec![]; + let mut page = 1; + + loop { + let response = client + .get(format!( + "https://api.ssv.network/api/v4/{}/validators/in_operator/{}?perPage={}&page={}", + chain_name, node_operator_id, MAX_PER_PAGE, page + )) + .send() + .await + .map_err(|e| eyre::eyre!("Error sending request to SSV network API: {e}"))? + .json::() + .await?; + + pubkeys.extend(response.validators.iter().map(|v| v.pubkey).collect::>()); + page += 1; + + if response.validators.len() < MAX_PER_PAGE { + ensure!( + pubkeys.len() == response.pagination.total, + "expected {} keys, got {}", + response.pagination.total, + pubkeys.len() + ); + break; + } + } + + let unique = pubkeys.iter().collect::>(); + ensure!(unique.len() == pubkeys.len(), "found duplicate keys in registry"); + + Ok(pubkeys) +} + +#[derive(Deserialize)] +struct SSVResponse { + validators: Vec, + pagination: SSVPagination, +} + +#[derive(Deserialize)] +struct SSVValidator { + #[serde(rename = "public_key")] + pubkey: BlsPublicKey, +} + +#[derive(Deserialize)] +struct SSVPagination { + total: usize, +} + +#[cfg(test)] +mod tests { + use alloy::{primitives::U256, providers::ProviderBuilder}; + use url::Url; + + use super::*; + + #[tokio::test] + async fn test_lido_registry_address() -> eyre::Result<()> { + let url = Url::parse("https://ethereum-rpc.publicnode.com")?; + let provider = ProviderBuilder::new().on_http(url); + + let registry = + LidoRegistry::new(address!("55032650b14df07b85bF18A3a3eC8E0Af2e028d5"), provider); + + const LIMIT: usize = 3; + let node_operator_id = U256::from(1); + + let total_keys: u64 = + registry.getTotalSigningKeyCount(node_operator_id).call().await?._0.try_into()?; + + assert!(total_keys > LIMIT as u64); + + let pubkeys = registry + .getSigningKeys(node_operator_id, U256::ZERO, U256::from(LIMIT)) + .call() + .await? + .pubkeys; + + let mut vec = vec![]; + for chunk in pubkeys.chunks(BlsPublicKey::len_bytes()) { + vec.push(BlsPublicKey::try_from(chunk)?); + } + + assert_eq!(vec.len(), LIMIT); + + Ok(()) + } + + #[tokio::test] + async fn test_ssv_network_fetch() -> eyre::Result<()> { + let chain = Chain::Holesky; + let node_operator_id = U256::from(200); + + let pubkeys = fetch_ssv_pubkeys(chain, node_operator_id).await?; + + assert_eq!(pubkeys.len(), 3); + + Ok(()) + } +} diff --git a/crates/common/src/config/pbs.rs b/crates/common/src/config/pbs.rs index 0144ce88..5e42b6c6 100644 --- a/crates/common/src/config/pbs.rs +++ b/crates/common/src/config/pbs.rs @@ -8,6 +8,7 @@ use std::{ use alloy::{ primitives::{utils::format_ether, U256}, + providers::{Provider, ProviderBuilder}, rpc::types::beacon::BlsPublicKey, }; use eyre::{ensure, Result}; @@ -101,7 +102,7 @@ pub struct PbsConfig { impl PbsConfig { /// Validate PBS config parameters - pub fn validate(&self) -> Result<()> { + pub async fn validate(&self, chain: Chain) -> Result<()> { // timeouts must be positive ensure!(self.timeout_get_header_ms > 0, "timeout_get_header_ms must be greater than 0"); ensure!(self.timeout_get_payload_ms > 0, "timeout_get_payload_ms must be greater than 0"); @@ -128,6 +129,21 @@ impl PbsConfig { ); } + if let Some(rpc_url) = &self.rpc_url { + // TODO: remove this once we support chain ids for custom chains + if !matches!(chain, Chain::Custom { .. }) { + let provider = ProviderBuilder::new().on_http(rpc_url.clone()); + let chain_id = provider.get_chain_id().await?; + ensure!( + chain_id == chain.id(), + "Rpc url is for the wrong chain, expected: {} ({:?}) got {}", + chain.id(), + chain, + chain_id + ); + } + } + Ok(()) } } @@ -155,8 +171,12 @@ pub struct PbsModuleConfig { pub endpoint: SocketAddr, /// Pbs default config pub pbs_config: Arc, - /// List of relays + /// List of default relays pub relays: Vec, + /// List of all default relays plus additional relays from muxes (based on + /// URL) DO NOT use this for get_header calls, use `relays` or `muxes` + /// instead + pub all_relays: Vec, /// Signer client to call Signer API pub signer_client: Option, /// Event publisher @@ -170,9 +190,9 @@ fn default_pbs() -> String { } /// Loads the default pbs config, i.e. with no signer client or custom data -pub fn load_pbs_config() -> Result { +pub async fn load_pbs_config() -> Result { let config = CommitBoostConfig::from_env_path()?; - config.validate()?; + config.validate().await?; // use endpoint from env if set, otherwise use default host and port let endpoint = if let Some(endpoint) = load_optional_env_var(PBS_ENDPOINT_ENV) { @@ -181,20 +201,43 @@ pub fn load_pbs_config() -> Result { SocketAddr::from((config.pbs.pbs_config.host, config.pbs.pbs_config.port)) }; - let muxes = config - .muxes - .map(|muxes| muxes.validate_and_fill(&config.pbs.pbs_config, &config.relays)) - .transpose()?; + let muxes = match config.muxes { + Some(muxes) => { + let mux_configs = muxes.validate_and_fill(config.chain, &config.pbs.pbs_config).await?; + Some(mux_configs) + } + None => None, + }; let relay_clients = config.relays.into_iter().map(RelayClient::new).collect::>>()?; let maybe_publiher = BuilderEventPublisher::new_from_env()?; + let mut all_relays = HashMap::with_capacity(relay_clients.len()); + + if let Some(muxes) = &muxes { + for (_, mux) in muxes.iter() { + for relay in mux.relays.iter() { + all_relays.insert(&relay.config.entry.url, relay.clone()); + } + } + } + + // insert default relays after to make sure we keep these as defaults, + // this means we override timing games which is ok since this won't be used for + // get_header we also override headers if the same relays has two + // definitions (in muxes and default) + for relay in relay_clients.iter() { + all_relays.insert(&relay.config.entry.url, relay.clone()); + } + + let all_relays = all_relays.into_values().collect(); Ok(PbsModuleConfig { chain: config.chain, endpoint, pbs_config: Arc::new(config.pbs.pbs_config), relays: relay_clients, + all_relays, signer_client: None, event_publisher: maybe_publiher, muxes, @@ -202,7 +245,7 @@ pub fn load_pbs_config() -> Result { } /// Loads a custom pbs config, i.e. with signer client and/or custom data -pub fn load_pbs_custom_config() -> Result<(PbsModuleConfig, T)> { +pub async fn load_pbs_custom_config() -> Result<(PbsModuleConfig, T)> { #[derive(Debug, Deserialize)] struct CustomPbsConfig { #[serde(flatten)] @@ -221,7 +264,7 @@ pub fn load_pbs_custom_config() -> Result<(PbsModuleConfig, // load module config including the extra data (if any) let cb_config: StubConfig = load_file_from_env(CONFIG_ENV)?; - cb_config.pbs.static_config.pbs_config.validate()?; + cb_config.pbs.static_config.pbs_config.validate(cb_config.chain).await?; // use endpoint from env if set, otherwise use default host and port let endpoint = if let Some(endpoint) = load_optional_env_var(PBS_ENDPOINT_ENV) { @@ -235,7 +278,9 @@ pub fn load_pbs_custom_config() -> Result<(PbsModuleConfig, let muxes = match cb_config.muxes { Some(muxes) => Some( - muxes.validate_and_fill(&cb_config.pbs.static_config.pbs_config, &cb_config.relays)?, + muxes + .validate_and_fill(cb_config.chain, &cb_config.pbs.static_config.pbs_config) + .await?, ), None => None, }; @@ -243,6 +288,25 @@ pub fn load_pbs_custom_config() -> Result<(PbsModuleConfig, let relay_clients = cb_config.relays.into_iter().map(RelayClient::new).collect::>>()?; let maybe_publiher = BuilderEventPublisher::new_from_env()?; + let mut all_relays = HashMap::with_capacity(relay_clients.len()); + + if let Some(muxes) = &muxes { + for (_, mux) in muxes.iter() { + for relay in mux.relays.iter() { + all_relays.insert(&relay.config.entry.url, relay.clone()); + } + } + } + + // insert default relays after to make sure we keep these as defaults, + // this also means we override timing games which is ok since this won't be used + // for get header we also override headers if the same relays has two + // definitions (in muxes and default) + for relay in relay_clients.iter() { + all_relays.insert(&relay.config.entry.url, relay.clone()); + } + + let all_relays = all_relays.into_values().collect(); let signer_client = if cb_config.pbs.static_config.with_signer { // if custom pbs requires a signer client, load jwt @@ -259,6 +323,7 @@ pub fn load_pbs_custom_config() -> Result<(PbsModuleConfig, endpoint, pbs_config: Arc::new(cb_config.pbs.static_config.pbs_config), relays: relay_clients, + all_relays, signer_client, event_publisher: maybe_publiher, muxes, diff --git a/crates/common/src/pbs/constants.rs b/crates/common/src/pbs/constants.rs index 38b93935..07f9faf4 100644 --- a/crates/common/src/pbs/constants.rs +++ b/crates/common/src/pbs/constants.rs @@ -9,7 +9,8 @@ pub const SUBMIT_BLOCK_PATH: &str = "/blinded_blocks"; // https://ethereum.github.io/builder-specs/#/Builder -pub const HEADER_SLOT_UUID_KEY: &str = "X-MEVBoost-SlotID"; +// Currently unused to enable a stateless default PBS module +// const HEADER_SLOT_UUID_KEY: &str = "X-MEVBoost-SlotID"; pub const HEADER_VERSION_KEY: &str = "X-CommitBoost-Version"; pub const HEADER_VERSION_VALUE: &str = COMMIT_BOOST_VERSION; pub const HEADER_START_TIME_UNIX_MS: &str = "X-MEVBoost-StartTimeUnixMS"; diff --git a/crates/common/src/pbs/event.rs b/crates/common/src/pbs/event.rs index 93a3499e..f7954907 100644 --- a/crates/common/src/pbs/event.rs +++ b/crates/common/src/pbs/event.rs @@ -34,9 +34,6 @@ pub enum BuilderEvent { MissedPayload { /// Hash for the block for which no payload was received block_hash: B256, - /// Relays which delivered the header but for which no payload was - /// received - missing_relays: String, }, RegisterValidatorRequest(Vec), RegisterValidatorResponse, diff --git a/crates/common/src/pbs/relay.rs b/crates/common/src/pbs/relay.rs index db18466a..c74a6516 100644 --- a/crates/common/src/pbs/relay.rs +++ b/crates/common/src/pbs/relay.rs @@ -50,7 +50,8 @@ impl<'de> Deserialize<'de> for RelayEntry { } } -/// A client to interact with a relay, safe to share across threads +/// A client to interact with a relay, safe to share across threads and cheaply +/// cloneable #[derive(Debug, Clone)] pub struct RelayClient { /// ID of the relay diff --git a/crates/common/src/signer/store.rs b/crates/common/src/signer/store.rs index 878fdb67..3127d254 100644 --- a/crates/common/src/signer/store.rs +++ b/crates/common/src/signer/store.rs @@ -280,7 +280,7 @@ impl ProxyStore { let path = entry.path(); if !path.is_file() || - !path.extension().is_some_and(|ext| ext == "json") + path.extension().is_none_or(|ext| ext != "json") { continue; } @@ -336,7 +336,7 @@ impl ProxyStore { let path = entry.path(); if !path.is_file() || - !path.extension().is_some_and(|ext| ext == "json") + path.extension().is_none_or(|ext| ext != "json") { continue; } diff --git a/crates/common/src/types.rs b/crates/common/src/types.rs index c7684520..f6b5efd1 100644 --- a/crates/common/src/types.rs +++ b/crates/common/src/types.rs @@ -46,6 +46,18 @@ impl std::fmt::Debug for Chain { } impl Chain { + pub fn id(&self) -> u64 { + match self { + Chain::Mainnet => KnownChain::Mainnet.id(), + Chain::Holesky => KnownChain::Holesky.id(), + Chain::Sepolia => KnownChain::Sepolia.id(), + Chain::Helder => KnownChain::Helder.id(), + Chain::Custom { .. } => { + unimplemented!("chain id is not supported on custom chains, please file an issue") + } + } + } + pub fn builder_domain(&self) -> [u8; 32] { match self { Chain::Mainnet => KnownChain::Mainnet.builder_domain(), @@ -101,6 +113,15 @@ pub enum KnownChain { // Constants impl KnownChain { + pub fn id(&self) -> u64 { + match self { + KnownChain::Mainnet => 1, + KnownChain::Holesky => 17000, + KnownChain::Sepolia => 11155111, + KnownChain::Helder => 167000, + } + } + pub fn builder_domain(&self) -> [u8; 32] { match self { KnownChain::Mainnet => [ diff --git a/crates/common/src/utils.rs b/crates/common/src/utils.rs index a1bbfe8d..6f2a2d07 100644 --- a/crates/common/src/utils.rs +++ b/crates/common/src/utils.rs @@ -18,7 +18,7 @@ use tracing_appender::{non_blocking::WorkerGuard, rolling::Rotation}; use tracing_subscriber::{fmt::Layer, prelude::*, EnvFilter}; use crate::{ - config::{LogsSettings, LOGS_DIR_DEFAULT, PBS_MODULE_NAME}, + config::{load_optional_env_var, LogsSettings, LOGS_DIR_DEFAULT, PBS_MODULE_NAME}, pbs::HEADER_VERSION_VALUE, types::Chain, }; @@ -165,13 +165,13 @@ pub fn initialize_tracing_log(module_id: &str) -> eyre::Result { let settings = settings.unwrap_or_default(); // Log level for stdout - let stdout_log_level = match settings.log_level.parse::() { - Ok(f) => f, - Err(_) => { - eprintln!("Invalid RUST_LOG value {}, defaulting to info", settings.log_level); - Level::INFO - } + + let stdout_log_level = if let Some(log_level) = load_optional_env_var("RUST_LOG") { + log_level.parse::().expect("invalid RUST_LOG value") + } else { + settings.log_level.parse::().expect("invalid log_level value in settings") }; + let stdout_filter = format_crates_filter(Level::INFO.as_str(), stdout_log_level.as_str()); if use_file_logs { diff --git a/crates/pbs/src/mev_boost/get_header.rs b/crates/pbs/src/mev_boost/get_header.rs index 04485119..f875a4e1 100644 --- a/crates/pbs/src/mev_boost/get_header.rs +++ b/crates/pbs/src/mev_boost/get_header.rs @@ -14,7 +14,7 @@ use cb_common::{ pbs::{ error::{PbsError, ValidationError}, GetHeaderParams, GetHeaderResponse, RelayClient, SignedExecutionPayloadHeader, - EMPTY_TX_ROOT_HASH, HEADER_SLOT_UUID_KEY, HEADER_START_TIME_UNIX_MS, + EMPTY_TX_ROOT_HASH, HEADER_START_TIME_UNIX_MS, }, signature::verify_signed_message, types::Chain, @@ -73,11 +73,8 @@ pub async fn get_header( return Ok(None); } - let (_, slot_uuid) = state.get_slot_and_uuid(); - // prepare headers, except for start time which is set in `send_one_get_header` let mut send_headers = HeaderMap::new(); - send_headers.insert(HEADER_SLOT_UUID_KEY, HeaderValue::from_str(&slot_uuid.to_string())?); send_headers.insert(USER_AGENT, get_user_agent_with_version(&req_headers)?); let mut handles = Vec::with_capacity(relays.len()); @@ -118,7 +115,9 @@ pub async fn get_header( } } - Ok(state.add_bids(params.slot, relay_bids)) + let max_bid = relay_bids.into_iter().max_by_key(|bid| bid.value()); + + Ok(max_bid) } /// Fetch the parent block from the RPC URL for extra validation of the header. @@ -398,22 +397,22 @@ fn validate_header( return Err(ValidationError::BidTooLow { min: minimum_bid_wei, got: value }); } - if expected_relay_pubkey != received_relay_pubkey { - return Err(ValidationError::PubkeyMismatch { - expected: expected_relay_pubkey, - got: received_relay_pubkey, - }); - } - let expected_timestamp = timestamp_of_slot_start_sec(slot, chain); if expected_timestamp != signed_header.message.header.timestamp { return Err(ValidationError::TimestampMismatch { expected: expected_timestamp, got: signed_header.message.header.timestamp, - }) + }); } if !skip_sig_verify { + if expected_relay_pubkey != received_relay_pubkey { + return Err(ValidationError::PubkeyMismatch { + expected: expected_relay_pubkey, + got: received_relay_pubkey, + }); + } + verify_signed_message( chain, &received_relay_pubkey, @@ -545,6 +544,13 @@ mod tests { mock_header.message.value = U256::from(11); + let expected = timestamp_of_slot_start_sec(slot, chain); + assert_eq!( + validate_header(&mock_header, chain, pubkey, parent_hash, false, min_bid, slot,), + Err(ValidationError::TimestampMismatch { expected, got: 0 }) + ); + + mock_header.message.header.timestamp = expected; mock_header.message.pubkey = pubkey; assert_eq!( @@ -560,14 +566,6 @@ mod tests { Err(ValidationError::PubkeyMismatch { expected: BlsPublicKey::default(), got: pubkey }) ); - let expected = timestamp_of_slot_start_sec(slot, chain); - assert_eq!( - validate_header(&mock_header, chain, pubkey, parent_hash, false, min_bid, slot,), - Err(ValidationError::TimestampMismatch { expected, got: 0 }) - ); - - mock_header.message.header.timestamp = expected; - assert!(matches!( validate_header(&mock_header, chain, pubkey, parent_hash, false, min_bid, slot), Err(ValidationError::Sigverify(_)) @@ -580,6 +578,6 @@ mod tests { assert!( validate_header(&mock_header, chain, pubkey, parent_hash, false, min_bid, slot).is_ok() - ) + ); } } diff --git a/crates/pbs/src/mev_boost/register_validator.rs b/crates/pbs/src/mev_boost/register_validator.rs index 9f995a86..6a745319 100644 --- a/crates/pbs/src/mev_boost/register_validator.rs +++ b/crates/pbs/src/mev_boost/register_validator.rs @@ -32,7 +32,7 @@ pub async fn register_validator( .insert(HEADER_START_TIME_UNIX_MS, HeaderValue::from_str(&utcnow_ms().to_string())?); send_headers.insert(USER_AGENT, get_user_agent_with_version(&req_headers)?); - let relays = state.relays().to_vec(); + let relays = state.all_relays().to_vec(); let mut handles = Vec::with_capacity(relays.len()); for relay in relays { handles.push(tokio::spawn( diff --git a/crates/pbs/src/mev_boost/status.rs b/crates/pbs/src/mev_boost/status.rs index 5fdf7db5..7d9d67d2 100644 --- a/crates/pbs/src/mev_boost/status.rs +++ b/crates/pbs/src/mev_boost/status.rs @@ -31,7 +31,7 @@ pub async fn get_status( let mut send_headers = HeaderMap::new(); send_headers.insert(USER_AGENT, get_user_agent_with_version(&req_headers)?); - let relays = state.relays(); + let relays = state.all_relays(); let mut handles = Vec::with_capacity(relays.len()); for relay in relays { handles.push(Box::pin(send_relay_check(relay, send_headers.clone()))); diff --git a/crates/pbs/src/mev_boost/submit_block.rs b/crates/pbs/src/mev_boost/submit_block.rs index 7f39828e..0d03816b 100644 --- a/crates/pbs/src/mev_boost/submit_block.rs +++ b/crates/pbs/src/mev_boost/submit_block.rs @@ -4,7 +4,7 @@ use axum::http::{HeaderMap, HeaderValue}; use cb_common::{ pbs::{ error::{PbsError, ValidationError}, - RelayClient, SignedBlindedBeaconBlock, SubmitBlindedBlockResponse, HEADER_SLOT_UUID_KEY, + RelayClient, SignedBlindedBeaconBlock, SubmitBlindedBlockResponse, HEADER_START_TIME_UNIX_MS, }, utils::{get_user_agent_with_version, utcnow_ms}, @@ -27,15 +27,12 @@ pub async fn submit_block( req_headers: HeaderMap, state: PbsState, ) -> eyre::Result { - let (_, slot_uuid) = state.get_slot_and_uuid(); - // prepare headers let mut send_headers = HeaderMap::new(); - send_headers.insert(HEADER_SLOT_UUID_KEY, HeaderValue::from_str(&slot_uuid.to_string())?); send_headers.insert(HEADER_START_TIME_UNIX_MS, HeaderValue::from(utcnow_ms())); send_headers.insert(USER_AGENT, get_user_agent_with_version(&req_headers)?); - let relays = state.relays(); + let relays = state.all_relays(); let mut handles = Vec::with_capacity(relays.len()); for relay in relays.iter() { handles.push(Box::pin(submit_block_with_timeout( diff --git a/crates/pbs/src/routes/get_header.rs b/crates/pbs/src/routes/get_header.rs index 242c4283..5d0b3bd6 100644 --- a/crates/pbs/src/routes/get_header.rs +++ b/crates/pbs/src/routes/get_header.rs @@ -27,7 +27,6 @@ pub async fn handle_get_header>( Path(params): Path, ) -> Result { state.publish_event(BuilderEvent::GetHeaderRequest(params)); - state.get_or_update_slot_uuid(params.slot); let ua = get_user_agent(&req_headers); let ms_into_slot = ms_into_slot(params.slot, state.config.chain); diff --git a/crates/pbs/src/routes/submit_block.rs b/crates/pbs/src/routes/submit_block.rs index 8773ce27..5ae64c5a 100644 --- a/crates/pbs/src/routes/submit_block.rs +++ b/crates/pbs/src/routes/submit_block.rs @@ -4,7 +4,7 @@ use cb_common::{ utils::{get_user_agent, timestamp_of_slot_start_millis, utcnow_ms}, }; use reqwest::StatusCode; -use tracing::{error, info, trace, warn}; +use tracing::{error, info, trace}; use uuid::Uuid; use crate::{ @@ -29,13 +29,8 @@ pub async fn handle_submit_block>( let block_hash = signed_blinded_block.message.body.execution_payload_header.block_hash; let slot_start_ms = timestamp_of_slot_start_millis(slot, state.config.chain); let ua = get_user_agent(&req_headers); - let (curr_slot, slot_uuid) = state.get_slot_and_uuid(); - info!(ua, %slot_uuid, ms_into_slot=now.saturating_sub(slot_start_ms), %block_hash); - - if curr_slot != signed_blinded_block.message.slot { - warn!(expected = curr_slot, got = slot, "blinded beacon slot mismatch") - } + info!(ua, ms_into_slot=now.saturating_sub(slot_start_ms), %block_hash); match A::submit_block(signed_blinded_block, req_headers, state.clone()).await { Ok(res) => { @@ -48,24 +43,8 @@ pub async fn handle_submit_block>( } Err(err) => { - if let Some(fault_pubkeys) = state.get_relays_by_block_hash(slot, block_hash) { - let missing_relays = state - .relays() - .iter() - .filter(|relay| fault_pubkeys.contains(&relay.pubkey())) - .map(|relay| &**relay.id) - .collect::>() - .join(","); - - error!(%err, %block_hash, missing_relays, "CRITICAL: no payload received from relays"); - state.publish_event(BuilderEvent::MissedPayload { block_hash, missing_relays }); - } else { - error!(%err, %block_hash, "CRITICAL: no payload delivered and no relay for block hash. Was getHeader even called?"); - state.publish_event(BuilderEvent::MissedPayload { - block_hash, - missing_relays: String::default(), - }); - }; + error!(%err, %block_hash, "CRITICAL: no payload received from relays. Check previous logs or use the Relay Data API"); + state.publish_event(BuilderEvent::MissedPayload { block_hash }); let err = PbsClientError::NoPayload; BEACON_NODE_STATUS diff --git a/crates/pbs/src/service.rs b/crates/pbs/src/service.rs index 0f88becd..2533573b 100644 --- a/crates/pbs/src/service.rs +++ b/crates/pbs/src/service.rs @@ -1,9 +1,15 @@ -use cb_common::constants::COMMIT_BOOST_VERSION; +use std::time::Duration; + +use cb_common::{ + constants::COMMIT_BOOST_VERSION, + pbs::{BUILDER_API_PATH, GET_STATUS_PATH}, +}; use cb_metrics::provider::MetricsProvider; -use eyre::{Context, Result}; +use eyre::{bail, Context, Result}; use prometheus::core::Collector; use tokio::net::TcpListener; use tracing::info; +use url::Url; use crate::{ api::BuilderApi, @@ -16,15 +22,30 @@ pub struct PbsService; impl PbsService { pub async fn run>(state: PbsState) -> Result<()> { - let address = state.config.endpoint; + let addr = state.config.endpoint; let events_subs = state.config.event_publisher.as_ref().map(|e| e.n_subscribers()).unwrap_or_default(); - info!(version = COMMIT_BOOST_VERSION, ?address, events_subs, chain =? state.config.chain, "starting PBS service"); + info!(version = COMMIT_BOOST_VERSION, ?addr, events_subs, chain =? state.config.chain, "starting PBS service"); let app = create_app_router::(state); - let listener = TcpListener::bind(address).await?; + let listener = TcpListener::bind(addr).await?; + + let task = + tokio::spawn( + async move { axum::serve(listener, app).await.wrap_err("PBS server exited") }, + ); + + // wait for the server to start + tokio::time::sleep(Duration::from_millis(250)).await; + let local_url = + Url::parse(&format!("http://{}{}{}", addr, BUILDER_API_PATH, GET_STATUS_PATH))?; + + let status = reqwest::get(local_url).await?; + if !status.status().is_success() { + bail!("PBS server failed to start. Are the relays properly configured?"); + } - axum::serve(listener, app).await.wrap_err("PBS server exited") + task.await? } pub fn register_metric(c: Box) { diff --git a/crates/pbs/src/state.rs b/crates/pbs/src/state.rs index 3defe1c7..6b3f15c9 100644 --- a/crates/pbs/src/state.rs +++ b/crates/pbs/src/state.rs @@ -1,50 +1,30 @@ -use std::{ - collections::HashSet, - sync::{Arc, Mutex}, -}; - -use alloy::{primitives::B256, rpc::types::beacon::BlsPublicKey}; +use alloy::rpc::types::beacon::BlsPublicKey; use cb_common::{ config::{PbsConfig, PbsModuleConfig}, - pbs::{BuilderEvent, GetHeaderResponse, RelayClient}, + pbs::{BuilderEvent, RelayClient}, }; -use dashmap::DashMap; -use uuid::Uuid; pub trait BuilderApiState: Clone + Sync + Send + 'static {} impl BuilderApiState for () {} -/// State for the Pbs module. It can be extended by adding extra data to the -/// state +/// Config for the Pbs module. It can be extended by adding extra data to the +/// state for modules that need it +// TODO: consider remove state from the PBS module altogether #[derive(Clone)] pub struct PbsState { /// Config data for the Pbs service pub config: PbsModuleConfig, /// Opaque extra data for library use pub data: S, - /// Info about the latest slot and its uuid - current_slot_info: Arc>, - /// Keeps track of which relays delivered which block for which slot - bid_cache: Arc>>, } impl PbsState<()> { pub fn new(config: PbsModuleConfig) -> Self { - Self { - config, - data: (), - current_slot_info: Arc::new(Mutex::new((0, Uuid::new_v4()))), - bid_cache: Arc::new(DashMap::new()), - } + Self { config, data: () } } pub fn with_data(self, data: S) -> PbsState { - PbsState { - data, - config: self.config, - current_slot_info: self.current_slot_info, - bid_cache: self.bid_cache, - } + PbsState { data, config: self.config } } } @@ -58,30 +38,18 @@ where } } - pub fn get_or_update_slot_uuid(&self, last_slot: u64) -> Uuid { - let mut guard = self.current_slot_info.lock().expect("poisoned"); - if guard.0 < last_slot { - // new slot - guard.0 = last_slot; - guard.1 = Uuid::new_v4(); - self.clear(last_slot); - } - guard.1 - } - - pub fn get_slot_and_uuid(&self) -> (u64, Uuid) { - let guard = self.current_slot_info.lock().expect("poisoned"); - *guard - } - // Getters pub fn pbs_config(&self) -> &PbsConfig { &self.config.pbs_config } - pub fn relays(&self) -> &[RelayClient] { - &self.config.relays + /// Returns all the relays (including those in muxes) + /// DO NOT use this through the PBS module, use + /// [`PbsState::mux_config_and_relays`] instead + pub fn all_relays(&self) -> &[RelayClient] { + &self.config.all_relays } + /// Returns the PBS config and relay clients for the given validator pubkey. /// If the pubkey is not found in any mux, the default configs are /// returned @@ -91,7 +59,8 @@ where ) -> (&PbsConfig, &[RelayClient], Option<&str>) { match self.config.muxes.as_ref().and_then(|muxes| muxes.get(pubkey)) { Some(mux) => (&mux.config, mux.relays.as_slice(), Some(&mux.id)), - None => (self.pbs_config(), self.relays(), None), + // return only the default relays if there's no match + None => (self.pbs_config(), &self.config.relays, None), } } @@ -102,35 +71,4 @@ where pub fn extra_validation_enabled(&self) -> bool { self.config.pbs_config.extra_validation_enabled } - - /// Add some bids to the cache, the bids are all assumed to be for the - /// provided slot Returns the bid with the max value - pub fn add_bids(&self, slot: u64, bids: Vec) -> Option { - let mut slot_entry = self.bid_cache.entry(slot).or_default(); - slot_entry.extend(bids); - slot_entry.iter().max_by_key(|bid| bid.value()).cloned() - } - - /// Retrieves a list of relays pubkeys that delivered a given block hash - /// Returns None if we dont have bids for the slot or for the block hash - pub fn get_relays_by_block_hash( - &self, - slot: u64, - block_hash: B256, - ) -> Option> { - self.bid_cache.get(&slot).and_then(|bids| { - let filtered: HashSet<_> = bids - .iter() - .filter(|&bid| (bid.block_hash() == block_hash)) - .map(|bid| bid.pubkey()) - .collect(); - - (!filtered.is_empty()).then_some(filtered) - }) - } - - /// Clear bids which are more than ~3 minutes old - fn clear(&self, last_slot: u64) { - self.bid_cache.retain(|slot, _| last_slot.saturating_sub(*slot) < 15) - } } diff --git a/crates/signer/Cargo.toml b/crates/signer/Cargo.toml index d69f3aac..9eba3fd7 100644 --- a/crates/signer/Cargo.toml +++ b/crates/signer/Cargo.toml @@ -7,6 +7,7 @@ publish = false [dependencies] cb-common.workspace = true +cb-metrics.workspace = true # ethereum alloy.workspace = true @@ -21,6 +22,7 @@ tokio.workspace = true # telemetry tracing.workspace = true +prometheus.workspace = true # crypto blst.workspace = true diff --git a/crates/signer/src/constants.rs b/crates/signer/src/constants.rs new file mode 100644 index 00000000..268cd2e2 --- /dev/null +++ b/crates/signer/src/constants.rs @@ -0,0 +1,3 @@ +pub const GET_PUBKEYS_ENDPOINT_TAG: &str = "get_pubkeys"; +pub const GENERATE_PROXY_KEY_ENDPOINT_TAG: &str = "generate_proxy_key"; +pub const REQUEST_SIGNATURE_ENDPOINT_TAG: &str = "request_signature"; diff --git a/crates/signer/src/lib.rs b/crates/signer/src/lib.rs index 982fb874..84bd08d9 100644 --- a/crates/signer/src/lib.rs +++ b/crates/signer/src/lib.rs @@ -1,3 +1,5 @@ +mod constants; pub mod error; pub mod manager; +mod metrics; pub mod service; diff --git a/crates/signer/src/metrics.rs b/crates/signer/src/metrics.rs new file mode 100644 index 00000000..85fa02b2 --- /dev/null +++ b/crates/signer/src/metrics.rs @@ -0,0 +1,34 @@ +//! Metrics for Signer module + +use axum::http::Uri; +use cb_common::commit::constants::{ + GENERATE_PROXY_KEY_PATH, GET_PUBKEYS_PATH, REQUEST_SIGNATURE_PATH, +}; +use lazy_static::lazy_static; +use prometheus::{register_int_counter_vec_with_registry, IntCounterVec, Registry}; + +use crate::constants::{ + GENERATE_PROXY_KEY_ENDPOINT_TAG, GET_PUBKEYS_ENDPOINT_TAG, REQUEST_SIGNATURE_ENDPOINT_TAG, +}; + +lazy_static! { + pub static ref SIGNER_METRICS_REGISTRY: Registry = + Registry::new_custom(Some("cb_signer".to_string()), None).unwrap(); + + /// Status code returned by endpoint + pub static ref SIGNER_STATUS: IntCounterVec = register_int_counter_vec_with_registry!( + "signer_status_code_total", + "HTTP status code returned by signer", + &["http_status_code", "endpoint"], + SIGNER_METRICS_REGISTRY + ).unwrap(); +} + +pub fn uri_to_tag(uri: &Uri) -> &str { + match uri.path() { + GET_PUBKEYS_PATH => GET_PUBKEYS_ENDPOINT_TAG, + GENERATE_PROXY_KEY_PATH => GENERATE_PROXY_KEY_ENDPOINT_TAG, + REQUEST_SIGNATURE_PATH => REQUEST_SIGNATURE_ENDPOINT_TAG, + _ => "unknown endpoint", + } +} diff --git a/crates/signer/src/service.rs b/crates/signer/src/service.rs index 14703a09..228158e9 100644 --- a/crates/signer/src/service.rs +++ b/crates/signer/src/service.rs @@ -24,13 +24,18 @@ use cb_common::{ constants::COMMIT_BOOST_VERSION, types::{Jwt, ModuleId}, }; +use cb_metrics::provider::MetricsProvider; use eyre::{Context, Result}; use headers::{authorization::Bearer, Authorization}; use tokio::{net::TcpListener, sync::RwLock}; use tracing::{debug, error, info, warn}; use uuid::Uuid; -use crate::{error::SignerModuleError, manager::SigningManager}; +use crate::{ + error::SignerModuleError, + manager::SigningManager, + metrics::{uri_to_tag, SIGNER_METRICS_REGISTRY, SIGNER_STATUS}, +}; /// Implements the Signer API and provides a service for signing requests pub struct SigningService; @@ -72,13 +77,15 @@ impl SigningService { info!(version = COMMIT_BOOST_VERSION, modules =? module_ids, port =? config.server_port, loaded_consensus, loaded_proxies, "Starting signing service"); let state = SigningState { manager: RwLock::new(manager).into(), jwts: config.jwts.into() }; + SigningService::init_metrics()?; let app = axum::Router::new() .route(REQUEST_SIGNATURE_PATH, post(handle_request_signature)) .route(GET_PUBKEYS_PATH, get(handle_get_pubkeys)) .route(GENERATE_PROXY_KEY_PATH, post(handle_generate_proxy)) .with_state(state.clone()) - .route_layer(middleware::from_fn_with_state(state.clone(), jwt_auth)); + .route_layer(middleware::from_fn_with_state(state.clone(), jwt_auth)) + .route_layer(middleware::from_fn(log_request)); let status_router = axum::Router::new().route(STATUS_PATH, get(handle_status)); let address = SocketAddr::from(([0, 0, 0, 0], config.server_port)); @@ -88,6 +95,10 @@ impl SigningService { .await .wrap_err("signer server exited") } + + fn init_metrics() -> Result<()> { + MetricsProvider::load_and_run(SIGNER_METRICS_REGISTRY.clone()) + } } /// Authentication middleware layer @@ -109,6 +120,14 @@ async fn jwt_auth( Ok(next.run(req).await) } +/// Requests logging middleware layer +async fn log_request(req: Request, next: Next) -> Result { + let url = &req.uri().clone(); + let response = next.run(req).await; + SIGNER_STATUS.with_label_values(&[response.status().as_str(), uri_to_tag(url)]).inc(); + Ok(response) +} + /// Status endpoint for the Signer API async fn handle_status() -> Result { Ok((StatusCode::OK, "OK")) diff --git a/docs/docs/developing/commit-module.md b/docs/docs/developing/commit-module.md index af47384e..e84a3143 100644 --- a/docs/docs/developing/commit-module.md +++ b/docs/docs/developing/commit-module.md @@ -6,11 +6,6 @@ sidebar_position: 2 While a module can be written in any language, we currently provide some utilities for Rust, with the goal of supporting more generalized APIs and simplify development in languages other than Rust. -:::note -Commit-Boost is still in alpha development, all APIs are subject to change -::: - - In Rust, we provide utilities to load and run modules. Simply add to your `Cargo.toml`: ```toml commit-boost = { git = "https://github.com/Commit-Boost/commit-boost-client", rev = "..." } @@ -125,4 +120,4 @@ All that is left is to use the metrics throughout your code: ```rust SIG_RECEIVED_COUNTER.inc(); ``` -These will be automatically scraped by the Prometheus service running, and exposed on port `9090`. We plan to allow developers to ship pre-made dashboards together with their modules, to allow Node Operators to have an improved oversight on the modules they are running. \ No newline at end of file +These will be automatically scraped by the Prometheus service running, and exposed on port `9090`. We plan to allow developers to ship pre-made dashboards together with their modules, to allow Node Operators to have an improved oversight on the modules they are running. diff --git a/docs/docs/developing/custom-modules.md b/docs/docs/developing/custom-modules.md index a15ce514..7282db70 100644 --- a/docs/docs/developing/custom-modules.md +++ b/docs/docs/developing/custom-modules.md @@ -2,10 +2,10 @@ sidebar_position: 1 --- # Custom Modules -Commit-Boost aims to provide an open platform for developers to create and distribute commitment protocols sidecars. +Commit-Boost aims to provide an open platform for developers to create and distribute commitment protocols sidecars. There are three ways to leverage Commit-Boost modularity: -1. Commit Modules, which request signatures from the proposer, e.g. for preconfirmations ([example](https://github.com/Commit-Boost/commit-boost-client/tree/78bdc47bf89082f4d1ea302f9a3f86f609966b28/examples/da_commit)) -2. PBS Modules, which tweak the default PBS Module with additional logic, e.g. verifying additional constraints in `get_header` ([example](https://github.com/Commit-Boost/commit-boost-client/tree/78bdc47bf89082f4d1ea302f9a3f86f609966b28/examples/status_api)) -3. PBS Events, which trigger based on the different events of the PBS lifecycle and can be used e.g. for monitoring and reporting ([example](https://github.com/Commit-Boost/commit-boost-client/tree/78bdc47bf89082f4d1ea302f9a3f86f609966b28/examples/builder_log)) +1. Commit Modules, which request signatures from the proposer, e.g. for preconfirmations ([example](https://github.com/Commit-Boost/commit-boost-client/tree/78bdc47bf89082f4d1ea302f9a3f86f609966b28/examples/da_commit)). +2. PBS Modules, which tweak the default PBS Module with additional logic, e.g. verifying additional constraints in `get_header` ([example](https://github.com/Commit-Boost/commit-boost-client/tree/78bdc47bf89082f4d1ea302f9a3f86f609966b28/examples/status_api)). +3. PBS Events, which trigger based on the different events of the PBS lifecycle and can be used e.g. for monitoring and reporting ([example](https://github.com/Commit-Boost/commit-boost-client/tree/78bdc47bf89082f4d1ea302f9a3f86f609966b28/examples/builder_log)). diff --git a/docs/docs/get_started/configuration.md b/docs/docs/get_started/configuration.md index 638c7859..36462642 100644 --- a/docs/docs/get_started/configuration.md +++ b/docs/docs/get_started/configuration.md @@ -4,11 +4,10 @@ description: Configure Commit-Boost # Configuration -Commit-Boost needs a configuration file detailing all the services that you want to run. Create a `cb-config.toml` and adjust it depending on which modules you plan to run. +Commit-Boost needs a configuration file detailing all the services that you want to run. Create a `cb-config.toml` and modify it depending on which modules you plan to run. -For a full explanation of all the fields, check out [here](https://github.com/Commit-Boost/commit-boost-client/blob/main/config.example.toml). - -For some additional examples on config presets, check out [here](https://github.com/Commit-Boost/commit-boost-client/tree/main/configs). +- For a full explanation of all the fields, check out [here](https://github.com/Commit-Boost/commit-boost-client/blob/main/config.example.toml). +- For some additional examples on config presets, check out [here](https://github.com/Commit-Boost/commit-boost-client/tree/main/configs). ## Minimal PBS setup on Holesky ```toml @@ -27,7 +26,9 @@ prometheus_config = "./docker/prometheus.yml" You can find a list of MEV-Boost Holesky relays [here](https://www.coincashew.com/coins/overview-eth/mev-boost/mev-relay-list#holesky-testnet-relays). After the sidecar is started, it will expose a port (`18550` in this example), that you need to point your CL to. This may be different depending on which CL you're running, check out [here](https://docs.flashbots.net/flashbots-mev-boost/getting-started/system-requirements#consensus-client-configuration-guides) for a list of configuration guides. -Note that in this setup, the signer module will not be started. +:::note +In this setup, the signer module will not be started. +::: ## Signer module @@ -131,6 +132,7 @@ We currently support Lighthouse, Prysm, Teku and Lodestar's keystores so it's ea #### Config: ```toml + [signer] [signer.local.loader] format = "lodestar" keys_path = "keys" @@ -188,7 +190,7 @@ To persist proxy keys across restarts, you must enable the proxy store in the co
ERC2335 - The keys are stored in a ERC-2335 style keystore, among with a password. This way, you can safely share the keys directory so without the password they are useless. + The keys are stored in a ERC-2335 style keystore, along with a password. This way, you can safely share the keys directory as without the password they are useless. #### File structure @@ -279,7 +281,7 @@ A few things to note: To learn more about developing modules, check out [here](/category/developing). ## Vouch -[Vouch](https://github.com/attestantio/vouch) is a multi-node validator client built by [Attestant](https://www.attestant.io/). Vouch is particular in that it also integrates a MEV-Boost client to interact with relays. The Commit-Boost PBS module is compatible with the Vouch `blockrelay` since it implements the Builder-API, just like relays do. For example, depending on your setup and preference, you may want to fetch headers from a given relay using Commit-Boost vs using the built-in Vouch `blockrelay`. +[Vouch](https://github.com/attestantio/vouch) is a multi-node validator client built by [Attestant](https://www.attestant.io/). Vouch is particular in that it also integrates an MEV-Boost client to interact with relays. The Commit-Boost PBS module is compatible with the Vouch `blockrelay` since it implements the same Builder-API as relays. For example, depending on your setup and preference, you may want to fetch headers from a given relay using Commit-Boost vs using the built-in Vouch `blockrelay`. ### Configuration Get familiar on how to set up Vouch [here](https://github.com/attestantio/vouch/blob/master/docs/getting_started.md). @@ -297,12 +299,14 @@ Modify the `blockrelay.config` file to add Commit-Boost: } ``` -#### Beacon Node to Commit Boost +#### Beacon Node to Commit-Boost In this setup, the BN Builder-API endpoint will be pointing to the PBS module (e.g. for Lighthouse you will need the flag `--builder=http://127.0.0.0:18550`). This will bypass the `blockrelay` entirely so make sure all relays are properly configured in the `[[relays]]` section. -**Note**: this approach could also work if you have a multi-beacon-node setup, where some BNs fetch directly via Commit-Boost while others go through the `blockrelay`. +:::note +This approach could also work if you have a multi-beacon-node setup, where some BNs fetch directly via Commit-Boost while others go through the `blockrelay`. +::: ### Notes - It's up to you to decide which relays will be connected via Commit-Boost (`[[relays]]` section in the `toml` config) and which via Vouch (additional entries in the `relays` field). Remember that any rate-limit will be shared across the two sidecars, if running on the same machine. diff --git a/docs/docs/get_started/overview.md b/docs/docs/get_started/overview.md index 49c6784b..d3a094b3 100644 --- a/docs/docs/get_started/overview.md +++ b/docs/docs/get_started/overview.md @@ -4,16 +4,12 @@ description: Initial setup # Overview -:::warning -Commit-Boost is currently in alpha development and **NOT** ready for production use. Please use caution -::: - Commit-Boost is primarily based on [Docker](https://www.docker.com/) to enable modularity, sandboxing and cross-platform compatibility. It is also possible to run Commit-Boost [natively](/get_started/running/binary) without Docker. Each component roughly maps to a container: from a single `.toml` config file, the node operator can specify which modules they want to run, and Commit-Boost takes care of spinning up the services and creating links between them. Commit-Boost ships with two core modules: -- a PBS module which implements the [BuilderAPI](https://ethereum.github.io/builder-specs/) for [MEV Boost](https://docs.flashbots.net/flashbots-mev-boost/architecture-overview/specifications) -- a signer module, which implements the [Signer API](/api) and provides the interface for modules to request proposer commitments +- A PBS module which implements the [BuilderAPI](https://ethereum.github.io/builder-specs/) for [MEV Boost](https://docs.flashbots.net/flashbots-mev-boost/architecture-overview/specifications). +- A signer module, which implements the [Signer API](/api) and provides the interface for modules to request proposer commitments. ## Setup @@ -21,17 +17,17 @@ The Commit-Boost CLI creates a dynamic `docker-compose` file, with services and Whether you're using Docker or running the binaries natively, you can compile from source directly from the repo, or download binaries and fetch docker images from the official releases. -### Binaries and images +## Binaries and images Find the latest releases at https://github.com/Commit-Boost/commit-boost-client/releases. The modules are also published at [each release](https://github.com/orgs/Commit-Boost/packages?repo_name=commit-boost-client). ### From source -Requirements: -- Rust 1.80 +Requirements: +- Rust 1.83 :::note -run `rustup update` to update Rust and Cargo to the latest version +Run `rustup update` to update Rust and Cargo to the latest version ::: ```bash @@ -46,7 +42,7 @@ git checkout stable If you get an `openssl` related error try running: `apt-get update && apt-get install -y openssl ca-certificates libssl3 libssl-dev build-essential pkg-config` ::: -#### Docker +### Docker You will need to build the CLI to create the `docker-compose` file: ```bash @@ -57,7 +53,7 @@ cargo build --release --bin commit-boost-cli ./target/release/commit-boost-cli --version ``` -and the modules as Docker images +and the modules as Docker images: ```bash bash scripts/build_local_images.sh ``` @@ -68,7 +64,7 @@ If you require `sudo` access to run Docker, you will need `sudo` to run some of This will create two local images called `commitboost_pbs_default` and `commitboost_signer` for the Pbs and Signer module respectively. Make sure to use these images in the `docker_image` field in the `[pbs]` and `[signer]` sections of the `.toml` config file, respectively. -#### Binaries +### Binaries Alternatively, you can also build the modules from source and run them without Docker, in which case you can skip the CLI and only compile the modules: diff --git a/docs/docs/get_started/running/binary.md b/docs/docs/get_started/running/binary.md index 2c93d3f2..458b08de 100644 --- a/docs/docs/get_started/running/binary.md +++ b/docs/docs/get_started/running/binary.md @@ -5,7 +5,7 @@ description: Run Commit-Boost modules natively # Binary :::warning -Running the modules natively means you opt out of the security guarantees made by Docker and it's up to you how to setup and ensure the modules run safely +Running the modules natively means you opt out of the security guarantees made by Docker and it's up to you how to setup and ensure the modules run safely. ::: @@ -15,35 +15,34 @@ Get the binary of the module either by compiling from source or by downloading a Modules need some environment variables to work correctly. ### Common -- `CB_CONFIG`: required, path to the `toml` config file -- `CHAIN_SPEC_ENV`: optional, path to a chain spec file. This will override the `[chain]` field in the `toml` config -- `CB_METRICS_PORT`: optional, port where to expose the `/metrics` endpoint for Prometheus -- `CB_LOGS_DIR`: optional, directory to store logs. This will override the directory in the `toml` config +- `CB_CONFIG`: required, path to the `.toml` config file. +- `CHAIN_SPEC_ENV`: optional, path to a chain spec file. This will override the `[chain]` field in the `.toml` config. +- `CB_METRICS_PORT`: optional, port where to expose the `/metrics` endpoint for Prometheus. +- `CB_LOGS_DIR`: optional, directory to store logs. This will override the directory in the `.toml` config. ### PBS Module -- `CB_BUILDER_URLS`: optional, comma-separated list of urls to `events` modules where to post builder events -- `CB_PBS_ENDPOINT`: optional, override the endpoint where the PBS module will open the port for the beacon node -- `CB_MUX_PATH_{ID}`: optional, override where to load mux validator keys for mux with id=\{ID\} -### Signer Module -- `CB_JWTS`: required, comma-separated list of `MODULE_ID=JWT` to process signature requests -- `CB_SIGNER_PORT`: required, port to open the signer server on -For loading keys we currently support: - - `CB_SIGNER_LOADER_FILE`: path to a `.json` with plaintext keys (for testing purposes only) - - `CB_SIGNER_LOADER_FORMAT`, `CB_SIGNER_LOADER_KEYS_DIR` and `CB_SIGNER_LOADER_SECRETS_DIR`: paths to the `keys` and `secrets` directories or files (ERC-2335 style keystores, see [Signer config](../configuration/#signer-module) for more info) -For storing proxy keys we currently support: - - `CB_PROXY_STORE_DIR`: directory where proxy keys and delegations will be saved in plaintext (for testing purposes only) - - `CB_PROXY_KEYS_DIR` and `CB_PROXY_SECRETS_DIR`: paths to the `keys` and `secrets` directories (ERC-2335 style keystores, see [Signer config](../configuration#proxy-keys-store) for more info) +- `CB_BUILDER_URLS`: optional, comma-separated list of urls to `events` modules where to post builder events. +- `CB_PBS_ENDPOINT`: optional, override the endpoint where the PBS module will open the port for the beacon node. +- `CB_MUX_PATH_{ID}`: optional, override where to load mux validator keys for mux with `id=\{ID\}`. +### Signer Module +- `CB_JWTS`: required, comma-separated list of `MODULE_ID=JWT` to process signature requests. +- `CB_SIGNER_PORT`: required, port to open the signer server on. +- For loading keys we currently support: + - `CB_SIGNER_LOADER_FILE`: path to a `.json` with plaintext keys (for testing purposes only). + - `CB_SIGNER_LOADER_FORMAT`, `CB_SIGNER_LOADER_KEYS_DIR` and `CB_SIGNER_LOADER_SECRETS_DIR`: paths to the `keys` and `secrets` directories or files (ERC-2335 style keystores, see [Signer config](../configuration/#signer-module) for more info). +- For storing proxy keys we currently support: + - `CB_PROXY_STORE_DIR`: directory where proxy keys and delegations will be saved in plaintext (for testing purposes only). ### Modules -- `CB_MODULE_ID`: required, unique id of the module +- `CB_MODULE_ID`: required, unique id of the module. #### Commit modules -- `CB_SIGNER_URL`: required, url to the signer module server -- `CB_SIGNER_JWT`: required, jwt to use to for signature requests (needs to match what is in `CB_JWTS`) +- `CB_SIGNER_URL`: required, url to the signer module server. +- `CB_SIGNER_JWT`: required, jwt to use for signature requests (needs to match what is in `CB_JWTS`). #### Events modules -- `CB_BUILDER_PORT`: required, port to open to receive builder events from the PBS module +- `CB_BUILDER_PORT`: required, port to open to receive builder events from the PBS module. Modules might also have additional envs required, which should be detailed by the maintainers. diff --git a/docs/docs/get_started/running/docker.md b/docs/docs/get_started/running/docker.md index 3dd1473d..6646c196 100644 --- a/docs/docs/get_started/running/docker.md +++ b/docs/docs/get_started/running/docker.md @@ -3,7 +3,7 @@ description: Run Commit-Boost with Docker --- # Docker -The Commit-Boost CLI will generate a dynamic `docker-compose.yml` file using the provided `toml` config file. This is the recommended approach as Docker provides sandboxing of the containers from the rest of your system. +The Commit-Boost CLI will generate a dynamic `docker-compose.yml` file using the provided `.toml` config file. This is the recommended approach as Docker provides sandboxing of the containers from the rest of your system. ## Init @@ -12,9 +12,9 @@ First run: commit-boost-cli init --config cb-config.toml ``` This will create up to 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, only created if the signer module is enabled -- `target.json`, which enables dynamic discovery of services for metrics scraping via Prometheus, only created if metrics are enabled +- `cb.docker-compose.yml` which contains the full setup of the Commit-Boost services. +- `.cb.env` with local env variables, including JWTs for modules, only created if the signer module is enabled. +- `target.json` which enables dynamic discovery of services for metrics scraping via Prometheus, only created if metrics are enabled. ## Start diff --git a/docs/docs/get_started/troubleshooting.md b/docs/docs/get_started/troubleshooting.md index 964167bd..7dc9f648 100644 --- a/docs/docs/get_started/troubleshooting.md +++ b/docs/docs/get_started/troubleshooting.md @@ -4,7 +4,7 @@ description: Common issues # Troubleshooting -Commit-Boost is currently in alpha development so it's likely there are bugs, if you find any or have any question, please reach out on [X (Twitter)](https://x.com/Commit_Boost) or [Telegram](https://t.me/+Pcs9bykxK3BiMzk5). +Commit-Boost was recently audited and going through a phased approach for validators to move to production. If you find any or have any question, please reach out on [X (Twitter)](https://x.com/Commit_Boost) or [Telegram](https://t.me/+Pcs9bykxK3BiMzk5). If there are any security related items, please see [here](https://github.com/Commit-Boost/commit-boost-client/blob/main/SECURITY.md). If you started the modules correctly you should see the following logs. @@ -65,4 +65,4 @@ This will only happen if you received a header in the previous call, and if the ```bash 2024-09-16T14:38:01.409075Z INFO submit_blinded_block{req_id=6eb9a04d-6f79-4295-823f-c054582b3599 slot=2549590}: ua="Lighthouse/v5.2.1-9e12c21" slot_uuid=16186e06-0cd0-47bc-9758-daa1b66eff5c ms_into_slot=1409 block_hash=0xfa135ae6f2bfb32b0a47368f93d69e0a2b3f8b855d917ec61d78e78779edaae6 2024-09-16T14:38:02.910974Z INFO submit_blinded_block{req_id=6eb9a04d-6f79-4295-823f-c054582b3599 slot=2549590}: received unblinded block -``` \ No newline at end of file +``` diff --git a/docs/docs/intro.md b/docs/docs/intro.md index dd77731d..0da07657 100644 --- a/docs/docs/intro.md +++ b/docs/docs/intro.md @@ -6,6 +6,21 @@ slug: / # Introduction -![Commit Boost Logo](/img/logo.jpg) +import CommitBoostLogo from '/img/logo.png'; +import Overview from '/img/overview.png'; -Due to the risks developing for Ethereum, core development, and its validators set, a group of teams / individuals are working on developing a public good called Commit-Boost. Commit-Boost is an open-source public good that is fully compatible with [MEV-Boost](https://github.com/flashbots/mev-boost), but acts as a light-weight validator platform to safely make commitments. Specifically, Commit-Boost is a new Ethereum validator sidecar focused on standardizing the last mile of communication between validators and third-party protocols. It's being developed in Rust from scratch, and has been designed with safety and modularity at its core, with the goal of not limiting the market downstream including stakeholders, flows, proposer commitments, enforcement mechanisms, etc. +Commit Boost Logo + +
+
+ +Commit-Boost is a new Ethereum validator sidecar focused on standardizing the communication between validators and third-party protocols. This open-source public good is fully compatible with [MEV-Boost](https://github.com/flashbots/mev-boost) and acts as a light-weight platform to allow validators to safely make commitments. + +Commit-Boost runs as a single sidecar composed of multiple modules: + +Commit Boost Overview + +
+
+ +Commit-Boost is being developed in Rust from scratch, and has been designed with safety and modularity at its core, with the goal of not limiting the market downstream including stakeholders, flows, proposer commitments, enforcement mechanisms, etc. diff --git a/docs/docs/overview.md b/docs/docs/overview.md index 7e821c50..5005bda8 100644 --- a/docs/docs/overview.md +++ b/docs/docs/overview.md @@ -5,31 +5,31 @@ sidebar_position: 2 # Overview ## Background -- Proposer commitments have been an important part of Ethereum’s history. Today, we already see the power of commitments where over 90% of validators give up their autonomy and make a wholesale commitment that outsources block building to a sophisticated actor called a block builder -- However, most are starting to agree on a common denominator: in the future, beacon proposers will face a broader set of options of what they may “commit" to–be it inclusions lists or preconfs or other types of commitments such as long-dated blockspace futures–compared to just an external or local payload they see today -- A recent post from Barnabe captures this well; during block construction, the validator “…creates the specs, or the template, by which the resulting block must be created, and the builders engaged by the proposer are tasked with delivering the block according to its specifications” -- While this all seems great, the challenge is that many teams building commitments are creating new sidecars driving fragmentation and risks for Ethereum -- For Ethereum, there are going to be significant challenges and increased risks during upgrades if there are a handful of sidecars validators are running -- For validators, these risks potentially take us to a world where proposers will need to make decisions on which teams to “bet on” and which sidecars they will need to run to participate in what those teams are offering -- For homestakers, this is difficult and they likely will be unable to participate in more than one of these commitments -- For sophisticated actors, this increases the attack vector and operational complexity as more and more sidecars are required to be run -- Another side effect of this is validators are somewhat locked into using a specific sidecar due to limited operational capacity and the switching costs of running a different sidecar (i.e., vendor lock-in). The higher the switching costs, the more embedded network effects could become if these sidecars only support certain downstream actors / proposer commitment protocols -- This also could create a dynamic where core out-of-protocol infrastructure supporting Ethereum which should be a public good, starts being used for monetization, distribution, or other purposes -- Commit-Boost aims to standardize how proposer commitment protocols communicate with the proposer, by providing a unified interface implemented in a single validator sidecar with the goal of reducing fragmentations +- Proposer commitments have been an important part of Ethereum’s history. Today, we already see the power of commitments where over 90% of validators give up their autonomy and make a wholesale commitment that outsources block building to a sophisticated actor called a block builder. +- However, most are starting to agree on a common denominator: in the future, beacon proposers will face a broader set of options of what they may “commit" to–be it inclusions lists or preconfs or other types of commitments such as long-dated blockspace futures–compared to just an external or local payload they see today. +- A recent post from Barnabe captures this well; during block construction, the validator “…creates the specs, or the template, by which the resulting block must be created, and the builders engaged by the proposer are tasked with delivering the block according to its specifications”. +- While this all seems great, the challenge is that many teams building commitments are creating new sidecars driving fragmentation and risks for Ethereum. +- For Ethereum, there are going to be significant challenges and increased risks during upgrades if there are a handful of sidecars validators are running. +- For validators, these risks potentially take us to a world where proposers will need to make decisions on which teams to “bet on” and which sidecars they will need to run to participate in what those teams are offering. +- For homestakers, this is difficult and they likely will be unable to participate in more than one of these commitments. +- For sophisticated actors, this increases the attack vector and operational complexity as more and more sidecars are required to be run. +- Another side effect of this is validators are somewhat locked into using a specific sidecar due to limited operational capacity and the switching costs of running a different sidecar (i.e., vendor lock-in). The higher the switching costs, the more embedded network effects could become if these sidecars only support certain downstream actors / proposer commitment protocols. +- This also could create a dynamic where core out-of-protocol infrastructure supporting Ethereum which should be a public good, starts being used for monetization, distribution, or other purposes. +- Commit-Boost aims to standardize how proposer commitment protocols communicate with the proposer, by providing a unified interface implemented in a single validator sidecar with the goal of reducing fragmentation. ## Goals -- Unify behind a software / standard to reduce fragmentation risks for Ethereum and its validators, while ensuring open innovation downstream from the proposer can flourish -- Create a neutral, open-source, public good for the safe development and distribution of proposer commitments protocols -- Provide a well-tested, reliable validator sidecar with support for advanced observability and telemetry +- Unify behind a software / standard to reduce fragmentation risks for Ethereum and its validators, while ensuring open innovation downstream from the proposer can flourish. +- Create a neutral, open-source, public good for the safe development and distribution of proposer commitments protocols. +- Provide a well-tested, reliable validator sidecar with support for advanced observability and telemetry. ## Why Commit-Boost? ### For validators -- Run a single sidecar with support for MEV-Boost and other proposer commitments protocols, such as preconfirmations and inclusion lists -- Out-of-the-box support for metrics reporting and dashboards to have clear insight into what is happening in your validator -- Plug-in system to add custom modules, e.g. receive a notification on Telegram if a relay fails to deliver a block +- Run a single sidecar with support for MEV-Boost and other proposer commitments protocols, such as preconfirmations and inclusion lists. +- Out-of-the-box support for metrics reporting and dashboards to have clear insight into what is happening in your validator. +- Plug-in system to add custom modules, e.g. receive a notification on Telegram if a relay fails to deliver a block. ### For developers -- A modular platform to develop and distribute proposer commitments protocols -- A single API to interact with validators -- Support for hard-forks and new protocol requirements +- A modular platform to develop and distribute proposer commitments protocols. +- A single API to interact with validators. +- Support for hard-forks and new protocol requirements. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index e1ad3486..f78ae69a 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -59,12 +59,12 @@ const config = { /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ // Replace with your project's social card - image: 'img/logo.jpg', + image: 'img/icon.png', navbar: { title: 'Commit Boost', logo: { - alt: 'Commit Boost Logo', - src: 'img/logo.jpg', + alt: 'Commit Boost Icon', + src: 'img/icon.png', }, items: [ { to: '/', label: 'Docs', position: 'left' }, @@ -111,6 +111,7 @@ const config = { prism: { theme: prismThemes.github, darkTheme: prismThemes.dracula, + additionalLanguages: ['bash','toml'], }, }), }; diff --git a/docs/package-lock.json b/docs/package-lock.json index c977bf55..d31e543b 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -2946,6 +2946,13 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -3234,12 +3241,13 @@ } }, "node_modules/@swagger-api/apidom-ast": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-alpha.6.tgz", - "integrity": "sha512-uzDNIeTLFeITzK7yX9PSsu3dl92rHP/gKMNAlJhmDRr7r+OLr5dCpAzyZ0WvONRxjxR8Otj5LX4AD12+EX32fg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-beta.6.tgz", + "integrity": "sha512-AAxEN/xTcH/ORpn/zEEuPPgtqX6/Q9EZC8RX2R7AlRdUeGZieE9OZ91mXYrg48FcHWi/xwWYqkPPHjyXTQkfww==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-error": "^1.0.0-alpha.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -3247,13 +3255,14 @@ } }, "node_modules/@swagger-api/apidom-core": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-alpha.6.tgz", - "integrity": "sha512-5u7dK3+8cF2h5bHEI/qrA6JrfXX+HIHSmUgPGbeMAqSCEfpsjnsngXK6gHtd4ktLlPz3TplNZAQl88wIp+39nw==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-beta.6.tgz", + "integrity": "sha512-gmHpE5+wJgUmpkb0C3ZIM6VsMXj0heujwQeXqEcFRkp1d0u4crCNmQ5iPTewzvILcnMbxac0AUFFKuJbBpqzPg==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.6", - "@swagger-api/apidom-error": "^1.0.0-alpha.6", + "@swagger-api/apidom-ast": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", @@ -3263,36 +3272,39 @@ } }, "node_modules/@swagger-api/apidom-error": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-alpha.6.tgz", - "integrity": "sha512-eOcqaXwLitjp5CIGYR0W2oM6p4UiTL7EjNdkCcfrELKHdgNS6U7kZdl3KCBlOuMb14CijwtZNEJbIGhhGZUYHg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-beta.6.tgz", + "integrity": "sha512-bLttwjXj0u9pHIzc71L5rZWvhtcPFmGdvPDpXMoK4XOjmfpw9hqQKg1DGWKQHxNiMP/zlWAWO1RxjFQNYcO70g==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7" } }, "node_modules/@swagger-api/apidom-json-pointer": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-alpha.6.tgz", - "integrity": "sha512-8ULBcQRQ1UPgqJ+ZuuKjmeKeuxqbuIUHwWHRRA848jK5+IHmNw/Cp68MhNiwYXLmTLkTIGaDubcOplMeHCxSyA==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-beta.6.tgz", + "integrity": "sha512-9XdWnouDGnn8UCr48TgtB16e4s37L7ibWFFgn4ercSkUMsJKMzHULabZ005IKVfP20UbhdIa5/r2W/i8iRk8Vg==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-error": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-alpha.6.tgz", - "integrity": "sha512-JRiImw3XKrfm22pzlx7uM6XYJtWM71QkCLy86gOTBFybWgTOCECnN4c8jFBnYl6KYuIb2VV9kXZs38xjK4NfBQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-beta.6.tgz", + "integrity": "sha512-Qycf1LbBP5KxtxCeXHIAKazekKnz8kOHfnn2JT/FkWojM4reTECHBMi40DwQOQbj1CsWSasoTbnKjG64BxoJRg==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-error": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -3300,14 +3312,15 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-alpha.6.tgz", - "integrity": "sha512-I8Yq+AmJPUJihGneBv1/m/ly+2dp4FJiCxW/auRQSicvYIV7hoBO5qGZqcEEoVt7OpuhFbFqI2pwnambz90Uvg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-beta.6.tgz", + "integrity": "sha512-bQ0eNdDYrrkr4Y4iyUcgXiYBFzj+wwJiBGKI8OBJ9hTVEDbDCb/8ZzlZw3wMQNGFMw6/NC2F6MEbocApDx9vnQ==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -3315,13 +3328,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-alpha.6.tgz", - "integrity": "sha512-E8JjqdDgopnLd4HXEXGSrc6rkbDyB8Qk6sYgmyT6lB8caFUMRdJ5Rp57fPePETnVpegb8cAuKjBdjTImX1gQ3Q==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-beta.6.tgz", + "integrity": "sha512-Cn4+CH8ZqniejbmbD7nfUzw/N+S9lwGztOB5ZSoS23r1/mFzcya/bTOSuUW6BJ4Pa1L+AvUWhqmRlzG66Ta0gA==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.6", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", + "@swagger-api/apidom-ast": "^1.0.0-beta.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -3329,15 +3343,16 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-alpha.6.tgz", - "integrity": "sha512-uzYmV65nn7i6nlp7Kp7ldGfAoXWPPquIocoHLWDBTx5sPdS+ALu2T2yvytav0z6StKeV+gU2HZjMLVRWdLzLZA==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-beta.6.tgz", + "integrity": "sha512-zwD2cKjbXBynMNFAyXHLsNz16Wbd4SOSehAZ1WJcWTJflC0GVk0kkFmzGFz92WI0YQihnrYwrAhpmZohUlHUWg==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-error": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -3345,15 +3360,16 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-alpha.6.tgz", - "integrity": "sha512-dWEVUVMByOs5JIMsgcceETOYH3nTiAHoIIjXbYeHP6m6HaNP8IE5ex0ZgfmQc29uH0E6H+6aYAv1flfvy56rVQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-beta.6.tgz", + "integrity": "sha512-T1LMWiHitPJt9pM4G4FTPaGJntW8x6v/Y6236dEt8gO5aw5T3528PtaqEGfmI4uIvJO4dBwrobEte9GUXWVxig==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-error": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -3361,15 +3377,16 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-2": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-alpha.6.tgz", - "integrity": "sha512-sPwvOY+FGd5yEAijYLupmIYwf4HIpW6yegzrz6uUvGmONZpiCNIidCu+2m6GyYCoZ/lQZdPMw29DuU2O4iiDKw==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-beta.6.tgz", + "integrity": "sha512-SY+h67maS88egPr9o7E8yep2xdw4N/vRYO1vCRcX4Y6UfFpiAn3jSKxQkOP983DJGXwDLVirVML/ezb9VXbnDg==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-error": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -3377,14 +3394,15 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-alpha.6.tgz", - "integrity": "sha512-kE4s17j69DDvXrf7xeRTunmSQJLiX52fCX1YnfC81e1IPm3q/mdpkZiysM87FuJQQj522fX2G+QUIJlDkD5U9w==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-beta.6.tgz", + "integrity": "sha512-fqsF35X8O2yaENr74wbZtPqSgiuuomu9mT9KKj9P7z6in6SjBSTMMmGkbsjximdr+hVCrNm8ActDF1HRq3av7Q==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-error": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -3392,15 +3410,16 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-alpha.6.tgz", - "integrity": "sha512-2QA2z9beyaVyZDOXbLg4Nu8o8xKWo9L0WHWOP+hg/haGRyyPHXgyg2XdwRuFBozBI9wBaIfEg1lvNC+J0taDjg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-beta.6.tgz", + "integrity": "sha512-GOtloezNXZExvhmSp5OT2NO7XLMwUY12stXUWl0bWR3O/6I6U522JFgoO9SHKxuSed5ateJpE7eR39HCJ/pyOQ==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.6", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.6", + "@swagger-api/apidom-ast": "^1.0.0-beta.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -3408,14 +3427,15 @@ } }, "node_modules/@swagger-api/apidom-ns-workflows-1": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-workflows-1/-/apidom-ns-workflows-1-1.0.0-alpha.6.tgz", - "integrity": "sha512-9kXU7hUdz25TTGF8b1pmKGugkET4gkW7ING+qSUjU5nWdrkdUIVuq1o8qjaZwRDRvkNynnlRbWHqXeWgRWyi/w==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-workflows-1/-/apidom-ns-workflows-1-1.0.0-beta.6.tgz", + "integrity": "sha512-5ViXxpioBNfkJJyGmgbp76OyvY3IRsfNwN9tXTl39vgpyPnQVtBPwhKwuViiqDr+GmyZgMCotB3QlYPNcxqEoA==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -3423,263 +3443,323 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-alpha.6.tgz", - "integrity": "sha512-7THBmhvwTmsb1eFXvj/tbIK91g5tzkvhxGSUVbpGt1zApEFmKvjZbDhGnMx15CImIUURW1QZ6TQ/cZ7jRWk8kQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-beta.6.tgz", + "integrity": "sha512-HLcCDO7QdBjPFQ/Mf4XmG0qcmwW+AnDZyPYzMOAyK1hU3xwQjAIn5zOlgp0feTe3vNUMzNY1NDHvCeDXSbN5sQ==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.6", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-alpha.6.tgz", - "integrity": "sha512-xD0aRgRGPaM1J+H3nRg8qP6bQ4fNtsUopoc6JEKzi7NJxd+r/mZV4pVa+Gr6CS+xv4d6TJ53UCJmGsjgmR1bQw==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-beta.6.tgz", + "integrity": "sha512-jL2fZv1a+3S6SiIVYc3kC0NAAk8bszNGcVTsBV8ehHgZxc0I+EANEJwgZE/YOcL3TlNEFscfjUcGhjyWkEQksQ==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.6", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-alpha.6.tgz", - "integrity": "sha512-BVouq+7XiS2/HmNHd/CHHieyRT5mTN+kqYACnKV/TAzC5+fK3t2mcdng4I81m3Mzb9OJ/VpHiEVlSZiWZoPU/Q==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-beta.6.tgz", + "integrity": "sha512-hwSOnUwfZ78+wHXsokB/ho6xOgxK0qnWviSj1QkLvd2bomfP6RM0d4Uk19ND/Mh39oDXDwxiQ7jXHQsU8/Tq/g==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.6", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-alpha.6.tgz", - "integrity": "sha512-CsUu5t6ijflz0DDjdoxE/OUbSjBAeh5v2zfMRVOfGdnNDhDhrE/3P0VTpdKdVmbWQ1ueIbq2QaC8thQ+Jcxwyg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-beta.6.tgz", + "integrity": "sha512-NecW+P4oUgioPW/l1Ang6S76v26QevjTDls+5p0I9a7Kyln8xHbfzYOGH9AEopeygZmhaburC/TO6ochxBZqkw==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.6", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-alpha.6.tgz", - "integrity": "sha512-ruEkgvJSmBUUsGZdYiHeczekTWCJSWHrNvhAczY6c1ZFhpCukZg9tCqdVhnni/LPp4r4h7BdNldjY7dtrUkCiQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-beta.6.tgz", + "integrity": "sha512-a2ymHU7BJ11XcZvNpghmUjsyxa+hwf2Jt7MgLIKQGg6Kmnx+pHesx1/ZlqqvhkaKk6ZXbefpK7PTOBcGRerjlQ==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.6", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-error": "^1.0.0-alpha.6", + "@swagger-api/apidom-ast": "^1.0.0-beta.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.20.4", - "tree-sitter-json": "=0.20.2", - "web-tree-sitter": "=0.20.3" + "tree-sitter": "=0.22.1", + "tree-sitter-json": "=0.24.8", + "web-tree-sitter": "=0.24.5" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-json/node_modules/tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-alpha.6.tgz", - "integrity": "sha512-RLvjHvjURnqfWxEdLFOW6agBS8CzVyV9++Vg4TSB9gPCNsTlz5w9iy82NYvApExHJIlN55Ga92OZ6CuWXJ8iKw==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-beta.6.tgz", + "integrity": "sha512-NgbHpVUMqE81f6rDPU9bO0qbWmiwu7FlrFvBwePktZTbbFaxwt73jFQpqyzKmIumNrg/mCckxzTrbSEW7k85Vw==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.6", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-alpha.6.tgz", - "integrity": "sha512-cf9+M9vySTrUZW+m2SR04IMnl+5QX6P7S2xgFF705ySOMkPiA9GTgAZJFqwzncAEPovkp7/A24adxyhFz52iZg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-beta.6.tgz", + "integrity": "sha512-cnFcTkzN7xAr6Zal5UnzRRkQpSe3fI910bYs9mjNMUYReo5D+hUyL16PtOf832Qa8vyDlU3WBHqAQuOEk1fepA==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.6", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-alpha.6.tgz", - "integrity": "sha512-Z7TCUWB/VotmHU5kjUcAlu3qMHCVr1pOpnsuI01I6vCHGJOqUZPelnNqVyw5tjiVbgwDCKzXiPSQo9gGG1HoGA==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-beta.6.tgz", + "integrity": "sha512-xkqyXhLWg6iWyriH/t/am3CHFTZOSIUrNP7uSZBHoD6PbvDArYSB+/gtnO7e/NphSSOkqlkRC4+7VTybA9LK+A==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.6", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-alpha.6.tgz", - "integrity": "sha512-XI0qlTjL2Q1TMvzxjjEki2iuJqt43C0mwGHremjcpbNHpJejnkEGFDPJqs1rp3RobwRl1ftHVFJi7JVPiA8Zvw==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-beta.6.tgz", + "integrity": "sha512-M91gx/QpM6xSf4m2k/OYaPw8Hapir+6KJMEIcLV8aP6UAnb+S2z6XoSLQ633n7QQjLYeLUL0pTzRgU1UPL9cyg==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.6", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-alpha.6.tgz", - "integrity": "sha512-yGd5dP52BrBMO4/nCJdcvotxCbmbXYOi/nQrj7rL4/7VFdKbC4ngT0ggprvKE8CVQC99qPz4qR1y728QdioPAg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-beta.6.tgz", + "integrity": "sha512-GdQ8jIgoYaPeIVp3Em5BGi1XwFB+LWa48mKQ7Z/M3S0u1I6YSo7P1iNhm2eRaeoL+LNb7C0ygEwixiJBaSmeew==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.6", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-alpha.6.tgz", - "integrity": "sha512-4F/rWh7bi97y20SRskrqz9UdO+YwHOn+vcOvNs5/arI5niSmTeAN3dgH9emTx1LJi8d7woUAct+TEqshwoh/zQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-beta.6.tgz", + "integrity": "sha512-52guWmqVa9IReg0NRf4KKUZFmlV/fMniJAKk80Xv62XN5X/MduW2P7zln2+FJAA6uGV0rBZip0Zg1McVkPowSw==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.6", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-workflows-json-1": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-json-1/-/apidom-parser-adapter-workflows-json-1-1.0.0-alpha.6.tgz", - "integrity": "sha512-K2gZFUHtp+Vw9rcizanIJLxSsaYQWNh1QtsEVGtAkn3RBVa130i3umcgQBKuvaBzfhi+Zr21sR4LSrs4XiRHiQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-json-1/-/apidom-parser-adapter-workflows-json-1-1.0.0-beta.6.tgz", + "integrity": "sha512-B5WW7CSVKjU+1Lt3StUEKgJvaNGF1IHYKg91eH7nvhMfJ/oY6rNpE2+ziVkYETifbZeCWMFqbQYHPzJyqomnQQ==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.6", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-workflows-1": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-workflows-yaml-1": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-yaml-1/-/apidom-parser-adapter-workflows-yaml-1-1.0.0-alpha.6.tgz", - "integrity": "sha512-yaJ9Iir43odK/zTB0tVL43RBC4ktQvNRfuT21vedqNaxO9J2pjTPy9NkIXJuOrcizinAASDLLUYX/b0UONhVxg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-yaml-1/-/apidom-parser-adapter-workflows-yaml-1-1.0.0-beta.6.tgz", + "integrity": "sha512-2lzE8JemYy998RDlGJ3l4d9SL3Rs1yxEMGC5a/bIml5QVXT2FSu0ohwaxzkX+HB6LbMd1PMlQZ75IJIlxmcb0Q==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.6", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-workflows-1": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-alpha.6.tgz", - "integrity": "sha512-qevJf2IRvskyvgeGnkJXCGKFnmrcnuMoFHoboI3nJFqdesN74g1hGm1VIVAOOkM4AcdG1w7BviCHEt4YEYGPcQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-beta.6.tgz", + "integrity": "sha512-iwoSjTdyM4DeYtJEenMEKA51EOsOLxMADOXu/9ixTqMpYghp2GMnkryrtH3mq6oCX+jO3ysADx1dfp/CaukBsg==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.6", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", - "@swagger-api/apidom-error": "^1.0.0-alpha.6", + "@swagger-api/apidom-ast": "^1.0.0-beta.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", + "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.20.4", - "tree-sitter-yaml": "=0.5.0", - "web-tree-sitter": "=0.20.3" + "tree-sitter": "=0.22.1", + "web-tree-sitter": "=0.24.5" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/@tree-sitter-grammars/tree-sitter-yaml": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@tree-sitter-grammars/tree-sitter-yaml/-/tree-sitter-yaml-0.7.0.tgz", + "integrity": "sha512-GOMIK3IaDvECD0eZEhAsLl03RMtM1E8StxuGMn6PpMKFg7jyQ+jSzxJZ4Jmc/tYitah9/AECt8o4tlRQ5yEZQg==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "peerDependencies": { + "tree-sitter": "^0.22.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" } }, "node_modules/@swagger-api/apidom-reference": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-alpha.6.tgz", - "integrity": "sha512-DbsxxgQCVd8ZTJag3EOtzJ2rtsaq4z5z/A4nEgzVQhStuHdRwrbQfxem1g7p6dOK2VrGEGf73UllGJvGV+uPpg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-beta.6.tgz", + "integrity": "sha512-GdVPd+YAOWdAuJUJ5so63pZ4i0xlBNGClHJfTHirxZbEH9UQjNTKSkQgawUD0UBpg1HeQVzecl1cehoOp/+Uhw==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", - "axios": "^1.4.0", + "axios": "^1.7.4", "minimatch": "^7.4.3", "process": "^0.11.10", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" }, "optionalDependencies": { - "@swagger-api/apidom-error": "^1.0.0-alpha.1", - "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-workflows-json-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.1" + "@swagger-api/apidom-error": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-workflows-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-workflows-json-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-workflows-yaml-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.3 <1.0.0-rc.0" } }, "node_modules/@swagger-api/apidom-reference/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -3688,6 +3768,7 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3786,9 +3867,10 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", @@ -3947,9 +4029,10 @@ "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" }, "node_modules/@types/ramda": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.30.1.tgz", - "integrity": "sha512-aoyF/ADPL6N+/NXXfhPWF+Qj6w1Cql59m9wX0Gi15uyF+bpzXeLd63HPdiTDE2bmLXfNcVufsDPKmbfOrOzTBA==", + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.30.2.tgz", + "integrity": "sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA==", + "license": "MIT", "dependencies": { "types-ramda": "^0.30.1" } @@ -4082,145 +4165,162 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" }, "node_modules/accepts": { "version": "1.3.8", @@ -4254,9 +4354,10 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4264,14 +4365,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -4460,7 +4553,8 @@ "node_modules/apg-lite": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/apg-lite/-/apg-lite-1.0.4.tgz", - "integrity": "sha512-B32zCN3IdHIc99Vy7V9BaYTUzLeRA8YXYY1aQD1/5I2aqIrO0coi4t6hJPqMisidlBxhyME8UexkHt31SlR6Og==" + "integrity": "sha512-B32zCN3IdHIc99Vy7V9BaYTUzLeRA8YXYY1aQD1/5I2aqIrO0coi4t6hJPqMisidlBxhyME8UexkHt31SlR6Og==", + "license": "BSD-2-Clause" }, "node_modules/arg": { "version": "5.0.2", @@ -4496,7 +4590,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", @@ -4551,9 +4646,10 @@ } }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -4685,21 +4781,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -4709,7 +4795,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -4723,6 +4809,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -4731,6 +4818,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -4738,7 +4826,8 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.2.1", @@ -4796,9 +4885,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", - "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "funding": [ { "type": "opencollective", @@ -4813,11 +4902,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001640", - "electron-to-chromium": "^1.4.820", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -4826,30 +4916,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4906,6 +4972,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4946,9 +5041,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001642", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", - "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", "funding": [ { "type": "opencollective", @@ -4962,7 +5057,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/ccount": { "version": "2.0.1", @@ -5091,12 +5187,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "optional": true - }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -5262,6 +5352,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5402,6 +5493,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5412,9 +5504,10 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5569,9 +5662,10 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6034,6 +6128,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -6042,6 +6137,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6058,20 +6154,12 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -6259,6 +6347,20 @@ "node": ">=4" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -6272,12 +6374,14 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.829", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.829.tgz", - "integrity": "sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==" + "version": "1.5.76", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", + "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -6307,26 +6411,19 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6355,12 +6452,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6378,10 +6473,23 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -6569,6 +6677,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6620,46 +6729,38 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -6668,6 +6769,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/content-disposition": { @@ -6695,9 +6800,10 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" }, "node_modules/express/node_modules/range-parser": { "version": "1.2.1", @@ -6758,14 +6864,6 @@ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dependencies": { - "punycode": "^1.3.2" - } - }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -6892,12 +6990,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -6912,6 +7011,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6919,7 +7019,8 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "4.0.0", @@ -7099,9 +7200,10 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7151,16 +7253,11 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "optional": true - }, "node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", @@ -7214,15 +7311,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7236,6 +7339,19 @@ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -7247,12 +7363,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "optional": true - }, "node_modules/github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", @@ -7379,11 +7489,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7501,21 +7612,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7951,6 +8052,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -7981,9 +8083,10 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -8038,6 +8141,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -8848,6 +8952,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-directive": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", @@ -9235,6 +9348,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -9251,9 +9365,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -10948,9 +11066,10 @@ ] }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -10963,6 +11082,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -11031,6 +11151,7 @@ "version": "0.23.8", "resolved": "https://registry.npmjs.org/minim/-/minim-0.23.8.tgz", "integrity": "sha512-bjdr2xW1dBCMsMGGsUeqM4eFI60m94+szhxWys+B1ztIt6gWSfeGBdSVCIawezeHYLYn0j6zrsXdQS/JllBzww==", + "license": "MIT", "dependencies": { "lodash": "^4.15.0" }, @@ -11062,12 +11183,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "optional": true - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -11093,22 +11208,17 @@ "multicast-dns": "cli.js" } }, - "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "optional": true - }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -11116,12 +11226,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "optional": true - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -11135,6 +11239,15 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -11144,23 +11257,21 @@ "tslib": "^2.0.3" } }, - "node_modules/node-abi": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", - "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, + "node_modules/node-addon-api": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.0.tgz", + "integrity": "sha512-8VOpLHFrOQlAH+qA0ZzuGRlALRA6/LVh8QJldbrC4DY0hXoMP0l4Acq8TzFC018HztWiRqyCEj2aTWY2UvnJUg==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -11217,10 +11328,23 @@ "node": ">= 6.13.0" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-releases": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", - "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -11285,9 +11409,10 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -11329,6 +11454,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -11383,22 +11509,24 @@ } }, "node_modules/openapi-path-templating": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-1.6.0.tgz", - "integrity": "sha512-1atBNwOUrZXthTvlvvX8k8ovFEF3iA8mDidYMkdOtvVdndBhTrspbwGXNOzEUaJhm9iUl4Tf5uQaeTLAJvwPig==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-2.1.0.tgz", + "integrity": "sha512-fLs5eJmLyU8wPRz+JSH5uLE7TE4Ohg6VHOtj0C0AlD3GTCCcw2LgKW6MSN1A8ZBKHEg2O4/d02knmVU1nvGAKQ==", + "license": "Apache-2.0", "dependencies": { - "apg-lite": "^1.0.3" + "apg-lite": "^1.0.4" }, "engines": { "node": ">=12.20.0" } }, "node_modules/openapi-server-url-templating": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.1.0.tgz", - "integrity": "sha512-dtyTFKx2xVcO0W8JKaluXIHC9l/MLjHeflBaWjiWNMCHp/TBs9dEjQDbj/VFlHR4omFOKjjmqm1pW1aCAhmPBg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.3.0.tgz", + "integrity": "sha512-DPlCms3KKEbjVQb0spV6Awfn6UWNheuG/+folQPzh/wUaKwuqvj8zt5gagD7qoyxtE03cIiKPgLFS3Q8Bz00uQ==", + "license": "Apache-2.0", "dependencies": { - "apg-lite": "^1.0.3" + "apg-lite": "^1.0.4" }, "engines": { "node": ">=12.20.0" @@ -11640,9 +11768,10 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", "dependencies": { "isarray": "0.0.1" } @@ -11666,9 +11795,10 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -12330,32 +12460,6 @@ "postcss": "^8.4.31" } }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -12397,6 +12501,7 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -12465,22 +12570,8 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, "node_modules/pupa": { "version": "3.1.0", @@ -12497,11 +12588,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -12557,15 +12649,17 @@ "version": "0.30.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz", "integrity": "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/ramda" } }, "node_modules/ramda-adjunct": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-5.0.1.tgz", - "integrity": "sha512-UTQCcWnoiuYH+ua+jGg3GTktcmCSD2W7OO2++tmv8p2Ze+N9VgVACERg4g36rRfIXklVMtqazyBLBWXfoPKgRQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-5.1.0.tgz", + "integrity": "sha512-8qCpl2vZBXEJyNbi4zqcgdfHtcdsWjOGbiNSEnEBrM6Y0OKOT8UxJbIVGm1TIcjaSu2MxaWcgtsNlKlCk7o7qg==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.3" }, @@ -12609,6 +12703,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -12623,6 +12718,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -13770,7 +13866,8 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/sax": { "version": "1.4.1", @@ -13864,9 +13961,10 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -13890,6 +13988,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -13897,17 +13996,29 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13946,24 +14057,25 @@ } }, "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "license": "MIT", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", + "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" }, "node_modules/serve-index": { "version": "1.9.1", @@ -14036,14 +14148,15 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -14068,7 +14181,8 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.11", @@ -14145,20 +14259,23 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.0.tgz", "integrity": "sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==", + "license": "Apache-2.0", "bin": { "short-unique-id": "bin/short-unique-id", "suid": "bin/short-unique-id" } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14167,56 +14284,64 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/simple-concat": { + "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -14394,6 +14519,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -14599,27 +14725,38 @@ } }, "node_modules/swagger-client": { - "version": "3.28.2", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.28.2.tgz", - "integrity": "sha512-g30KCdSVyZlMulWOJnheNo7Ea+L06OZebl0oRU6zHd5Zf5AZKHTqurKRdNOLsMWA3l3bWJiEh7s3JlzFJHRmoQ==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.33.1.tgz", + "integrity": "sha512-E27FptQgG7mTtyC1yCLStyz03QtcVhmgrg0ESGLoncnYZppZcxRfsJkaZLYwk59XE0KcsBjWDydWSHE411vIyQ==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.22.15", - "@swagger-api/apidom-core": ">=1.0.0-alpha.5 <1.0.0-beta.0", - "@swagger-api/apidom-error": ">=1.0.0-alpha.5 <1.0.0-beta.0", - "@swagger-api/apidom-json-pointer": ">=1.0.0-alpha.5 <1.0.0-beta.0", - "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-alpha.5 <1.0.0-beta.0", - "@swagger-api/apidom-reference": ">=1.0.0-alpha.5 <1.0.0-beta.0", - "cookie": "~0.6.0", + "@scarf/scarf": "=1.4.0", + "@swagger-api/apidom-core": ">=1.0.0-beta.6 <1.0.0-rc.0", + "@swagger-api/apidom-error": ">=1.0.0-beta.6 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": ">=1.0.0-beta.6 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-beta.6 <1.0.0-rc.0", + "@swagger-api/apidom-reference": ">=1.0.0-beta.6 <1.0.0-rc.0", + "cookie": "~0.7.2", "deepmerge": "~4.3.0", "fast-json-patch": "^3.0.0-1", "js-yaml": "^4.1.0", + "neotraverse": "=0.6.18", "node-abort-controller": "^3.1.1", "node-fetch-commonjs": "^3.3.2", - "openapi-path-templating": "^1.5.1", - "openapi-server-url-templating": "^1.0.0", - "qs": "^6.10.2", - "ramda-adjunct": "^5.0.0", - "traverse": "=0.6.8" + "openapi-path-templating": "^2.0.1", + "openapi-server-url-templating": "^1.2.0", + "ramda": "^0.30.1", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/swagger-client/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, "node_modules/swagger-ui-react": { @@ -14674,34 +14811,6 @@ "node": ">=6" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/terser": { "version": "5.31.3", "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", @@ -14877,6 +14986,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } @@ -14889,46 +14999,37 @@ "node": ">=6" } }, - "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tree-sitter": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.20.4.tgz", - "integrity": "sha512-rjfR5dc4knG3jnJNN/giJ9WOoN1zL/kZyrS0ILh+eqq8RNcIbiXA63JsMEgluug0aNvfQvK4BfCErN1vIzvKog==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", + "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", "hasInstallScript": true, + "license": "MIT", "optional": true, + "peer": true, "dependencies": { - "nan": "^2.17.0", - "prebuild-install": "^7.1.1" + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.0" } }, "node_modules/tree-sitter-json": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.20.2.tgz", - "integrity": "sha512-eUxrowp4F1QEGk/i7Sa+Xl8Crlfp7J0AXxX1QdJEQKQYMWhgMbCIgyQvpO3Q0P9oyTrNQxRLlRipDS44a8EtRw==", + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.24.8.tgz", + "integrity": "sha512-Tc9ZZYwHyWZ3Tt1VEw7Pa2scu1YO7/d2BCBbKTx5hXwig3UfdQjsOPkPyLpDJOn/m1UBEWYAtSdGAwCSyagBqQ==", "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { - "nan": "^2.18.0" - } - }, - "node_modules/tree-sitter-yaml": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/tree-sitter-yaml/-/tree-sitter-yaml-0.5.0.tgz", - "integrity": "sha512-POJ4ZNXXSWIG/W4Rjuyg36MkUD4d769YRUGKRqN+sVaj/VCo6Dh6Pkssn1Rtewd5kybx+jT1BWMyWN0CijXnMA==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.14.0" + "node-addon-api": "^8.2.2", + "node-gyp-build": "^4.8.2" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } } }, "node_modules/trim-lines": { @@ -14952,30 +15053,20 @@ "node_modules/ts-mixer": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", - "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", + "license": "MIT" }, "node_modules/ts-toolbelt": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", - "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==", + "license": "Apache-2.0" }, "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -14991,6 +15082,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -15003,6 +15095,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15011,6 +15104,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -15030,6 +15124,7 @@ "version": "0.30.1", "resolved": "https://registry.npmjs.org/types-ramda/-/types-ramda-0.30.1.tgz", "integrity": "sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==", + "license": "MIT", "dependencies": { "ts-toolbelt": "^9.6.0" } @@ -15228,6 +15323,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -15235,12 +15331,13 @@ "node_modules/unraw": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", - "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==" + "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==", + "license": "MIT" }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -15255,9 +15352,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -15584,26 +15682,27 @@ } }, "node_modules/web-tree-sitter": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.3.tgz", - "integrity": "sha512-zKGJW9r23y3BcJusbgvnOH2OYAW40MXAOi9bi3Gcc7T4Gms9WWgXF8m6adsJWpGJEhgOzCrfiz1IzKowJWrtYw==", + "version": "0.24.5", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.24.5.tgz", + "integrity": "sha512-+J/2VSHN8J47gQUAvF8KDadrfz6uFYVjxoxbKWDoXVsH2u7yLdarCnIURnrMA6uSRkgX3SdmqM5BOoQjPdSh5w==", + "license": "MIT", "optional": true }, "node_modules/webpack": { - "version": "5.93.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", - "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", diff --git a/docs/static/img/favicon.ico b/docs/static/img/favicon.ico index 402007d0..1c9f23b8 100644 Binary files a/docs/static/img/favicon.ico and b/docs/static/img/favicon.ico differ diff --git a/docs/static/img/icon.png b/docs/static/img/icon.png new file mode 100644 index 00000000..c2afc07b Binary files /dev/null and b/docs/static/img/icon.png differ diff --git a/docs/static/img/logo.jpg b/docs/static/img/logo.jpg deleted file mode 100644 index 1681c6a3..00000000 Binary files a/docs/static/img/logo.jpg and /dev/null differ diff --git a/docs/static/img/logo.png b/docs/static/img/logo.png new file mode 100644 index 00000000..c630a292 Binary files /dev/null and b/docs/static/img/logo.png differ diff --git a/docs/static/img/overview.png b/docs/static/img/overview.png new file mode 100644 index 00000000..9926e017 Binary files /dev/null and b/docs/static/img/overview.png differ diff --git a/configs/custom_chain.toml b/examples/configs/custom_chain.toml similarity index 100% rename from configs/custom_chain.toml rename to examples/configs/custom_chain.toml diff --git a/configs/minimal.toml b/examples/configs/minimal.toml similarity index 100% rename from configs/minimal.toml rename to examples/configs/minimal.toml diff --git a/configs/pbs_metrics.toml b/examples/configs/pbs_metrics.toml similarity index 100% rename from configs/pbs_metrics.toml rename to examples/configs/pbs_metrics.toml diff --git a/configs/pbs-mux.toml b/examples/configs/pbs_mux.toml similarity index 52% rename from configs/pbs-mux.toml rename to examples/configs/pbs_mux.toml index f9efa1d5..3ea9f355 100644 --- a/configs/pbs-mux.toml +++ b/examples/configs/pbs_mux.toml @@ -6,26 +6,43 @@ chain = "Holesky" port = 18550 timeout_get_header_ms = 950 late_in_slot_time_ms = 2000 +rpc_url = "https://ethereum-holesky-rpc.publicnode.com" +# Used for all validators except the ones in the mux [[relays]] id = "relay-1" url = "http://0xa1cec75a3f0661e99299274182938151e8433c61a19222347ea1313d839229cb4ce4e3e5aa2bdeb71c8fcf1b084963c2@abc.xyz" -[[relays]] -id = "relay-2" -url = "http://0xa119589bb33ef52acbb8116832bec2b58fca590fe5c85eac5d3230b44d5bc09fe73ccd21f88eab31d6de16194d17782e@def.xyz" -enable_timing_games = true -target_first_request_ms = 200 [[mux]] -id = "test_mux" +id = "timing-mux" validator_pubkeys = [ "0x80c7f782b2467c5898c5516a8b6595d75623960b4afc4f71ee07d40985d20e117ba35e7cd352a3e75fb85a8668a3b745", ] -loader = "./mux_keys.example.json" +loader = "./tests/data/mux_keys.example.json" timeout_get_header_ms = 900 late_in_slot_time_ms = 1500 + [[mux.relays]] id = "relay-2" -enable_timing_games = false +url = "http://0xa119589bb33ef52acbb8116832bec2b58fca590fe5c85eac5d3230b44d5bc09fe73ccd21f88eab31d6de16194d17782e@def.xyz" +enable_timing_games = true +target_first_request_ms = 200 + + +[[mux]] +id = "lido-mux" +loader = { registry = "lido", node_operator_id = 8 } + +[[mux.relays]] +id = "relay-3" +url = "http://0x80c7f782b2467c5898c5516a8b6595d75623960b4afc4f71ee07d40985d20e117ba35e7cd352a3e75fb85a8668a3b745@fgh.xyz" + +[[mux]] +id = "ssv-mux" +loader = { registry = "ssv", node_operator_id = 200 } + +[[mux.relays]] +id = "relay-4" +url = "http://0x80c7f782b2467c5898c5516a8b6595d75623960b4afc4f71ee07d40985d20e117ba35e7cd352a3e75fb85a8668a3b745@fgh.xyz" diff --git a/examples/status_api/src/main.rs b/examples/status_api/src/main.rs index 58d3b52a..40bed730 100644 --- a/examples/status_api/src/main.rs +++ b/examples/status_api/src/main.rs @@ -81,7 +81,7 @@ async fn handle_check(State(state): State>) -> Response async fn main() -> Result<()> { color_eyre::install()?; - let (pbs_config, extra) = load_pbs_custom_config::()?; + let (pbs_config, extra) = load_pbs_custom_config::().await?; let _guard = initialize_pbs_tracing_log()?; let custom_state = MyBuilderState::from_config(extra); diff --git a/k8s/commit-boost/templates/configmap.yaml b/k8s/commit-boost/templates/configmap.yaml deleted file mode 100644 index 6b5edb90..00000000 --- a/k8s/commit-boost/templates/configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "commit-boost.fullname" . }} - labels: - {{- include "commit-boost.labels" . | nindent 4 }} -data: - {{- if .Values.commitBoost.pbs.enable }} - config.pbs.toml: |- - {{ .Values.commitBoost.pbs.config | nindent 4 }} - {{- end }} diff --git a/grafana/dashboards/dashboards.yml b/provisioning/grafana/dashboards/dashboards.yml similarity index 100% rename from grafana/dashboards/dashboards.yml rename to provisioning/grafana/dashboards/dashboards.yml diff --git a/grafana/dashboards/dashboard.json b/provisioning/grafana/dashboards/pbs_dashboard.json similarity index 100% rename from grafana/dashboards/dashboard.json rename to provisioning/grafana/dashboards/pbs_dashboard.json diff --git a/provisioning/grafana/dashboards/signer_dashboard.json b/provisioning/grafana/dashboards/signer_dashboard.json new file mode 100644 index 00000000..01e93973 --- /dev/null +++ b/provisioning/grafana/dashboards/signer_dashboard.json @@ -0,0 +1,462 @@ +{ + "__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": 2, + "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": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 21, + "options": { + "colorMode": "value", + "graphMode": "none", + "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_signer_signer_status_code_total{endpoint=\"generate_proxy_key\", http_status_code=\"200\"}", + "format": "time_series", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Proxy delegations requested", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "red", + "mode": "thresholds" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 22, + "options": { + "colorMode": "value", + "graphMode": "none", + "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_signer_signer_status_code_total{endpoint=\"request_signature\", http_status_code=\"200\"}", + "format": "time_series", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Commitments signed", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 11 + }, + "id": 23, + "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": 12, + "x": 0, + "y": 12 + }, + "id": 24, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "editorMode": "code", + "expr": "increase(cb_signer_signer_status_code_total{http_status_code=~\"2..\", endpoint=\"$endpoint\"}[1h])", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "$endpoint 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": 12, + "x": 12, + "y": 12 + }, + "id": 25, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cb_prometheus" + }, + "editorMode": "code", + "expr": "increase(cb_signer_signer_status_code_total{http_status_code=~\"4..|5..\", endpoint=\"$endpoint\"}[1h])", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "$endpoint Error QPH", + "type": "timeseries" + } + ], + "refresh": "5m", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "description": "SignerAPI endpoint", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "endpoint", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "Get Pubkeys", + "value": "get_pubkeys" + }, + { + "selected": false, + "text": "Generate Proxy Keys", + "value": "generate_proxy_key" + }, + { + "selected": false, + "text": "Request Signature", + "value": "request_signature" + } + ], + "query": "get_pubkeys, generate_proxy_key, request_signature", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-2d", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Signer Metrics", + "uid": "cb_signer_metrics", + "version": 1, + "weekStart": "" +} diff --git a/grafana/dashboards/system_metrics.json b/provisioning/grafana/dashboards/system_metrics.json similarity index 100% rename from grafana/dashboards/system_metrics.json rename to provisioning/grafana/dashboards/system_metrics.json diff --git a/grafana/datasources/datasources.yml b/provisioning/grafana/datasources/datasources.yml similarity index 100% rename from grafana/datasources/datasources.yml rename to provisioning/grafana/datasources/datasources.yml diff --git a/grafana/public_dashboard.json b/provisioning/grafana/pbs_public_dashboard.json similarity index 100% rename from grafana/public_dashboard.json rename to provisioning/grafana/pbs_public_dashboard.json diff --git a/provisioning/grafana/signer_public_dashboard.json b/provisioning/grafana/signer_public_dashboard.json new file mode 100644 index 00000000..3077ad6f --- /dev/null +++ b/provisioning/grafana/signer_public_dashboard.json @@ -0,0 +1,468 @@ +{ + "__inputs": [ + { + "name": "DS_CB_PROMETHEUS", + "label": "cb_prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "11.3.1" + }, + { + "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": null, + "links": [], + "liveNow": true, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_CB_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "red", + "mode": "thresholds" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 21, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_CB_PROMETHEUS}" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "cb_signer_signer_status_code_total{endpoint=\"generate_proxy_key\", http_status_code=\"200\"}", + "format": "time_series", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Proxy delegations requested", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_CB_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "red", + "mode": "thresholds" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 22, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_CB_PROMETHEUS}" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "cb_signer_signer_status_code_total{endpoint=\"request_signature\", http_status_code=\"200\"}", + "format": "time_series", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Commitments signed", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 6 + }, + "id": 23, + "panels": [], + "repeat": "endpoint", + "title": "$endpoint calls", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_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", + "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": 12, + "x": 0, + "y": 7 + }, + "id": 24, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_CB_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "increase(cb_signer_signer_status_code_total{http_status_code=~\"2..\", endpoint=\"$endpoint\"}[1h])", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "$endpoint Success QPH", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_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", + "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": 12, + "x": 12, + "y": 7 + }, + "id": 25, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_CB_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "increase(cb_signer_signer_status_code_total{http_status_code=~\"4..|5..\", endpoint=\"$endpoint\"}[1h])", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "$endpoint Error QPH", + "type": "timeseries" + } + ], + "refresh": "5m", + "schemaVersion": 40, + "tags": [], + "templating": { + "list": [ + { + "current": { + "text": "$__all", + "value": "$__all" + }, + "description": "SignerAPI endpoint", + "includeAll": true, + "name": "endpoint", + "options": [ + { + "selected": false, + "text": "get_pubkeys", + "value": "get_pubkeys" + }, + { + "selected": false, + "text": "generate_proxy_key", + "value": "generate_proxy_key" + }, + { + "selected": false, + "text": "request_signature", + "value": "request_signature" + } + ], + "query": "get_pubkeys, generate_proxy_key, request_signature", + "type": "custom" + } + ] + }, + "time": { + "from": "now-2d", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Signer Metrics", + "uid": "cb_signer_metrics", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/k8s/README.md b/provisioning/k8s/README.md similarity index 94% rename from k8s/README.md rename to provisioning/k8s/README.md index 5d6a07ec..73f1779f 100644 --- a/k8s/README.md +++ b/provisioning/k8s/README.md @@ -1,4 +1,4 @@ -# Commit boost on k8s +# Commit-Boost on k8s Currently, only the PBS module is supported and it can be used as a drop-in replacement to mev-boost. To quickly install it, from the diff --git a/k8s/commit-boost/.helmignore b/provisioning/k8s/commit-boost/.helmignore similarity index 100% rename from k8s/commit-boost/.helmignore rename to provisioning/k8s/commit-boost/.helmignore diff --git a/k8s/commit-boost/Chart.yaml b/provisioning/k8s/commit-boost/Chart.yaml similarity index 79% rename from k8s/commit-boost/Chart.yaml rename to provisioning/k8s/commit-boost/Chart.yaml index d983f273..f6241fdb 100644 --- a/k8s/commit-boost/Chart.yaml +++ b/provisioning/k8s/commit-boost/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: commit-boost description: A Helm chart for Kubernetes type: application -version: 0.0.4 -appVersion: "v0.2.0" +version: 0.0.5 +appVersion: "v0.4.0" maintainers: - name: mxs email: mxs@kiln.fi diff --git a/k8s/commit-boost/README.md b/provisioning/k8s/commit-boost/README.md similarity index 60% rename from k8s/commit-boost/README.md rename to provisioning/k8s/commit-boost/README.md index b25ef318..af727f7e 100644 --- a/k8s/commit-boost/README.md +++ b/provisioning/k8s/commit-boost/README.md @@ -1,6 +1,6 @@ # commit-boost -![Version: 0.0.4](https://img.shields.io/badge/Version-0.0.4-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v0.2.0](https://img.shields.io/badge/AppVersion-v0.2.0-informational?style=flat-square) +![Version: 0.0.5](https://img.shields.io/badge/Version-0.0.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v0.4.0](https://img.shields.io/badge/AppVersion-v0.4.0-informational?style=flat-square) A Helm chart for Kubernetes @@ -8,7 +8,7 @@ A Helm chart for Kubernetes | Name | Email | Url | | ---- | ------ | --- | -| mxs | mxs@kiln.fi | | +| mxs | | | ## Values @@ -19,12 +19,17 @@ A Helm chart for Kubernetes | autoscaling.maxReplicas | int | `100` | | | autoscaling.minReplicas | int | `1` | | | autoscaling.targetCPUUtilizationPercentage | int | `80` | | -| commitBoost.pbs.config | string | `"chain = \"Holesky\"\n\n[pbs]\nport = 18550\n\n[[relays]]\nurl = \"https://0xafa4c6985aa049fb79dd37010438cfebeb0f2bd42b115b89dd678dab0670c1de38da0c4e9138c9290a398ecd9a0b3110@boost-relay-holesky.flashbots.net\""` | | +| commitBoost.pbs.config.chain | string | `"Holesky"` | | +| commitBoost.pbs.config.metrics.prometheus_config | string | `"/dev/null"` | | +| commitBoost.pbs.config.metrics.server_port | int | `10000` | | +| commitBoost.pbs.config.mux | list | `[]` | | +| commitBoost.pbs.config.pbs.port | int | `18550` | | +| commitBoost.pbs.config.relays | list | `[]` | | | commitBoost.pbs.enable | bool | `true` | | +| commitBoost.pbs.image.pullPolicy | string | `"IfNotPresent"` | | +| commitBoost.pbs.image.repository | string | `"ghcr.io/commit-boost/pbs"` | | +| commitBoost.pbs.image.tag | string | `"v0.4.0"` | | | fullnameOverride | string | `""` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"ghcr.io/commit-boost/pbs"` | | -| image.tag | string | `"v0.2.0"` | | | imagePullSecrets | list | `[]` | | | ingress.annotations | object | `{}` | | | ingress.className | string | `""` | | @@ -41,20 +46,24 @@ A Helm chart for Kubernetes | replicaCount | int | `1` | | | resources | object | `{}` | | | securityContext | object | `{}` | | -| service.metrics_port | int | `10000` | | -| service.port | int | `18550` | | +| service.pbs_metrics_port | int | `10000` | | +| service.pbs_port | int | `18550` | | | service.type | string | `"ClusterIP"` | | | serviceAccount.annotations | object | `{}` | | | serviceAccount.automount | bool | `true` | | | serviceAccount.create | bool | `true` | | | serviceAccount.name | string | `""` | | +| serviceMonitor.additionalLabels | object | `{}` | | | serviceMonitor.enabled | bool | `true` | | -| serviceMonitor.honorLabels | bool | `true` | | +| serviceMonitor.metricRelabelings | list | `[]` | | +| serviceMonitor.namespace | string | `""` | | +| serviceMonitor.namespaceSelector | object | `{}` | | | serviceMonitor.path | string | `"/metrics"` | | | serviceMonitor.scrapeInterval | string | `"30s"` | | +| serviceMonitor.targetLabels | list | `[]` | | | tolerations | list | `[]` | | | volumeMounts | list | `[]` | | | volumes | list | `[]` | | ---------------------------------------------- -Autogenerated from chart metadata using [helm-docs v1.7.0](https://github.com/norwoodj/helm-docs/releases/v1.7.0) +Autogenerated from chart metadata using [helm-docs v1.11.0](https://github.com/norwoodj/helm-docs/releases/v1.11.0) diff --git a/k8s/commit-boost/templates/NOTES.txt b/provisioning/k8s/commit-boost/templates/NOTES.txt similarity index 100% rename from k8s/commit-boost/templates/NOTES.txt rename to provisioning/k8s/commit-boost/templates/NOTES.txt diff --git a/k8s/commit-boost/templates/_helpers.tpl b/provisioning/k8s/commit-boost/templates/_helpers.tpl similarity index 100% rename from k8s/commit-boost/templates/_helpers.tpl rename to provisioning/k8s/commit-boost/templates/_helpers.tpl diff --git a/provisioning/k8s/commit-boost/templates/configmap.yaml b/provisioning/k8s/commit-boost/templates/configmap.yaml new file mode 100644 index 00000000..06aafa3d --- /dev/null +++ b/provisioning/k8s/commit-boost/templates/configmap.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "commit-boost.fullname" . }} + labels: + {{- include "commit-boost.labels" . | nindent 4 }} +data: + {{- if .Values.commitBoost.pbs.enable }} + # Currently toToml doesn't handle properly integer conversions, it + # translates them to floats with a trailing ".0" leading to commit-boost + # crashing at start. We have three possible approaches to fix this: + # + # 1. Do not use toToml and manually convert all config fields from yaml to + # toml, this means the chart won't be in sync with evolutions of + # commit-boost, + # + # 2. Have commit-boost handle floats as integers in the config parsing, this + # would likely be confusing for everyone else using commit-boost, + # + # 3. Introduce a temporary hack to remove trailing .0 from the toml output. This + # is the current temporary approach taken. It's dangerous because it might + # remove ".0" from other places where it's actually needed. + # + # We use 3) for now considering https://github.com/helm/helm/pull/13534 is likely + # to be part of a new Helm version. + config.pbs.toml: |- + {{ .Values.commitBoost.pbs.config | toToml | replace ".0" "" | nindent 4 }} + {{- end }} diff --git a/k8s/commit-boost/templates/deployment.yaml b/provisioning/k8s/commit-boost/templates/deployment.yaml similarity index 81% rename from k8s/commit-boost/templates/deployment.yaml rename to provisioning/k8s/commit-boost/templates/deployment.yaml index ed3eab9d..7f2de29a 100644 --- a/k8s/commit-boost/templates/deployment.yaml +++ b/provisioning/k8s/commit-boost/templates/deployment.yaml @@ -35,14 +35,14 @@ spec: - name: {{ .Chart.Name }}-pbs securityContext: {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} + image: "{{ .Values.commitBoost.pbs.image.repository }}:{{ .Values.commitBoost.pbs.image.tag }}" + imagePullPolicy: {{ .Values.commitBoost.pbs.image.pullPolicy }} ports: - name: http-pbs - containerPort: {{ .Values.service.port }} + containerPort: {{ .Values.commitBoost.pbs.config.pbs.port }} protocol: TCP - name: http-metrics - containerPort: {{ .Values.service.metrics_port }} + containerPort: {{ .Values.commitBoost.pbs.config.metrics.server_port }} protocol: TCP livenessProbe: httpGet: @@ -58,9 +58,13 @@ spec: - name: CB_CONFIG value: /config/config.pbs.toml - name: CB_METRICS_PORT - value: '{{ .Values.service.metrics_port }}' + value: "{{ .Values.commitBoost.pbs.config.metrics.server_port }}" + - name: ROLLING_DURATION + value: never - name: RUST_LOG value: info + - name: CB_PBS_ENDPOINT + value: "0.0.0.0:{{ .Values.commitBoost.pbs.config.pbs.port }}" volumeMounts: - name: commit-boost-configs mountPath: /config diff --git a/k8s/commit-boost/templates/hpa.yaml b/provisioning/k8s/commit-boost/templates/hpa.yaml similarity index 100% rename from k8s/commit-boost/templates/hpa.yaml rename to provisioning/k8s/commit-boost/templates/hpa.yaml diff --git a/k8s/commit-boost/templates/ingress.yaml b/provisioning/k8s/commit-boost/templates/ingress.yaml similarity index 100% rename from k8s/commit-boost/templates/ingress.yaml rename to provisioning/k8s/commit-boost/templates/ingress.yaml diff --git a/k8s/commit-boost/templates/service.yaml b/provisioning/k8s/commit-boost/templates/service.yaml similarity index 66% rename from k8s/commit-boost/templates/service.yaml rename to provisioning/k8s/commit-boost/templates/service.yaml index b00de6b5..5dee6ab5 100644 --- a/k8s/commit-boost/templates/service.yaml +++ b/provisioning/k8s/commit-boost/templates/service.yaml @@ -1,3 +1,4 @@ +{{- if .Values.commitBoost.pbs.enable }} apiVersion: v1 kind: Service metadata: @@ -5,15 +6,16 @@ metadata: labels: {{- include "commit-boost.labels" . | nindent 4 }} spec: - type: {{ .Values.service.type }} + type: ClusterIP ports: - - port: {{ .Values.service.port }} + - port: {{ .Values.commitBoost.pbs.config.pbs.port}} name: http-pbs targetPort: http-pbs protocol: TCP - - port: {{ .Values.service.metrics_port }} + - port: {{ .Values.commitBoost.pbs.config.metrics.server_port}} protocol: TCP name: http-metrics targetPort: http-metrics selector: {{- include "commit-boost.selectorLabels" . | nindent 4 }} +{{- end }} \ No newline at end of file diff --git a/k8s/commit-boost/templates/serviceaccount.yaml b/provisioning/k8s/commit-boost/templates/serviceaccount.yaml similarity index 100% rename from k8s/commit-boost/templates/serviceaccount.yaml rename to provisioning/k8s/commit-boost/templates/serviceaccount.yaml diff --git a/k8s/commit-boost/templates/servicemonitor.yaml b/provisioning/k8s/commit-boost/templates/servicemonitor.yaml similarity index 100% rename from k8s/commit-boost/templates/servicemonitor.yaml rename to provisioning/k8s/commit-boost/templates/servicemonitor.yaml diff --git a/k8s/commit-boost/templates/tests/test-connection.yaml b/provisioning/k8s/commit-boost/templates/tests/test-connection.yaml similarity index 100% rename from k8s/commit-boost/templates/tests/test-connection.yaml rename to provisioning/k8s/commit-boost/templates/tests/test-connection.yaml diff --git a/provisioning/k8s/commit-boost/values.examples.yaml b/provisioning/k8s/commit-boost/values.examples.yaml new file mode 100644 index 00000000..06187301 --- /dev/null +++ b/provisioning/k8s/commit-boost/values.examples.yaml @@ -0,0 +1,141 @@ +# Default values for commit-boost. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Automatically mount a ServiceAccount's API credentials? + automount: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} +podLabels: {} + +podSecurityContext: + {} + # fsGroup: 2000 + +securityContext: + {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + pbs_port: 18550 + pbs_metrics_port: 10000 + +ingress: + enabled: false + className: "" + annotations: + {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: chart-example.local + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: + {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +# Additional volumes on the output Deployment definition. +volumes: [] +# - name: foo +# secret: +# secretName: mysecret +# optional: false + +# Additional volumeMounts on the output Deployment definition. +volumeMounts: [] +# - name: foo +# mountPath: "/etc/foo" +# readOnly: true + +nodeSelector: {} + +tolerations: [] + +affinity: {} + +serviceMonitor: + enabled: true + additionalLabels: {} + namespace: "" + namespaceSelector: {} + scrapeInterval: 30s + targetLabels: [] + metricRelabelings: [] + path: /metrics + +commitBoost: + pbs: + enable: true + image: + repository: ghcr.io/commit-boost/pbs + pullPolicy: IfNotPresent + tag: "v0.4.0" + config: + chain: "Holesky" + metrics: + server_port: 10000 + prometheus_config: "/dev/null" + pbs: + port: 18550 + timeout_get_header_ms: 900 + late_in_slot_time_ms: 1000 + relays: + - id: "flashbot" + url: "https://0xafa4c6985aa049fb79dd37010438cfebeb0f2bd42b115b89dd678dab0670c1de38da0c4e9138c9290a398ecd9a0b3110@boost-relay-holesky.flashbots.net" + enable_timing_games: false + target_first_request_ms: 500 + frequency_get_header_ms: 100 + mux: + - id: "timing-games" + timeout_get_header_ms: 900 + late_in_slot_time_ms: 1000 + validator_pubkeys: ["0x80c7f782b2467c5898c5516a8b6595d75623960b4afc4f71ee07d40985d20e117ba35e7cd352a3e75fb85a8668a3b745"] + relays: + - id: "flashbot" + url: "https://0xafa4c6985aa049fb79dd37010438cfebeb0f2bd42b115b89dd678dab0670c1de38da0c4e9138c9290a398ecd9a0b3110@boost-relay-holesky.flashbots.net" + enable_timing_games: true + target_first_request_ms: 500 + frequency_get_header_ms: 100 diff --git a/k8s/commit-boost/values.yaml b/provisioning/k8s/commit-boost/values.yaml similarity index 83% rename from k8s/commit-boost/values.yaml rename to provisioning/k8s/commit-boost/values.yaml index 1fffd242..24369a46 100644 --- a/k8s/commit-boost/values.yaml +++ b/provisioning/k8s/commit-boost/values.yaml @@ -4,11 +4,6 @@ replicaCount: 1 -image: - repository: ghcr.io/commit-boost/pbs - pullPolicy: IfNotPresent - tag: "v0.2.0" - imagePullSecrets: [] nameOverride: "" fullnameOverride: "" @@ -42,8 +37,8 @@ securityContext: service: type: ClusterIP - port: 18550 - metrics_port: 10000 + pbs_port: 18550 + pbs_metrics_port: 10000 ingress: enabled: false @@ -103,19 +98,27 @@ affinity: {} serviceMonitor: enabled: true + additionalLabels: {} + namespace: "" + namespaceSelector: {} scrapeInterval: 30s + targetLabels: [] + metricRelabelings: [] path: /metrics - honorLabels: true - commitBoost: pbs: enable: true - config: |- - chain = "Holesky" - - [pbs] - port = 18550 - - [[relays]] - url = "https://0xafa4c6985aa049fb79dd37010438cfebeb0f2bd42b115b89dd678dab0670c1de38da0c4e9138c9290a398ecd9a0b3110@boost-relay-holesky.flashbots.net" + image: + repository: ghcr.io/commit-boost/pbs + pullPolicy: IfNotPresent + tag: "v0.4.0" + config: + chain: "Holesky" + metrics: + server_port: 10000 + prometheus_config: "/dev/null" + pbs: + port: 18550 + relays: [] + mux: [] diff --git a/docker/pbs.Dockerfile b/provisioning/pbs.Dockerfile similarity index 98% rename from docker/pbs.Dockerfile rename to provisioning/pbs.Dockerfile index 6171b07b..9d2a2fcf 100644 --- a/docker/pbs.Dockerfile +++ b/provisioning/pbs.Dockerfile @@ -22,6 +22,7 @@ RUN apt-get update && apt-get install -y \ ca-certificates \ libssl3 \ libssl-dev \ + curl \ && apt-get clean autoclean \ && rm -rf /var/lib/apt/lists/* diff --git a/docker/prometheus.yml b/provisioning/prometheus.yml similarity index 100% rename from docker/prometheus.yml rename to provisioning/prometheus.yml diff --git a/docker/signer.Dockerfile b/provisioning/signer.Dockerfile similarity index 100% rename from docker/signer.Dockerfile rename to provisioning/signer.Dockerfile diff --git a/rust-toolchain.toml b/rust-toolchain.toml index dc2d42d0..0193dee3 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.80.0" \ No newline at end of file +channel = "1.83.0" diff --git a/scripts/build_local_images.sh b/scripts/build_local_images.sh index bfe360cc..5dd09c9c 100755 --- a/scripts/build_local_images.sh +++ b/scripts/build_local_images.sh @@ -2,8 +2,8 @@ set -euo pipefail -# Commit Boost needs the default pbs and signer module images to be available. For local development, build these based on the ./docker folder +# Commit-Boost needs the default pbs and signer module images to be available. For local development, build these based on the ./docker folder # The image names match the ones in common::config -docker build -t commitboost_pbs_default . -f ./docker/pbs.Dockerfile -docker build -t commitboost_signer . -f ./docker/signer.Dockerfile +docker build -t commitboost_pbs_default . -f ./provisioning/pbs.Dockerfile +docker build -t commitboost_signer . -f ./provisioning/signer.Dockerfile diff --git a/keys.example.json b/tests/data/keys.example.json similarity index 100% rename from keys.example.json rename to tests/data/keys.example.json diff --git a/mux_keys.example.json b/tests/data/mux_keys.example.json similarity index 100% rename from mux_keys.example.json rename to tests/data/mux_keys.example.json diff --git a/tests/tests/config.rs b/tests/tests/config.rs index 684a2b84..044a62c8 100644 --- a/tests/tests/config.rs +++ b/tests/tests/config.rs @@ -1,10 +1,10 @@ use cb_common::{config::CommitBoostConfig, types::Chain}; use eyre::Result; -#[test] -fn test_load_config() -> Result<()> { +#[tokio::test] +async fn test_load_config() -> Result<()> { let config = CommitBoostConfig::from_file("../config.example.toml")?; - + config.validate().await?; assert_eq!(config.chain, Chain::Holesky); assert!(config.relays[0].headers.is_some()); diff --git a/tests/tests/pbs_integration.rs b/tests/tests/pbs_integration.rs index 88dea73c..cc8f5d27 100644 --- a/tests/tests/pbs_integration.rs +++ b/tests/tests/pbs_integration.rs @@ -48,6 +48,7 @@ fn to_pbs_config(chain: Chain, pbs_config: PbsConfig, relays: Vec) pbs_config: Arc::new(pbs_config), signer_client: None, event_publisher: None, + all_relays: relays.clone(), relays, muxes: None, } @@ -204,24 +205,28 @@ async fn test_submit_block_too_large() -> Result<()> { async fn test_mux() -> Result<()> { setup_test_env(); let signer = random_secret(); - let pubkey_1: BlsPublicKey = blst_pubkey_to_alloy(&signer.sk_to_pk()).into(); - let signer_2 = random_secret(); - let pubkey_2: BlsPublicKey = blst_pubkey_to_alloy(&signer_2.sk_to_pk()).into(); + let pubkey: BlsPublicKey = blst_pubkey_to_alloy(&signer.sk_to_pk()).into(); let chain = Chain::Holesky; let port = 3600; - let mux_relay = generate_mock_relay(port + 1, *pubkey_1)?; - let relays = vec![mux_relay.clone(), generate_mock_relay(port + 2, *pubkey_2)?]; + let mux_relay_1 = generate_mock_relay(port + 1, *pubkey)?; + let mux_relay_2 = generate_mock_relay(port + 2, *pubkey)?; + let default_relay = generate_mock_relay(port + 3, *pubkey)?; + let mock_state = Arc::new(MockRelayState::new(chain, signer)); tokio::spawn(start_mock_relay_service(mock_state.clone(), port + 1)); tokio::spawn(start_mock_relay_service(mock_state.clone(), port + 2)); + tokio::spawn(start_mock_relay_service(mock_state.clone(), port + 3)); + let relays = vec![default_relay.clone()]; let mut config = to_pbs_config(chain, get_pbs_static_config(port), relays); + config.all_relays = vec![mux_relay_1.clone(), mux_relay_2.clone(), default_relay.clone()]; + let mux = RuntimeMuxConfig { id: String::from("test"), config: config.pbs_config.clone(), - relays: vec![mux_relay], + relays: vec![mux_relay_1, mux_relay_2], }; let validator_pubkey = blst_pubkey_to_alloy(&random_secret().sk_to_pk()); @@ -239,12 +244,28 @@ async fn test_mux() -> Result<()> { let res = mock_validator.do_get_header(None).await; assert!(res.is_ok()); - assert_eq!(mock_state.received_get_header(), 2); // both relays were used + assert_eq!(mock_state.received_get_header(), 1); // only default relay was used info!("Sending get header with mux"); let res = mock_validator.do_get_header(Some(validator_pubkey)).await; assert!(res.is_ok()); - assert_eq!(mock_state.received_get_header(), 3); // only one relay was used + assert_eq!(mock_state.received_get_header(), 3); // two mux relays were used + + let res = mock_validator.do_get_status().await; + + assert!(res.is_ok()); + assert_eq!(mock_state.received_get_status(), 3); // default + 2 mux relays were used + + let res = mock_validator.do_register_validator().await; + + assert!(res.is_ok()); + assert_eq!(mock_state.received_register_validator(), 3); // default + 2 mux relays were used + + let res = mock_validator.do_submit_block().await; + + assert!(res.is_err()); + assert_eq!(mock_state.received_submit_block(), 3); // default + 2 mux relays were used + Ok(()) }