diff --git a/.github/workflows/_shared-check.yaml b/.github/workflows/_shared-check.yaml index ad318062..c6f7c84a 100644 --- a/.github/workflows/_shared-check.yaml +++ b/.github/workflows/_shared-check.yaml @@ -36,7 +36,7 @@ jobs: uses: golangci/golangci-lint-action@v3 with: # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version - version: latest + version: v1.56.1 # Optional: working directory, useful for monorepos # working-directory: somedir diff --git a/.github/workflows/build-dev-latest.yml b/.github/workflows/build-dev-latest.yml new file mode 100644 index 00000000..66cd186c --- /dev/null +++ b/.github/workflows/build-dev-latest.yml @@ -0,0 +1,33 @@ + +name: Build latest image + +on: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: write + +jobs: + + check_source: + name: "Run code checks" + uses: ./.github/workflows/_shared-check.yaml + + build_binaries: + name: "Build Assertoor" + needs: [check_source] + uses: ./.github/workflows/_shared-build.yaml + with: + ref: ${{ github.sha }} + release: "snapshot" + docker: true + docker_repository: "ethpandaops/assertoor" + docker_tag_prefix: "master" + additional_tags: "['master','master-latest','latest']" + secrets: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml index bfc2bd65..5469ec83 100644 --- a/.github/workflows/build-dev.yml +++ b/.github/workflows/build-dev.yml @@ -27,9 +27,8 @@ jobs: - name: "Load PR info" id: loadinfo run: | - run_builds="false" - has_docker_image_label="${{ contains(github.event.pull_request.labels.*.name, 'build-docker-image') }}" + run_builds="$has_docker_image_label" echo "docker image label: $has_docker_image_label" branch_name="${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" diff --git a/docs/02-global-config.md b/docs/02-global-config.md index 4e652624..57a8859f 100644 --- a/docs/02-global-config.md +++ b/docs/02-global-config.md @@ -8,17 +8,23 @@ It contains general settings, endpoints, validator names, global variables, and The configuration file is structured as follows: ```yaml -endpoints: - - name: "node-1" - executionUrl: "http://127.0.0.1:8545" - consensusUrl: "http://127.0.0.1:5052" +coordinator: + maxConcurrentTests: 1 # max number of tests to run concurrently + testRetentionTime: 336h # delete test run (logs + status) after that duration web: server: host: "0.0.0.0" port: 8080 + api: + enabled: true # enable rest api frontend: - enabled: true + enabled: true # enable web ui + +endpoints: + - name: "node-1" + executionUrl: "http://127.0.0.1:8545" + consensusUrl: "http://127.0.0.1:5052" validatorNames: inventoryYaml: "./validator-names.yaml" @@ -48,12 +54,14 @@ externalTests: ``` +- **`coordinator`**:\ + Manages the execution of tests, specifying the maximum number of tests that can run concurrently (`maxConcurrentTests`) and how long to retain test runs, including logs and status, after completion (`testRetentionTime`). - **`endpoints`**:\ A list of Ethereum consensus and execution clients. Each endpoint includes URLs for both RPC endpoints and a name for reference in subsequent tests. - **`web`**:\ - Configurations for the web frontend, detailing server host and port settings. + Configurations for the web api & frontend, detailing server host and port settings. - **`validatorNames`**:\ Defines a mapping of validator index ranges to their respective names. \ @@ -75,3 +83,4 @@ externalTests: - **`externalTests`**:\ This feature enables the integration of tests that are defined in separate files, fostering a modular and scalable test configuration approach. \ It allows for better organization and management of complex testing scenarios. + diff --git a/docs/03-rest-api.md b/docs/03-rest-api.md new file mode 100644 index 00000000..edb6b249 --- /dev/null +++ b/docs/03-rest-api.md @@ -0,0 +1,18 @@ +# REST API + +When enabled, Assertoor offers a REST API that facilitates interaction with the testing framework, enabling users to programmatically fetch statuses and results of tests and tasks. Additionally, the API supports basic operations such as scheduling or canceling test runs, making it a powerful tool for automating and integrating Assertoor into broader testing and CI/CD pipelines. + +## Key Features of the REST API: + +- **Status and Results Retrieval**: Users can query the API to obtain detailed status updates and results for both tests and individual tasks, allowing for real-time monitoring and analysis of test executions. + +- **Test Management**: The API supports scheduling new test runs and canceling existing ones, providing flexibility in managing test execution according to dynamic testing requirements or conditions. + +- **Integration Friendly**: The REST API's standard interface ensures it can be easily integrated with external tools and systems, enhancing Assertoor's utility in automated testing environments. + +### Accessing the API Documentation: + +The detailed API documentation, including all supported endpoints, request formats, and response structures, is accessible via the Assertoor web UI. This comprehensive documentation is designed to be user-friendly, offering examples and explanations to facilitate easy adoption and integration of the API into your workflows. + +To access the API documentation, ensure the Assertoor web interface is enabled and navigate to the designated URL. The documentation provides interactive examples and the ability to test endpoints directly from your browser, offering a hands-on approach to learning and utilizing the REST API. + diff --git a/docs/04-test-config.md b/docs/04-test-config.md new file mode 100644 index 00000000..da7a103e --- /dev/null +++ b/docs/04-test-config.md @@ -0,0 +1,71 @@ +# Test Configuration + +Assertoor allows you to set up tests to check various aspects of the Ethereum network. You can organize these tests in two ways: directly within your main configuration file or through external files for more complex scenarios. Here’s how it works: + +## Local Tests + +Local tests are defined in your main Assertoor configuration file. You can list tasks that you want to run as part of your test, along with any cleanup tasks to run afterward, regardless of whether your test passes or fails. + +```yaml +- id: "test1" + name: "Test with local tasks" + timeout: "48h" + config: {} + tasks: [] + cleanupTasks: [] + schedule: + startup: true + cron: + - "* * * * *" + ``` + +- **`id`**:\ + A unique identifier for your test. +- **`name`**:\ + The test's name. +- **`timeout`**:\ + How long to run the test before stopping it. This is optional. +- **`config`**:\ + A place to set static variables for your test. Optional. +- **`tasks`**:\ + The tasks to run for your test. +- **`cleanupTasks`**:\ + Tasks that clean up after your main tasks. These run no matter if the main tasks pass or fail. This is optional. +- **`schedule`**:\ + Determines when your test runs. You can set it to start when Assertoor starts or on a schedule using cron format. This is optional. + +## External Tests + +External test playbooks, loaded via the `file` attribute in the Assertoor configuration, follow a structured format. These playbooks allow for defining comprehensive tests with specific tasks, variable configurations, and scheduling options. + +**Example External Test Playbook:** + +```yaml +id: test1 +name: "Test 1" +timeout: 1h +config: + # walletPrivkey: "" + # validatorPairNames: [] +configVars: {} +tasks: [] +cleanupTasks: [] +schedule: + startup: true + cron: + - "* * * * *" +``` + +**Key Properties Explained:** + +- **`id`**: A unique identifier for the test, allowing for easy reference. +- **`name`**: The descriptive name of the test, providing clarity on its purpose. +- **`timeout`**: Specifies the duration after which the test should be considered failed if not completed. +- **`config`**: Static variable configuration, where you can define variables directly used by the test. +- **`configVars`**: Dynamic variable configuration that copies variables from the global scope, supporting complex expressions through jq syntax. +- **`tasks`**: The list of tasks to be executed as part of the test. Refer to the task configuration section for detailed task structures. +- **`cleanupTasks`**: Specifies tasks to be executed after the main tasks, regardless of their success or failure. +- **`schedule`**: Determines when the test should be run. If omitted, the test is scheduled to start upon Assertoor startup. It also supports cron expressions for more precise scheduling. + +This format provides a flexible and powerful way to define tests outside the main configuration file, allowing for modular test management and reusability across different scenarios or environments. + diff --git a/docs/03-task-config.md b/docs/05-task-config.md similarity index 100% rename from docs/03-task-config.md rename to docs/05-task-config.md diff --git a/go.mod b/go.mod index 49be6b7e..6edea3ec 100644 --- a/go.mod +++ b/go.mod @@ -1,25 +1,25 @@ module github.com/ethpandaops/assertoor -go 1.21 +go 1.21.1 require ( - github.com/attestantio/go-eth2-client v0.19.10 + github.com/attestantio/go-eth2-client v0.21.1 github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0 - github.com/ethereum/go-ethereum v1.13.8 + github.com/ethereum/go-ethereum v1.13.14 github.com/ethpandaops/ethwallclock v0.3.0 github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75 github.com/gorilla/mux v1.8.1 - github.com/herumi/bls-eth-go-binary v1.31.0 + github.com/herumi/bls-eth-go-binary v1.33.0 github.com/holiman/uint256 v1.2.4 - github.com/itchyny/gojq v0.12.14 + github.com/itchyny/gojq v0.12.15 github.com/juliangruber/go-intersect v1.1.0 github.com/mashingan/smapping v0.1.19 - github.com/prometheus/client_golang v1.17.0 - github.com/protolambda/zrnt v0.30.0 + github.com/prometheus/client_golang v1.19.0 + github.com/protolambda/zrnt v0.32.3 github.com/protolambda/ztyp v0.2.2 - github.com/rs/zerolog v1.29.1 + github.com/rs/zerolog v1.32.0 github.com/sirupsen/logrus v1.9.3 - github.com/spf13/cobra v1.5.0 + github.com/spf13/cobra v1.8.0 github.com/swaggo/http-swagger v1.3.4 github.com/swaggo/swag v1.16.3 github.com/tdewolff/minify v2.3.6+incompatible @@ -33,72 +33,70 @@ require ( require ( github.com/KyleBanks/depth v1.2.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/StackExchange/wmi v1.2.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.1 // indirect github.com/fatih/color v1.16.0 // indirect github.com/ferranbt/fastssz v0.1.3 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.5 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/spec v0.20.6 // indirect - github.com/go-openapi/swag v0.19.15 // indirect - github.com/goccy/go-yaml v1.9.5 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/websocket v1.4.2 // indirect - github.com/huandu/go-clone v1.6.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/goccy/go-yaml v1.11.3 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/huandu/go-clone v1.7.2 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/itchyny/timefmt-go v0.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/kilic/bls12-381 v0.1.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect - github.com/mailru/easyjson v0.7.6 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.11.1 // indirect - github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 // indirect - github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect + github.com/prometheus/client_model v0.6.0 // indirect + github.com/prometheus/common v0.51.1 // indirect + github.com/prometheus/procfs v0.13.0 // indirect + github.com/protolambda/bls12-381-util v0.1.0 // indirect + github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e // indirect github.com/r3labs/sse/v2 v2.10.0 // indirect - github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/supranational/blst v0.3.11 // indirect - github.com/swaggo/files v0.0.0-20220610200504-28940afbdbfe // indirect + github.com/swaggo/files v1.0.1 // indirect github.com/tdewolff/parse v2.3.4+incompatible // indirect github.com/tdewolff/test v1.0.10 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/wealdtech/go-bytesutil v1.2.1 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.18.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/tools v0.15.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/tools v0.19.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/go.sum b/go.sum index 1a2274d8..f3d4a42d 100644 --- a/go.sum +++ b/go.sum @@ -4,22 +4,18 @@ github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/agiledragon/gomonkey/v2 v2.3.1 h1:k+UnUY0EMNYUFUAQVETGY9uUTxjMdnUkP0ARyJS1zzs= -github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= -github.com/attestantio/go-eth2-client v0.19.10 h1:NLs9mcBvZpBTZ3du7Ey2NHQoj8d3UePY7pFBXX6C6qs= -github.com/attestantio/go-eth2-client v0.19.10/go.mod h1:TTz7YF6w4z6ahvxKiHuGPn6DbQn7gH6HPuWm/DEQeGE= +github.com/attestantio/go-eth2-client v0.21.1 h1:yvsMd/azPUbxiJzWZhgqfOJJRNF1zLvAJpcBXTHzyh8= +github.com/attestantio/go-eth2-client v0.21.1/go.mod h1:Tb412NpzhsC0sbtpXS4D51y5se6nDkWAi6amsJrqX9c= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= -github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= @@ -43,69 +39,65 @@ github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0 h1:C7t6eeMaEQVy6e8CarIhscYQlNmw5e3G36y7l7Y21Ao= github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0/go.mod h1:56wL82FO0bfMU5RvfXoIwSOP2ggqqxT+tAfNEIyxuHw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.8 h1:1od+thJel3tM52ZUNQwvpYOeRHlbkVFZ5S8fhi0Lgsg= -github.com/ethereum/go-ethereum v1.13.8/go.mod h1:sc48XYQxCzH3fG9BcrXCOOgQk2JfZzNAmIKnceogzsA= +github.com/ethereum/c-kzg-4844 v1.0.1 h1:pGixCbGizcVKSwoV70ge48+PrbB+iSKs2rjgfE4yJmQ= +github.com/ethereum/c-kzg-4844 v1.0.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= +github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= github.com/ethpandaops/ethwallclock v0.3.0 h1:xF5fwtBf+bHFHZKBnwiPFEuelW3sMM7SD3ZNFq1lJY4= github.com/ethpandaops/ethwallclock v0.3.0/go.mod h1:y0Cu+mhGLlem19vnAV2x0hpFS5KZ7oOi2SWYayv9l24= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/ferranbt/fastssz v0.1.3 h1:ZI+z3JH05h4kgmFXdHuR1aWYsgrg7o+Fw7/NCzM16Mo= github.com/ferranbt/fastssz v0.1.3/go.mod h1:0Y9TEd/9XuFlh7mskMPfXiI2Dkw4Ddg9EyXt1W7MRvE= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/spec v0.20.6 h1:ich1RQ3WDbfoeTqTAb+5EIxNmpKVJZWBNah9RAT0jIQ= -github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/goccy/go-yaml v1.9.5 h1:Eh/+3uk9kLxG4koCX6lRMAPS1OaMSAi+FJcya0INdB0= -github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= +github.com/goccy/go-yaml v1.11.3 h1:B3W9IdWbvrUu2OYQGwvU1nZtvMQJPBKgBUuweJjLj6I= +github.com/goccy/go-yaml v1.11.3/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= @@ -113,33 +105,27 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75 h1:f0n1xnMSmBLzVfsMMvriDyA75NB/oBgILX2GcHXIQzY= github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/herumi/bls-eth-go-binary v1.31.0 h1:9eeW3EA4epCb7FIHt2luENpAW69MvKGL5jieHlBiP+w= -github.com/herumi/bls-eth-go-binary v1.31.0/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/herumi/bls-eth-go-binary v1.33.0 h1:fHoysK+WbL/FQIJoVGECGd2lBLa2De7YjAGZljI2vzQ= +github.com/herumi/bls-eth-go-binary v1.33.0/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= @@ -147,16 +133,16 @@ github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= -github.com/huandu/go-clone v1.6.0 h1:HMo5uvg4wgfiy5FoGOqlFLQED/VGRm2D9Pi8g1FXPGc= -github.com/huandu/go-clone v1.6.0/go.mod h1:ReGivhG6op3GYr+UY3lS6mxjKp7MIGTknuU5TbTVaXE= +github.com/huandu/go-clone v1.7.2 h1:3+Aq0Ed8XK+zKkLjE2dfHg0XrpIfcohBE1K+c8Usxoo= +github.com/huandu/go-clone v1.7.2/go.mod h1:ReGivhG6op3GYr+UY3lS6mxjKp7MIGTknuU5TbTVaXE= github.com/huandu/go-clone/generic v1.6.0 h1:Wgmt/fUZ28r16F2Y3APotFD59sHk1p78K0XLdbUYN5U= github.com/huandu/go-clone/generic v1.6.0/go.mod h1:xgd9ZebcMsBWWcBx5mVMCoqMX24gLWr5lQicr+nVXNs= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/itchyny/gojq v0.12.14 h1:6k8vVtsrhQSYgSGg827AD+PVVaB1NLXEdX+dda2oZCc= -github.com/itchyny/gojq v0.12.14/go.mod h1:y1G7oO7XkcR1LPZO59KyoCRy08T3j9vDYRV0GgYSS+s= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/itchyny/gojq v0.12.15 h1:WC1Nxbx4Ifw5U2oQWACYz32JK8G9qxNtHzrvW4KEcqI= +github.com/itchyny/gojq v0.12.15/go.mod h1:uWAHCbCIla1jiNxmeT5/B5mOjSdfkCq6p8vxWg+BM10= github.com/itchyny/timefmt-go v0.1.5 h1:G0INE2la8S6ru/ZI5JecgyzbbJNs5lG1RcBqa7Jm6GE= github.com/itchyny/timefmt-go v0.1.5/go.mod h1:nEP7L+2YmAbT2kZ2HfSs1d8Xtw9LY8D2stDBckWakZ8= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -169,9 +155,8 @@ github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4 github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= -github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -185,26 +170,18 @@ github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7 github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mashingan/smapping v0.1.19 h1:SsEtuPn2UcM1croIupPtGLgWgpYRuS0rSQMvKD9g2BQ= github.com/mashingan/smapping v0.1.19/go.mod h1:FjfiwFxGOuNxL/OT1WcrNAwTPx0YJeg5JiXwBB1nyig= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -214,7 +191,6 @@ github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pk910/go-eth2-client v0.0.0-20231217052657-39326b2b91a7 h1:JG2FFabNp3W1bmUbJeiAV4WPFuaNnVO4y4G9WXLsXPo= @@ -225,62 +201,56 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= -github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= -github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= -github.com/protolambda/bls12-381-util v0.0.0-20210720105258-a772f2aac13e/go.mod h1:MPZvj2Pr0N8/dXyTPS5REeg2sdLG7t8DRzC1rLv925w= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= -github.com/protolambda/messagediff v1.4.0/go.mod h1:LboJp0EwIbJsePYpzh5Op/9G1/4mIztMRYzzwR0dR2M= -github.com/protolambda/zrnt v0.30.0 h1:pHEn69ZgaDFGpLGGYG1oD7DvYI7RDirbMBPfbC+8p4g= -github.com/protolambda/zrnt v0.30.0/go.mod h1:qcdX9CXFeVNCQK/q0nswpzhd+31RHMk2Ax/2lMsJ4Jw= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= +github.com/prometheus/common v0.51.1 h1:eIjN50Bwglz6a/c3hAgSMcofL3nD+nFQkV6Dd4DsQCw= +github.com/prometheus/common v0.51.1/go.mod h1:lrWtQx+iDfn2mbH5GUzlH9TSHyfZpHkSiG1W7y3sF2Q= +github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= +github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= +github.com/protolambda/bls12-381-util v0.1.0 h1:05DU2wJN7DTU7z28+Q+zejXkIsA/MF8JZQGhtBZZiWk= +github.com/protolambda/bls12-381-util v0.1.0/go.mod h1:cdkysJTRpeFeuUVx/TXGDQNMTiRAalk1vQw3TYTHcE4= +github.com/protolambda/zrnt v0.32.3 h1:b3mkBEjcmxtft115cBIQk+2qz1HEb2ExDdduVQqN4v0= +github.com/protolambda/zrnt v0.32.3/go.mod h1:A0fezkp9Tt3GBLATSPIbuY4ywYESyAuc/FFmPKg8Lqs= github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNyY= github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e h1:ATgOe+abbzfx9kCPeXIW4fiWyDdxlwHw07j8UGhdTd4= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= github.com/r3labs/sse/v2 v2.10.0 h1:hFEkLLFY4LDifoHdiCN/LlGBAdVJYsANaLqNYa1l/v0= github.com/r3labs/sse/v2 v2.10.0/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktEmkNJ7I= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= -github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= +github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/swaggo/files v0.0.0-20220610200504-28940afbdbfe h1:K8pHPVoTgxFJt1lXuIzzOX7zZhZFldJQK/CgKx9BFIc= -github.com/swaggo/files v0.0.0-20220610200504-28940afbdbfe/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w= +github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= +github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= github.com/swaggo/http-swagger v1.3.4 h1:q7t/XLx0n15H1Q9/tk3Y9L4n210XzJF5WtnDX64a5ww= github.com/swaggo/http-swagger v1.3.4/go.mod h1:9dAh0unqMBAlbp1uE2Uc2mQTxNMU/ha4UbucIg1MFkQ= -github.com/swaggo/swag v1.8.1 h1:JuARzFX1Z1njbCGz+ZytBR15TFJwF2Q7fu8puJHhQYI= -github.com/swaggo/swag v1.8.1/go.mod h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ= github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= @@ -291,10 +261,10 @@ github.com/tdewolff/parse v2.3.4+incompatible h1:x05/cnGwIMf4ceLuDMBOdQ1qGniMoxp github.com/tdewolff/parse v2.3.4+incompatible/go.mod h1:8oBwCsVmUkgHO8M5iCzSIDtpzXOT0WXX9cWhz+bIzJQ= github.com/tdewolff/test v1.0.10 h1:uWiheaLgLcNFqHcdWveum7PQfMnIUTf9Kl3bFxrIoew= github.com/tdewolff/test v1.0.10/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/umbracle/gohashtree v0.0.2-alpha.0.20230207094856-5b775a815c10 h1:CQh33pStIp/E30b7TxDlXfM0145bn2e8boI30IxAhTg= @@ -311,71 +281,77 @@ github.com/wealdtech/go-eth2-util v1.8.2 h1:gq+JMrnadifyKadUr75wmfP7+usiqMu9t3VV github.com/wealdtech/go-eth2-util v1.8.2/go.mod h1:/80GAK0K/3+PqUBZHvaOPd3b1sjHeimxQh1nrJzgaPk= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191116160921-f9c825593386/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= @@ -384,8 +360,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= diff --git a/pkg/coordinator/clients/consensus/blockcache.go b/pkg/coordinator/clients/consensus/blockcache.go index a45c51b5..f3710e96 100644 --- a/pkg/coordinator/clients/consensus/blockcache.go +++ b/pkg/coordinator/clients/consensus/blockcache.go @@ -224,6 +224,7 @@ func (cache *BlockCache) getCachedValidatorSet(loadFn func() map[phase0.Validato valsetMap := loadFn() if valsetMap != nil { cache.valsetMap = valsetMap + cache.valsetEpoch = epoch } } diff --git a/pkg/coordinator/clients/consensus/clienttype.go b/pkg/coordinator/clients/consensus/clienttype.go index 305ec1ab..9c3b8b7f 100644 --- a/pkg/coordinator/clients/consensus/clienttype.go +++ b/pkg/coordinator/clients/consensus/clienttype.go @@ -8,14 +8,14 @@ import ( type ClientType int8 var ( - UnspecifiedClient ClientType - UnknownClient ClientType = -1 - LighthouseClient ClientType = 1 - LodestarClient ClientType = 2 - NimbusClient ClientType = 3 - PrysmClient ClientType = 4 - TekuClient ClientType = 5 - GrandineClient ClientType = 6 + AnyClient ClientType + UnknownClient ClientType = -1 + LighthouseClient ClientType = 1 + LodestarClient ClientType = 2 + NimbusClient ClientType = 3 + PrysmClient ClientType = 4 + TekuClient ClientType = 5 + GrandineClient ClientType = 6 ) var clientTypePatterns = map[ClientType]*regexp.Regexp{ LighthouseClient: regexp.MustCompile("(?i)^Lighthouse/.*"), diff --git a/pkg/coordinator/clients/consensus/pool.go b/pkg/coordinator/clients/consensus/pool.go index ea98a99b..57b58f18 100644 --- a/pkg/coordinator/clients/consensus/pool.go +++ b/pkg/coordinator/clients/consensus/pool.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "sync" + "time" v1 "github.com/attestantio/go-eth2-client/api/v1" "github.com/attestantio/go-eth2-client/spec/phase0" @@ -70,7 +71,7 @@ func (pool *Pool) GetBlockCache() *BlockCache { func (pool *Pool) GetValidatorSet() map[phase0.ValidatorIndex]*v1.Validator { return pool.blockCache.getCachedValidatorSet(func() map[phase0.ValidatorIndex]*v1.Validator { - client := pool.GetReadyEndpoint(UnspecifiedClient) + client := pool.GetReadyEndpoint(AnyClient) if client == nil { pool.logger.Errorf("could not load validator set: no ready client") return nil @@ -120,6 +121,21 @@ func (pool *Pool) GetReadyEndpoint(clientType ClientType) *Client { return selectedClient } +func (pool *Pool) AwaitReadyEndpoint(ctx context.Context, clientType ClientType) *Client { + for { + client := pool.GetReadyEndpoint(clientType) + if client != nil { + return client + } + + select { + case <-ctx.Done(): + return nil + case <-time.After(1 * time.Second): + } + } +} + func (pool *Pool) IsClientReady(client *Client) bool { if client == nil { return false @@ -148,7 +164,7 @@ func (pool *Pool) runClientScheduler(readyClients []*Client, clientType ClientTy var firstReadyClient *Client for _, client := range readyClients { - if clientType != UnspecifiedClient && clientType != client.clientType { + if clientType != AnyClient && clientType != client.clientType { continue } diff --git a/pkg/coordinator/clients/execution/clienttype.go b/pkg/coordinator/clients/execution/clienttype.go index e7ab4576..ad2195ca 100644 --- a/pkg/coordinator/clients/execution/clienttype.go +++ b/pkg/coordinator/clients/execution/clienttype.go @@ -8,14 +8,14 @@ import ( type ClientType int8 var ( - UnspecifiedClient ClientType - UnknownClient ClientType = -1 - BesuClient ClientType = 1 - ErigonClient ClientType = 2 - EthjsClient ClientType = 3 - GethClient ClientType = 4 - NethermindClient ClientType = 5 - RethClient ClientType = 6 + AnyClient ClientType + UnknownClient ClientType = -1 + BesuClient ClientType = 1 + ErigonClient ClientType = 2 + EthjsClient ClientType = 3 + GethClient ClientType = 4 + NethermindClient ClientType = 5 + RethClient ClientType = 6 ) var clientTypePatterns = map[ClientType]*regexp.Regexp{ BesuClient: regexp.MustCompile("(?i)^Besu/.*"), diff --git a/pkg/coordinator/clients/execution/pool.go b/pkg/coordinator/clients/execution/pool.go index aa192fc2..e6429e7b 100644 --- a/pkg/coordinator/clients/execution/pool.go +++ b/pkg/coordinator/clients/execution/pool.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "sync" + "time" "github.com/sirupsen/logrus" ) @@ -91,6 +92,21 @@ func (pool *Pool) GetReadyEndpoint(clientType ClientType) *Client { return selectedClient } +func (pool *Pool) AwaitReadyEndpoint(ctx context.Context, clientType ClientType) *Client { + for { + client := pool.GetReadyEndpoint(clientType) + if client != nil { + return client + } + + select { + case <-ctx.Done(): + return nil + case <-time.After(1 * time.Second): + } + } +} + func (pool *Pool) GetReadyEndpoints() []*Client { canonicalFork := pool.GetCanonicalFork(-1) if canonicalFork == nil { @@ -133,7 +149,7 @@ func (pool *Pool) runClientScheduler(readyClients []*Client, clientType ClientTy var firstReadyClient *Client for _, client := range readyClients { - if clientType != UnspecifiedClient && clientType != client.clientType { + if clientType != AnyClient && clientType != client.clientType { continue } diff --git a/pkg/coordinator/coordinator.go b/pkg/coordinator/coordinator.go index 3b62f35a..c3c63abf 100644 --- a/pkg/coordinator/coordinator.go +++ b/pkg/coordinator/coordinator.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "net/http" + "runtime" "runtime/debug" "sort" "sync" @@ -11,6 +12,7 @@ import ( "github.com/ethpandaops/assertoor/pkg/coordinator/buildinfo" "github.com/ethpandaops/assertoor/pkg/coordinator/clients" + "github.com/ethpandaops/assertoor/pkg/coordinator/clients/consensus" "github.com/ethpandaops/assertoor/pkg/coordinator/logger" "github.com/ethpandaops/assertoor/pkg/coordinator/names" "github.com/ethpandaops/assertoor/pkg/coordinator/test" @@ -138,6 +140,9 @@ func (c *Coordinator) Run(ctx context.Context) error { // start test cleanup routine go c.runTestCleanup(ctx) + // start per epoch GC routine + go c.runEpochGC(ctx) + // run tests c.runTestExecutionLoop(ctx) @@ -164,8 +169,12 @@ func (c *Coordinator) ValidatorNames() *names.ValidatorNames { return c.validatorNames } +func (c *Coordinator) GlobalVariables() types.Variables { + return c.globalVars +} + func (c *Coordinator) LoadTests(ctx context.Context) { - descriptors := test.LoadTestDescriptors(ctx, c.Config.Tests, c.Config.ExternalTests) + descriptors := test.LoadTestDescriptors(ctx, c.globalVars, c.Config.Tests, c.Config.ExternalTests) errCount := 0 c.testDescriptorsMutex.Lock() @@ -325,7 +334,7 @@ func (c *Coordinator) createTestRun(descriptor types.TestDescriptor, configOverr c.runIDCounter++ runID := c.runIDCounter - testRef, err := test.CreateTest(runID, descriptor, c.Logger().WithField("module", "test"), c, c.globalVars) + testRef, err := test.CreateTest(runID, descriptor, c.Logger().WithField("module", "test"), c) if err != nil { return nil, fmt.Errorf("failed initializing test run #%v '%v': %w", runID, descriptor.Config().Name, err) } @@ -538,3 +547,70 @@ func (c *Coordinator) cleanupTestHistory(retentionTime time.Duration) { c.testHistory = cleanedHistory } + +func (c *Coordinator) runEpochGC(ctx context.Context) { + defer func() { + if err := recover(); err != nil { + c.log.GetLogger().WithError(err.(error)).Panicf("uncaught panic in coordinator.runEpochGC: %v, stack: %v", err, string(debug.Stack())) + } + }() + + // await client readiness, which implies cache initialization + if c.clientPool.GetConsensusPool().AwaitReadyEndpoint(ctx, consensus.AnyClient) == nil { + return + } + + genesis := c.clientPool.GetConsensusPool().GetBlockCache().GetGenesis() + specs := c.clientPool.GetConsensusPool().GetBlockCache().GetSpecs() + + for { + var sleepTime time.Duration + + networkTime := time.Since(genesis.GenesisTime) + if networkTime < 0 { + sleepTime = networkTime.Abs() + } else { + currentSlot := uint64(networkTime / specs.SecondsPerSlot) + currentEpoch := currentSlot / specs.SlotsPerEpoch + currentSlotIndex := currentSlot % specs.SlotsPerEpoch + nextGcSlot := uint64(0) + + gcSlotDiff := uint64(2) + if gcSlotDiff > specs.SlotsPerEpoch/2 { + gcSlotDiff = 1 + } + + gcSlotIndex := specs.SlotsPerEpoch - gcSlotDiff - 1 + + if currentSlotIndex == gcSlotIndex { + select { + case <-ctx.Done(): + return + case <-time.After(specs.SecondsPerSlot / 2): + } + + nextEpochDuration := time.Until(genesis.GenesisTime.Add(time.Duration((currentEpoch+1)*specs.SlotsPerEpoch) * specs.SecondsPerSlot)) + + c.log.GetLogger().Infof("run GC (slot %v, %v sec before epoch %v)", currentSlot, nextEpochDuration.Seconds(), currentEpoch+1) + runtime.GC() + + nextGcSlot = currentSlot + specs.SlotsPerEpoch + } else { + if currentSlotIndex < gcSlotIndex { + nextGcSlot = currentSlot + (gcSlotIndex - currentSlotIndex) + } else { + nextGcSlot = currentSlot + (specs.SlotsPerEpoch - currentSlotIndex) + gcSlotIndex + } + } + + nextRunTime := genesis.GenesisTime.Add(time.Duration(nextGcSlot) * specs.SecondsPerSlot) + sleepTime = time.Until(nextRunTime) + } + + select { + case <-ctx.Done(): + return + case <-time.After(sleepTime): + } + } +} diff --git a/pkg/coordinator/tasks/check_clients_are_healthy/README.md b/pkg/coordinator/tasks/check_clients_are_healthy/README.md index 2a90976a..4f1086ef 100644 --- a/pkg/coordinator/tasks/check_clients_are_healthy/README.md +++ b/pkg/coordinator/tasks/check_clients_are_healthy/README.md @@ -23,6 +23,12 @@ The `check_clients_are_healthy` task is designed to ensure the health of specifi - **`minClientCount`**:\ The minimum number of clients that must match the `clientNamePatterns` and pass the health checks for the task to succeed. A value of 0 indicates that all matching clients need to pass the health check. Use this to set a threshold for the number of healthy clients required by your test scenario. +- **`maxUnhealthyCount`**:\ + Specifies the maximum number of unhealthy clients allowed before the health check fails. A value of 0 means that any unhealthy client will cause the health check to fail, enforcing strict health criteria. + +- **`failOnCheckMiss`**: \ + Determines the task's behavior when a health check fails. If true, the task reports a failure upon the first unsuccessful health check. If false, the task continues to poll the clients until a successful check occurs, allowing for temporary issues to be resolved without immediate failure. + ### Defaults These are the default settings for the `check_clients_are_healthy` task: @@ -36,4 +42,6 @@ These are the default settings for the `check_clients_are_healthy` task: skipExecutionCheck: false expectUnhealthy: false minClientCount: 0 + maxUnhealthyCount: -1 + failOnCheckMiss: false ``` diff --git a/pkg/coordinator/tasks/check_clients_are_healthy/config.go b/pkg/coordinator/tasks/check_clients_are_healthy/config.go index b58f06b8..69f9781d 100644 --- a/pkg/coordinator/tasks/check_clients_are_healthy/config.go +++ b/pkg/coordinator/tasks/check_clients_are_healthy/config.go @@ -13,11 +13,14 @@ type Config struct { SkipExecutionCheck bool `yaml:"skipExecutionCheck" json:"skipExecutionCheck"` ExpectUnhealthy bool `yaml:"expectUnhealthy" json:"expectUnhealthy"` MinClientCount int `yaml:"minClientCount" json:"minClientCount"` + MaxUnhealthyCount int `yaml:"maxUnhealthyCount" json:"maxUnhealthyCount"` + FailOnCheckMiss bool `yaml:"failOnCheckMiss" json:"failOnCheckMiss"` } func DefaultConfig() Config { return Config{ - PollInterval: human.Duration{Duration: 5 * time.Second}, + PollInterval: human.Duration{Duration: 5 * time.Second}, + MaxUnhealthyCount: -1, } } diff --git a/pkg/coordinator/tasks/check_clients_are_healthy/task.go b/pkg/coordinator/tasks/check_clients_are_healthy/task.go index a4442d3a..4e4ab42d 100644 --- a/pkg/coordinator/tasks/check_clients_are_healthy/task.go +++ b/pkg/coordinator/tasks/check_clients_are_healthy/task.go @@ -126,10 +126,21 @@ func (t *Task) processCheck() { t.logger.Infof("Check result: %v, Failed Clients: %v", resultPass, failedClients) - if resultPass { + switch { + case t.config.MaxUnhealthyCount > -1 && len(failedClients) >= t.config.MaxUnhealthyCount: + if t.config.FailOnCheckMiss { + t.ctx.SetResult(types.TaskResultFailure) + } else { + t.ctx.SetResult(types.TaskResultNone) + } + case resultPass: t.ctx.SetResult(types.TaskResultSuccess) - } else { - t.ctx.SetResult(types.TaskResultNone) + default: + if t.config.FailOnCheckMiss { + t.ctx.SetResult(types.TaskResultFailure) + } else { + t.ctx.SetResult(types.TaskResultNone) + } } } diff --git a/pkg/coordinator/tasks/check_consensus_block_proposals/task.go b/pkg/coordinator/tasks/check_consensus_block_proposals/task.go index 697d6f80..bc6211c5 100644 --- a/pkg/coordinator/tasks/check_consensus_block_proposals/task.go +++ b/pkg/coordinator/tasks/check_consensus_block_proposals/task.go @@ -348,7 +348,7 @@ func (t *Task) checkBlockSlashings(block *consensus.Block, blockData *spec.Versi slashingCount := len(attSlashings) + len(propSlashings) if slashingCount < t.config.MinSlashingCount { - t.logger.Infof("check failed for block %v [0x%x]: not enough exits (want: >= %v, have: %v)", block.Slot, block.Root, t.config.MinSlashingCount, slashingCount) + t.logger.Infof("check failed for block %v [0x%x]: not enough slashings (want: >= %v, have: %v)", block.Slot, block.Root, t.config.MinSlashingCount, slashingCount) return false } @@ -421,7 +421,7 @@ func (t *Task) checkBlockAttesterSlashings(block *consensus.Block, blockData *sp slashingCount := len(attSlashings) if slashingCount < t.config.MinAttesterSlashingCount { - t.logger.Infof("check failed for block %v [0x%x]: not enough exits (want: >= %v, have: %v)", block.Slot, block.Root, t.config.MinAttesterSlashingCount, slashingCount) + t.logger.Infof("check failed for block %v [0x%x]: not enough attester slashings (want: >= %v, have: %v)", block.Slot, block.Root, t.config.MinAttesterSlashingCount, slashingCount) return false } @@ -437,7 +437,7 @@ func (t *Task) checkBlockProposerSlashings(block *consensus.Block, blockData *sp slashingCount := len(propSlashings) if slashingCount < t.config.MinProposerSlashingCount { - t.logger.Infof("check failed for block %v [0x%x]: not enough exits (want: >= %v, have: %v)", block.Slot, block.Root, t.config.MinProposerSlashingCount, slashingCount) + t.logger.Infof("check failed for block %v [0x%x]: not enough proposer slashings (want: >= %v, have: %v)", block.Slot, block.Root, t.config.MinProposerSlashingCount, slashingCount) return false } diff --git a/pkg/coordinator/tasks/check_consensus_proposer_duty/task.go b/pkg/coordinator/tasks/check_consensus_proposer_duty/task.go index d94e2692..8d3b2f01 100644 --- a/pkg/coordinator/tasks/check_consensus_proposer_duty/task.go +++ b/pkg/coordinator/tasks/check_consensus_proposer_duty/task.go @@ -128,7 +128,11 @@ func (t *Task) Execute(ctx context.Context) error { } func (t *Task) loadEpochDuties(ctx context.Context, epoch uint64) { - client := t.ctx.Scheduler.GetServices().ClientPool().GetConsensusPool().GetReadyEndpoint(consensus.UnspecifiedClient) + client := t.ctx.Scheduler.GetServices().ClientPool().GetConsensusPool().AwaitReadyEndpoint(ctx, consensus.AnyClient) + if client == nil { + return + } + proposerDuties, err := client.GetRPCClient().GetProposerDuties(ctx, epoch) if err != nil { diff --git a/pkg/coordinator/tasks/check_consensus_slot_range/task.go b/pkg/coordinator/tasks/check_consensus_slot_range/task.go index 48bdfd34..61167825 100644 --- a/pkg/coordinator/tasks/check_consensus_slot_range/task.go +++ b/pkg/coordinator/tasks/check_consensus_slot_range/task.go @@ -115,6 +115,9 @@ func (t *Task) Execute(ctx context.Context) error { func (t *Task) runRangeCheck() (checkResult, isLower bool) { consensusPool := t.ctx.Scheduler.GetServices().ClientPool().GetConsensusPool() + if consensusPool.GetBlockCache().GetGenesis().GenesisTime.Compare(time.Now()) >= 0 { + return false, true + } currentSlot, currentEpoch, err := consensusPool.GetBlockCache().GetWallclock().Now() if err != nil { diff --git a/pkg/coordinator/tasks/check_consensus_validator_status/task.go b/pkg/coordinator/tasks/check_consensus_validator_status/task.go index b8f6e700..fb3453ec 100644 --- a/pkg/coordinator/tasks/check_consensus_validator_status/task.go +++ b/pkg/coordinator/tasks/check_consensus_validator_status/task.go @@ -132,11 +132,29 @@ func (t *Task) runValidatorStatusCheck() bool { } currentIndex := uint64(0) + matchingValidators := uint64(0) + pubkey := []byte{} + + var namePattern *regexp.Regexp + + if t.config.ValidatorPubKey != "" { + pubkey = common.FromHex(t.config.ValidatorPubKey) + } + + if t.config.ValidatorNamePattern != "" { + pattern, err := regexp.Compile(t.config.ValidatorNamePattern) + if err != nil { + t.logger.Errorf("check failed: validator name pattern invalid: %v", err) + return false + } + + namePattern = pattern + } for { validator := validatorSet[phase0.ValidatorIndex(currentIndex)] if validator == nil { - return false + break } currentIndex++ @@ -145,32 +163,19 @@ func (t *Task) runValidatorStatusCheck() bool { continue } - if t.config.ValidatorNamePattern != "" { - validatorName := t.ctx.Scheduler.GetServices().ValidatorNames().GetValidatorName(uint64(validator.Index)) - matched, err := regexp.MatchString(t.config.ValidatorNamePattern, validatorName) - - if err != nil { - t.logger.Errorf("check failed: validator name pattern invalid: %v", err) - return false - } - - if !matched { - continue - } + if t.config.ValidatorNamePattern != "" && !namePattern.MatchString(t.ctx.Scheduler.GetServices().ValidatorNames().GetValidatorName(uint64(validator.Index))) { + continue } - if t.config.ValidatorPubKey != "" { - pubkey := common.FromHex(t.config.ValidatorPubKey) - - if !bytes.Equal(pubkey, validator.Validator.PublicKey[:]) { - t.logger.Infof("check failed: no matching validator found") - continue - } + if t.config.ValidatorPubKey != "" && !bytes.Equal(pubkey, validator.Validator.PublicKey[:]) { + continue } // found a matching validator t.logger.Infof("validator found: index %v, status: %v", validator.Index, validator.Status.String()) + matchingValidators++ + if t.config.ValidatorInfoResultVar != "" { validatorJSON, err := json.Marshal(validator) if err == nil { @@ -204,4 +209,10 @@ func (t *Task) runValidatorStatusCheck() bool { return true } + + if matchingValidators == 0 { + t.logger.Infof("check failed: no matching validator found") + } + + return false } diff --git a/pkg/coordinator/tasks/generate_blob_transactions/task.go b/pkg/coordinator/tasks/generate_blob_transactions/task.go index 2592c83f..4c5d6eb0 100644 --- a/pkg/coordinator/tasks/generate_blob_transactions/task.go +++ b/pkg/coordinator/tasks/generate_blob_transactions/task.go @@ -335,22 +335,25 @@ func (t *Task) generateTransaction(ctx context.Context, transactionIdx uint64, c } err = nil + if len(clients) == 0 { + err = fmt.Errorf("no ready clients available") + } else { + for i := 0; i < len(clients); i++ { + client := clients[(transactionIdx+uint64(i))%uint64(len(clients))] - for i := 0; i < len(clients); i++ { - client := clients[(transactionIdx+uint64(i))%uint64(len(clients))] + t.logger.WithFields(logrus.Fields{ + "client": client.GetName(), + }).Infof("sending tx %v: %v", transactionIdx, tx.Hash().Hex()) - t.logger.WithFields(logrus.Fields{ - "client": client.GetName(), - }).Infof("sending tx %v: %v", transactionIdx, tx.Hash().Hex()) + err = client.GetRPCClient().SendTransaction(ctx, tx) + if err == nil { + break + } - err = client.GetRPCClient().SendTransaction(ctx, tx) - if err == nil { - break + t.logger.WithFields(logrus.Fields{ + "client": client.GetName(), + }).Warnf("RPC error when sending tx %v: %v", transactionIdx, err) } - - t.logger.WithFields(logrus.Fields{ - "client": client.GetName(), - }).Warnf("RPC error when sending tx %v: %v", transactionIdx, err) } if err != nil { diff --git a/pkg/coordinator/tasks/generate_bls_changes/task.go b/pkg/coordinator/tasks/generate_bls_changes/task.go index 34b2edb0..41760c7d 100644 --- a/pkg/coordinator/tasks/generate_bls_changes/task.go +++ b/pkg/coordinator/tasks/generate_bls_changes/task.go @@ -238,7 +238,10 @@ func (t *Task) generateBlsChange(ctx context.Context, accountIdx uint64) error { var client *consensus.Client if t.config.ClientPattern == "" && t.config.ExcludeClientPattern == "" { - client = clientPool.GetConsensusPool().GetReadyEndpoint(consensus.UnspecifiedClient) + client = clientPool.GetConsensusPool().AwaitReadyEndpoint(ctx, consensus.AnyClient) + if client == nil { + return ctx.Err() + } } else { clients := clientPool.GetClientsByNamePatterns(t.config.ClientPattern, t.config.ExcludeClientPattern) if len(clients) == 0 { diff --git a/pkg/coordinator/tasks/generate_deposits/task.go b/pkg/coordinator/tasks/generate_deposits/task.go index de8caf45..d90594f6 100644 --- a/pkg/coordinator/tasks/generate_deposits/task.go +++ b/pkg/coordinator/tasks/generate_deposits/task.go @@ -345,7 +345,10 @@ func (t *Task) generateDeposit(ctx context.Context, accountIdx uint64, onConfirm var client *execution.Client if t.config.ClientPattern == "" && t.config.ExcludeClientPattern == "" { - client = clientPool.GetExecutionPool().GetReadyEndpoint(execution.UnspecifiedClient) + client = clientPool.GetExecutionPool().AwaitReadyEndpoint(ctx, execution.AnyClient) + if client == nil { + return nil, nil, ctx.Err() + } } else { clients := clientPool.GetClientsByNamePatterns(t.config.ClientPattern, t.config.ExcludeClientPattern) if len(clients) == 0 { diff --git a/pkg/coordinator/tasks/generate_eoa_transactions/task.go b/pkg/coordinator/tasks/generate_eoa_transactions/task.go index ac813812..3b71119e 100644 --- a/pkg/coordinator/tasks/generate_eoa_transactions/task.go +++ b/pkg/coordinator/tasks/generate_eoa_transactions/task.go @@ -371,22 +371,25 @@ func (t *Task) generateTransaction(ctx context.Context, transactionIdx uint64, c } err = nil + if len(clients) == 0 { + err = fmt.Errorf("no ready clients available") + } else { + for i := 0; i < len(clients); i++ { + client := clients[(transactionIdx+uint64(i))%uint64(len(clients))] - for i := 0; i < len(clients); i++ { - client := clients[(transactionIdx+uint64(i))%uint64(len(clients))] + t.logger.WithFields(logrus.Fields{ + "client": client.GetName(), + }).Infof("sending tx %v: %v", transactionIdx, tx.Hash().Hex()) - t.logger.WithFields(logrus.Fields{ - "client": client.GetName(), - }).Infof("sending tx %v: %v", transactionIdx, tx.Hash().Hex()) + err = client.GetRPCClient().SendTransaction(ctx, tx) + if err == nil { + break + } - err = client.GetRPCClient().SendTransaction(ctx, tx) - if err == nil { - break + t.logger.WithFields(logrus.Fields{ + "client": client.GetName(), + }).Warnf("RPC error when sending tx %v: %v", transactionIdx, err) } - - t.logger.WithFields(logrus.Fields{ - "client": client.GetName(), - }).Warnf("RPC error when sending tx %v: %v", transactionIdx, err) } if err != nil { diff --git a/pkg/coordinator/tasks/generate_exits/task.go b/pkg/coordinator/tasks/generate_exits/task.go index 1fc916c3..156acd90 100644 --- a/pkg/coordinator/tasks/generate_exits/task.go +++ b/pkg/coordinator/tasks/generate_exits/task.go @@ -169,7 +169,10 @@ func (t *Task) Execute(ctx context.Context) error { } func (t *Task) loadChainState(ctx context.Context) (*phase0.Fork, error) { - client := t.ctx.Scheduler.GetServices().ClientPool().GetConsensusPool().GetReadyEndpoint(consensus.UnspecifiedClient) + client := t.ctx.Scheduler.GetServices().ClientPool().GetConsensusPool().AwaitReadyEndpoint(ctx, consensus.AnyClient) + if client == nil { + return nil, ctx.Err() + } fork, err := client.GetRPCClient().GetForkState(ctx, "head") if err != nil { @@ -212,7 +215,7 @@ func (t *Task) generateVoluntaryExit(ctx context.Context, accountIdx uint64, for clientPool := t.ctx.Scheduler.GetServices().ClientPool() if t.config.ClientPattern == "" && t.config.ExcludeClientPattern == "" { - client = clientPool.GetConsensusPool().GetReadyEndpoint(consensus.UnspecifiedClient) + client = clientPool.GetConsensusPool().GetReadyEndpoint(consensus.AnyClient) } else { clients := clientPool.GetClientsByNamePatterns(t.config.ClientPattern, t.config.ExcludeClientPattern) if len(clients) == 0 { diff --git a/pkg/coordinator/tasks/generate_slashings/task.go b/pkg/coordinator/tasks/generate_slashings/task.go index e7e9dc4f..b0d1bcfa 100644 --- a/pkg/coordinator/tasks/generate_slashings/task.go +++ b/pkg/coordinator/tasks/generate_slashings/task.go @@ -167,7 +167,10 @@ func (t *Task) Execute(ctx context.Context) error { } func (t *Task) loadChainState(ctx context.Context) (*phase0.Fork, error) { - client := t.ctx.Scheduler.GetServices().ClientPool().GetConsensusPool().GetReadyEndpoint(consensus.UnspecifiedClient) + client := t.ctx.Scheduler.GetServices().ClientPool().GetConsensusPool().AwaitReadyEndpoint(ctx, consensus.AnyClient) + if client == nil { + return nil, ctx.Err() + } forkState, err := client.GetRPCClient().GetForkState(ctx, "head") if err != nil { @@ -228,7 +231,7 @@ func (t *Task) generateSlashing(ctx context.Context, accountIdx uint64, forkStat var client *consensus.Client if t.config.ClientPattern == "" && t.config.ExcludeClientPattern == "" { - client = clientPool.GetConsensusPool().GetReadyEndpoint(consensus.UnspecifiedClient) + client = clientPool.GetConsensusPool().GetReadyEndpoint(consensus.AnyClient) } else { clients := clientPool.GetClientsByNamePatterns(t.config.ClientPattern, t.config.ExcludeClientPattern) if len(clients) == 0 { diff --git a/pkg/coordinator/tasks/generate_transaction/task.go b/pkg/coordinator/tasks/generate_transaction/task.go index b110831b..e83f3185 100644 --- a/pkg/coordinator/tasks/generate_transaction/task.go +++ b/pkg/coordinator/tasks/generate_transaction/task.go @@ -158,17 +158,20 @@ func (t *Task) Execute(ctx context.Context) error { } err = nil + if len(clients) == 0 { + err = fmt.Errorf("no ready clients available") + } else { + for i := 0; i < len(clients); i++ { + client := clients[i%len(clients)] - for i := 0; i < len(clients); i++ { - client := clients[i%len(clients)] - - t.logger.WithFields(logrus.Fields{ - "client": client.GetName(), - }).Infof("sending tx: %v", tx.Hash().Hex()) + t.logger.WithFields(logrus.Fields{ + "client": client.GetName(), + }).Infof("sending tx: %v", tx.Hash().Hex()) - err = client.GetRPCClient().SendTransaction(ctx, tx) - if err == nil { - break + err = client.GetRPCClient().SendTransaction(ctx, tx) + if err == nil { + break + } } } diff --git a/pkg/coordinator/test/descriptor.go b/pkg/coordinator/test/descriptor.go index 571bd81e..e210bc93 100644 --- a/pkg/coordinator/test/descriptor.go +++ b/pkg/coordinator/test/descriptor.go @@ -10,6 +10,7 @@ import ( "time" "github.com/ethpandaops/assertoor/pkg/coordinator/types" + "github.com/ethpandaops/assertoor/pkg/coordinator/vars" "gopkg.in/yaml.v3" ) @@ -17,18 +18,20 @@ type Descriptor struct { id string source string config *types.TestConfig + vars types.Variables err error } -func NewDescriptor(testID, testSrc string, config *types.TestConfig) *Descriptor { +func NewDescriptor(testID, testSrc string, config *types.TestConfig, variables types.Variables) *Descriptor { return &Descriptor{ id: testID, source: testSrc, config: config, + vars: variables, } } -func LoadTestDescriptors(ctx context.Context, localTests []*types.TestConfig, externalTests []*types.ExternalTestConfig) []types.TestDescriptor { +func LoadTestDescriptors(ctx context.Context, globalVars types.Variables, localTests []*types.TestConfig, externalTests []*types.ExternalTestConfig) []types.TestDescriptor { descriptors := []types.TestDescriptor{} // load local tests @@ -40,10 +43,20 @@ func LoadTestDescriptors(ctx context.Context, localTests []*types.TestConfig, ex testID = testSrc } + testVars := vars.NewVariables(globalVars) + + for k, v := range testCfg.Config { + testVars.SetVar(k, v) + } + + err := testVars.CopyVars(globalVars, testCfg.ConfigVars) + descriptors = append(descriptors, &Descriptor{ id: testID, source: testSrc, + vars: testVars, config: localTests[testIdx], + err: err, }) } @@ -52,7 +65,7 @@ func LoadTestDescriptors(ctx context.Context, localTests []*types.TestConfig, ex testSrc := fmt.Sprintf("external:%v", extTestCfg.File) testID := "" - testConfig, err := LoadExternalTestConfig(ctx, extTestCfg) + testConfig, testVars, err := LoadExternalTestConfig(ctx, globalVars, extTestCfg) if testConfig.ID != "" { testID = testConfig.ID @@ -66,6 +79,7 @@ func LoadTestDescriptors(ctx context.Context, localTests []*types.TestConfig, ex id: testID, source: testSrc, config: testConfig, + vars: testVars, err: err, }) } @@ -73,7 +87,7 @@ func LoadTestDescriptors(ctx context.Context, localTests []*types.TestConfig, ex return descriptors } -func LoadExternalTestConfig(ctx context.Context, extTestCfg *types.ExternalTestConfig) (*types.TestConfig, error) { +func LoadExternalTestConfig(ctx context.Context, globalVars types.Variables, extTestCfg *types.ExternalTestConfig) (*types.TestConfig, types.Variables, error) { var reader io.Reader if strings.HasPrefix(extTestCfg.File, "http://") || strings.HasPrefix(extTestCfg.File, "https://") { @@ -81,25 +95,25 @@ func LoadExternalTestConfig(ctx context.Context, extTestCfg *types.ExternalTestC req, err := http.NewRequestWithContext(ctx, "GET", extTestCfg.File, http.NoBody) if err != nil { - return nil, err + return nil, nil, err } resp, err := client.Do(req) if err != nil { - return nil, err + return nil, nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error loading test config from url: %v, result: %v %v", extTestCfg.File, resp.StatusCode, resp.Status) + return nil, nil, fmt.Errorf("error loading test config from url: %v, result: %v %v", extTestCfg.File, resp.StatusCode, resp.Status) } reader = resp.Body } else { f, err := os.Open(extTestCfg.File) if err != nil { - return nil, fmt.Errorf("error loading test config from file %v: %w", extTestCfg.File, err) + return nil, nil, fmt.Errorf("error loading test config from file %v: %w", extTestCfg.File, err) } defer f.Close() @@ -109,10 +123,11 @@ func LoadExternalTestConfig(ctx context.Context, extTestCfg *types.ExternalTestC decoder := yaml.NewDecoder(reader) testConfig := &types.TestConfig{} + testVars := vars.NewVariables(nil) err := decoder.Decode(testConfig) if err != nil { - return nil, fmt.Errorf("error decoding external test config %v: %v", extTestCfg.File, err) + return nil, nil, fmt.Errorf("error decoding external test config %v: %v", extTestCfg.File, err) } if testConfig.Config == nil { @@ -123,6 +138,19 @@ func LoadExternalTestConfig(ctx context.Context, extTestCfg *types.ExternalTestC testConfig.ConfigVars = map[string]string{} } + for k, v := range testConfig.Config { + testVars.SetVar(k, v) + } + + err = testVars.CopyVars(globalVars, testConfig.ConfigVars) + if err != nil { + return nil, nil, fmt.Errorf("error decoding external test configVars %v: %v", extTestCfg.File, err) + } + + for k, v := range globalVars.GetVarsMap() { + testVars.SetVar(k, v) + } + if extTestCfg.ID != "" { testConfig.ID = extTestCfg.ID } @@ -137,13 +165,19 @@ func LoadExternalTestConfig(ctx context.Context, extTestCfg *types.ExternalTestC for k, v := range extTestCfg.Config { testConfig.Config[k] = v + testVars.SetVar(k, v) + } + + err = testVars.CopyVars(globalVars, extTestCfg.ConfigVars) + if err != nil { + return nil, nil, fmt.Errorf("error decoding external test configVars %v: %v", extTestCfg.File, err) } for k, v := range extTestCfg.ConfigVars { testConfig.ConfigVars[k] = v } - return testConfig, nil + return testConfig, testVars, nil } func (d *Descriptor) ID() string { @@ -158,6 +192,10 @@ func (d *Descriptor) Config() *types.TestConfig { return d.config } +func (d *Descriptor) Vars() types.Variables { + return d.vars +} + func (d *Descriptor) Err() error { return d.err } diff --git a/pkg/coordinator/test/test.go b/pkg/coordinator/test/test.go index e80a2a11..a3d4b46c 100644 --- a/pkg/coordinator/test/test.go +++ b/pkg/coordinator/test/test.go @@ -24,7 +24,7 @@ type Test struct { timeout time.Duration } -func CreateTest(runID uint64, descriptor types.TestDescriptor, logger logrus.FieldLogger, services types.TaskServices, variables types.Variables) (types.Test, error) { +func CreateTest(runID uint64, descriptor types.TestDescriptor, logger logrus.FieldLogger, services types.TaskServices) (types.Test, error) { test := &Test{ runID: runID, logger: logger.WithField("RunID", runID).WithField("TestID", descriptor.ID()), @@ -37,15 +37,7 @@ func CreateTest(runID uint64, descriptor types.TestDescriptor, logger logrus.Fie } // set test variables - test.variables = variables.NewScope() - for name, value := range test.config.Config { - test.variables.SetVar(name, value) - } - - err := test.variables.CopyVars(variables, test.config.ConfigVars) - if err != nil { - return nil, err - } + test.variables = descriptor.Vars() // parse tasks test.taskScheduler = scheduler.NewTaskScheduler(test.logger, services, test.variables) diff --git a/pkg/coordinator/types/coordinator.go b/pkg/coordinator/types/coordinator.go index 8c223c9b..89bbbe4f 100644 --- a/pkg/coordinator/types/coordinator.go +++ b/pkg/coordinator/types/coordinator.go @@ -16,6 +16,7 @@ type Coordinator interface { ClientPool() *clients.ClientPool WalletManager() *wallet.Manager ValidatorNames() *names.ValidatorNames + GlobalVariables() Variables LoadTests(ctx context.Context) AddTestDescriptor(testDescriptor TestDescriptor) error diff --git a/pkg/coordinator/types/test.go b/pkg/coordinator/types/test.go index cb7769af..67b69b8a 100644 --- a/pkg/coordinator/types/test.go +++ b/pkg/coordinator/types/test.go @@ -67,5 +67,6 @@ type TestDescriptor interface { ID() string Source() string Config() *TestConfig + Vars() Variables Err() error } diff --git a/pkg/coordinator/wallet/blobtx/blob_encode.go b/pkg/coordinator/wallet/blobtx/blob_encode.go index cb55e843..45e19fdd 100644 --- a/pkg/coordinator/wallet/blobtx/blob_encode.go +++ b/pkg/coordinator/wallet/blobtx/blob_encode.go @@ -63,7 +63,7 @@ func EncodeBlob(data []byte) (*BlobCommitment, error) { // build versioned hash blobCommitment.VersionedHash = sha256.Sum256(blobCommitment.Commitment[:]) - blobCommitment.VersionedHash[0] = params.BlobTxHashVersion + blobCommitment.VersionedHash[0] = 0x01 return &blobCommitment, nil } diff --git a/pkg/coordinator/wallet/wallet.go b/pkg/coordinator/wallet/wallet.go index 7ba6b847..bce4c789 100644 --- a/pkg/coordinator/wallet/wallet.go +++ b/pkg/coordinator/wallet/wallet.go @@ -74,7 +74,7 @@ func (wallet *Wallet) loadState() { go func() { for { - client := wallet.manager.clientPool.GetReadyEndpoint(execution.UnspecifiedClient) + client := wallet.manager.clientPool.GetReadyEndpoint(execution.AnyClient) if client == nil { time.Sleep(500 * time.Millisecond) continue @@ -287,7 +287,10 @@ func (wallet *Wallet) AwaitTransaction(ctx context.Context, tx *types.Transactio } } - client := wallet.manager.clientPool.GetCanonicalFork(0).ReadyClients[0] + client := wallet.manager.clientPool.AwaitReadyEndpoint(ctx, execution.AnyClient) + if client == nil { + return nil, ctx.Err() + } return client.GetRPCClient().GetTransactionReceipt(ctx, txHash) } diff --git a/pkg/coordinator/web/api/post_tests_register_api.go b/pkg/coordinator/web/api/post_tests_register_api.go index 8036a1e9..dfc74922 100644 --- a/pkg/coordinator/web/api/post_tests_register_api.go +++ b/pkg/coordinator/web/api/post_tests_register_api.go @@ -9,6 +9,7 @@ import ( "github.com/ethpandaops/assertoor/pkg/coordinator/human-duration" "github.com/ethpandaops/assertoor/pkg/coordinator/test" "github.com/ethpandaops/assertoor/pkg/coordinator/types" + "github.com/ethpandaops/assertoor/pkg/coordinator/vars" "gopkg.in/yaml.v3" ) @@ -99,10 +100,22 @@ func (ah *APIHandler) PostTestsRegister(w http.ResponseWriter, r *http.Request) } } - testDescriptor := test.NewDescriptor(req.ID, "api-call", testConfig) + testVars := vars.NewVariables(ah.coordinator.GlobalVariables()) + + for k, v := range testConfig.Config { + testVars.SetVar(k, v) + } + + err := testVars.CopyVars(ah.coordinator.GlobalVariables(), testConfig.ConfigVars) + if err != nil { + ah.sendErrorResponse(w, r.URL.String(), fmt.Sprintf("failed decoding configVars: %v", err), http.StatusInternalServerError) + return + } + + testDescriptor := test.NewDescriptor(req.ID, "api-call", testConfig, testVars) // add test descriptor - err := ah.coordinator.AddTestDescriptor(testDescriptor) + err = ah.coordinator.AddTestDescriptor(testDescriptor) if err != nil { ah.sendErrorResponse(w, r.URL.String(), fmt.Sprintf("failed adding test: %v", err), http.StatusInternalServerError) return diff --git a/pkg/coordinator/web/api/post_tests_register_external_api.go b/pkg/coordinator/web/api/post_tests_register_external_api.go index 9c6b6570..895b6907 100644 --- a/pkg/coordinator/web/api/post_tests_register_external_api.go +++ b/pkg/coordinator/web/api/post_tests_register_external_api.go @@ -63,7 +63,7 @@ func (ah *APIHandler) PostTestsRegisterExternal(w http.ResponseWriter, r *http.R extTestCfg.Timeout = &human.Duration{Duration: time.Duration(req.Timeout) * time.Second} } - testConfig, err := test.LoadExternalTestConfig(r.Context(), extTestCfg) + testConfig, testVars, err := test.LoadExternalTestConfig(r.Context(), ah.coordinator.GlobalVariables(), extTestCfg) if err != nil { ah.sendErrorResponse(w, r.URL.String(), fmt.Sprintf("failed loading test config from %v: %v", req.File, err), http.StatusBadRequest) return @@ -84,7 +84,7 @@ func (ah *APIHandler) PostTestsRegisterExternal(w http.ResponseWriter, r *http.R return } - testDescriptor := test.NewDescriptor(testConfig.ID, fmt.Sprintf("api-call,external:%v", extTestCfg.File), testConfig) + testDescriptor := test.NewDescriptor(testConfig.ID, fmt.Sprintf("api-call,external:%v", extTestCfg.File), testConfig, testVars) // add test descriptor err = ah.coordinator.AddTestDescriptor(testDescriptor) diff --git a/pkg/coordinator/web/handlers/test.go b/pkg/coordinator/web/handlers/test.go index 694cb16c..3aa19623 100644 --- a/pkg/coordinator/web/handlers/test.go +++ b/pkg/coordinator/web/handlers/test.go @@ -108,15 +108,13 @@ func (fh *FrontendHandler) getTestPageData(testID string) (*TestPage, error) { Source: testDescriptor.Source(), } - if testConfig.Config != nil { - testCfgJSON, err := json.Marshal(testConfig.Config) - if err != nil { - return nil, fmt.Errorf("failed marshalling test config: %v", err) - } - - pageData.Config = string(testCfgJSON) + testCfgJSON, err := json.Marshal(testDescriptor.Vars().GetVarsMap()) + if err != nil { + return nil, fmt.Errorf("failed marshalling test vars: %v", err) } + pageData.Config = string(testCfgJSON) + // test runs pageData.Tests = []*TestRunData{} diff --git a/pkg/coordinator/web/server/server.go b/pkg/coordinator/web/server/server.go index 02e99382..4c34b960 100644 --- a/pkg/coordinator/web/server/server.go +++ b/pkg/coordinator/web/server/server.go @@ -19,6 +19,10 @@ import ( // import swagger docs _ "github.com/ethpandaops/assertoor/pkg/coordinator/web/api/docs" + + // import pprof + //nolint:gosec // ignore + _ "net/http/pprof" ) type WebServer struct { @@ -101,10 +105,10 @@ func (ws *WebServer) ConfigureRoutes(config *types.WebConfig, logger logrus.Fiel } if config.Frontend != nil { - if config.Frontend.Pprof { - // add pprof handler - ws.router.PathPrefix("/debug/pprof/").Handler(http.DefaultServeMux) - } + // if config.Frontend.Pprof { + // add pprof handler + ws.router.PathPrefix("/debug/pprof/").Handler(http.DefaultServeMux) + // } if config.Frontend.Enabled { frontendHandler := handlers.NewFrontendHandler(coordinator)