diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 84e37fa1d1..1fef30ef60 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,7 +80,6 @@ jobs: apps: | [ {"name": "ev-node-evm", "dockerfile": "apps/evm/Dockerfile"}, - {"name": "ev-node-grpc", "dockerfile": "apps/grpc/Dockerfile"}, {"name": "ev-node-loadgen", "dockerfile": "apps/loadgen/Dockerfile"}, {"name": "ev-node-testapp", "dockerfile": "apps/testapp/Dockerfile"} ] diff --git a/.just/build.just b/.just/build.just index 36b8003ca9..73461646e1 100644 --- a/.just/build.just +++ b/.just/build.just @@ -26,8 +26,6 @@ build-all: @cd apps/testapp && go build -ldflags "{{ ldflags }}" -o {{ build_dir }}/testapp . @echo "--> Building evm" @cd apps/evm && go build -ldflags "{{ ldflags }}" -o {{ build_dir }}/evm . - @echo "--> Building grpc" - @cd apps/grpc && go build -ldflags "{{ ldflags }}" -o {{ build_dir }}/evgrpc . @echo "--> Building loadgen" @cd apps/loadgen && go build -ldflags "{{ ldflags }}" -o {{ build_dir }}/ev-loadgen . @echo "--> Building local-da" @@ -50,14 +48,6 @@ build-evm: @cd apps/evm && go build -ldflags "{{ ldflags }}" -o {{ build_dir }}/evm . @echo " Check the binary with: {{ build_dir }}/evm" -# Build gRPC binary -[group('build')] -build-grpc: - @echo "--> Building gRPC" - @mkdir -p {{ build_dir }} - @cd apps/grpc && go build -ldflags "{{ ldflags }}" -o {{ build_dir }}/evgrpc . - @echo " Check the binary with: {{ build_dir }}/evgrpc" - # Build local-da binary [group('build')] build-da: diff --git a/.just/proto.just b/.just/proto.just index 35f7436bcb..722e53397c 100644 --- a/.just/proto.just +++ b/.just/proto.just @@ -4,7 +4,6 @@ proto-gen: @echo "--> Generating Protobuf files" buf generate --path="./proto/evnode" --template="buf.gen.yaml" --config="buf.yaml" buf generate --path="./proto/execution/evm" --template="buf.gen.evm.yaml" --config="buf.yaml" - buf generate --template="buf.gen.grpc.yaml" --config="buf.yaml" # Lint protobuf files (requires Docker) [group('proto')] diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f88f114d6..0eaabe6416 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Removed + +- **BREAKING:** Remove the obsolete `evgrpc` app and `execution/grpc` transport module. + ### Fixed - Reject unsupported `net-info --output` formats instead of falling back to text output [#3360](https://github.com/evstack/ev-node/pull/3360). diff --git a/RELEASE.md b/RELEASE.md index 627de2ae78..0c40391437 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -105,7 +105,6 @@ Use the hierarchical tag format: `{app-path}/v{major}.{minor}.{patch}` - `apps/evm/v0.2.0` → Releases `apps/evm/` - `apps/testapp/v1.0.0` → Releases `apps/testapp/` -- `apps/grpc/v2.1.3` → Releases `apps/grpc/` ### Automated Process diff --git a/apps/grpc/Dockerfile b/apps/grpc/Dockerfile deleted file mode 100644 index 919b894d96..0000000000 --- a/apps/grpc/Dockerfile +++ /dev/null @@ -1,61 +0,0 @@ -# Build stage -FROM golang:1.26-alpine AS builder - -#hadolint ignore=DL3018 -RUN apk add --no-cache git gcc musl-dev linux-headers - -# Set working directory -WORKDIR /ev-node - -# Copy go mod files -COPY go.mod go.sum ./ -COPY apps/grpc/go.mod apps/grpc/go.sum ./apps/grpc/ -COPY core/go.mod core/go.sum ./core/ -COPY execution/grpc/go.mod execution/grpc/go.sum ./execution/grpc/ - -# Download dependencies -RUN go mod download - -# Copy source code -COPY . . - -# Build the application -WORKDIR /ev-node/apps/grpc -RUN go build -o evgrpc . - -# Runtime stage -FROM alpine:3.22.2 - -#hadolint ignore=DL3018 -RUN apk add --no-cache ca-certificates curl - -# Create non-root user -RUN addgroup -g 1000 ev-node && \ - adduser -u 1000 -G ev-node -s /bin/sh -D ev-node - -# Set working directory -WORKDIR /home/ev-node - -# Copy binary from builder -COPY --from=builder /ev-node/apps/grpc/evgrpc /usr/local/bin/ - -# Create necessary directories -RUN mkdir -p /home/ev-node/.evgrpc && \ - chown -R ev-node:ev-node /home/ev-node - -# Switch to non-root user -USER ev-node - -# Expose ports -# P2P port -EXPOSE 26656 -# RPC port -EXPOSE 26657 -# Prometheus metrics -EXPOSE 26660 - -# Set entrypoint -ENTRYPOINT ["evgrpc"] - -# Default command -CMD ["start"] diff --git a/apps/grpc/README.md b/apps/grpc/README.md deleted file mode 100644 index 356dc0462f..0000000000 --- a/apps/grpc/README.md +++ /dev/null @@ -1,163 +0,0 @@ -# gRPC Single Sequencer App - -This application runs an Evolve node with a single sequencer that connects to an execution client via gRPC. It allows you to use any execution layer that implements the Evolve execution gRPC interface. - -## Overview - -The gRPC single sequencer app provides: - -- An Evolve consensus node with single sequencer -- Connection to execution clients via TCP or Unix domain socket gRPC -- Full data availability layer integration -- P2P networking capabilities - -## Prerequisites - -1. A running execution client that implements the Evolve gRPC execution interface -2. Access to a data availability layer (e.g., local DA, Celestia) -3. Go 1.22 or higher - -## Installation - -From the repository root: - -```bash -cd apps/grpc -go build -o evgrpc -``` - -## Usage - -### 1. Initialize the Node - -First, initialize the node configuration: - -```bash -./evgrpc init --root-dir ~/.evgrpc -``` - -This creates the necessary configuration files and directories. - -### 2. Configure the Node - -Edit the configuration file at `~/.evgrpc/config/config.toml` to set your preferred parameters, or use command-line flags. - -### 3. Start the Execution Service - -Before starting the Evolve node, ensure your gRPC execution service is running. - -### 4. Run the Node - -Start the Evolve node with: - -```bash -./evgrpc start \ - --root-dir ~/.evgrpc \ - --grpc-executor-url http://localhost:50051 \ - --da.address http://localhost:7980 \ - --da.auth-token your-da-token -``` - -For a same-machine executor, use a Unix domain socket endpoint: - -```bash -./evgrpc start \ - --root-dir ~/.evgrpc \ - --grpc-executor-url unix:///tmp/evolve-executor.sock \ - --da.address http://localhost:7980 -``` - -## Command-Line Flags - -### gRPC-specific Flags - -- `--grpc-executor-url`: URL of the gRPC execution service, either `http://host:port` or `unix:///path/to/socket` (default: `http://localhost:50051`) - -### Common Evolve Flags - -- `--root-dir`: Root directory for config and data (default: `~/.evgrpc`) -- `--chain-id`: The chain ID for your rollup -- `--da.address`: Data availability layer address -- `--da.auth-token`: Authentication token for DA layer -- `--da.namespace`: Namespace for DA layer (optional) -- `--p2p.listen-address`: P2P listen address (default: `/ip4/0.0.0.0/tcp/7676`) -- `--block-time`: Time between blocks (default: `1s`) - -## Example: Running with Local DA - -1. Start the local DA service: - - ```bash - cd tools/local-da - go run . - ``` - -2. Start your gRPC execution service: - - ```bash - # Your execution service implementation - ``` - -3. Initialize and run the node: - - ```bash - ./evgrpc init --root-dir ~/.evgrpc --chain-id test-chain - ./evgrpc start \ - --root-dir ~/.evgrpc \ - --grpc-executor-url http://localhost:50051 \ - --da.address http://localhost:7980 - ``` - -## Architecture - -```text -┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐ -│ Evolve Node │────▶│ gRPC Execution │────▶│ Execution │ -│ (Single Seqr) │◀────│ Client │◀────│ Service │ -└─────────────────┘ └──────────────────┘ └─────────────┘ - │ │ - │ │ - ▼ ▼ -┌─────────────────┐ ┌─────────────┐ -│ DA │ │ State │ -│ Layer │ │ Storage │ -└─────────────────┘ └─────────────┘ -``` - -## Development - -### Building from Source - -```bash -go build -o evgrpc -``` - -### Running Tests - -```bash -go test ./... -``` - -## Troubleshooting - -### Connection Refused - -If you see "connection refused" errors, ensure: - -1. Your gRPC execution service is running -2. The execution service URL is correct -3. No firewall is blocking the connection - -### DA Layer Issues - -If you have issues connecting to the DA layer: - -1. Verify the DA service is running -2. Check the authentication token -3. Ensure the namespace exists (if using Celestia) - -## See Also - -- [Evolve Documentation](https://docs.ev.xyz) -- [gRPC Execution Interface](../../execution/grpc/README.md) -- [Single Sequencer Documentation](../../pkg/sequencers/single/README.md) diff --git a/apps/grpc/cmd/init.go b/apps/grpc/cmd/init.go deleted file mode 100644 index f48114be8c..0000000000 --- a/apps/grpc/cmd/init.go +++ /dev/null @@ -1,110 +0,0 @@ -package cmd - -import ( - "errors" - "fmt" - "os" - "strings" - - "github.com/spf13/cobra" - - rollcmd "github.com/evstack/ev-node/pkg/cmd" - rollconf "github.com/evstack/ev-node/pkg/config" - rollgenesis "github.com/evstack/ev-node/pkg/genesis" -) - -// InitCmd returns the init command for initializing the gRPC single sequencer node -func InitCmd() *cobra.Command { - initCmd := &cobra.Command{ - Use: "init", - Short: "Initialize evolve configuration files", - Long: `Initialize configuration files for a Evolve node with gRPC execution client. -This will create the necessary configuration structure in the specified root directory.`, - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - homePath, err := cmd.Flags().GetString(rollconf.FlagRootDir) - if err != nil { - return fmt.Errorf("error reading home flag: %w", err) - } - - aggregator, err := cmd.Flags().GetBool(rollconf.FlagAggregator) - if err != nil { - return fmt.Errorf("error reading aggregator flag: %w", err) - } - - // ignore error, as we are creating a new config - // we use load in order to parse all the flags - cfg, _ := rollconf.Load(cmd) - cfg.Node.Aggregator = aggregator - if err := cfg.Validate(); err != nil { - return fmt.Errorf("error validating config: %w", err) - } - - // Get passphrase file path - passphraseFile, err := cmd.Flags().GetString(rollconf.FlagSignerPassphraseFile) - if err != nil { - return fmt.Errorf("failed to get '%s' flag: %w", rollconf.FlagSignerPassphraseFile, err) - } - - var passphrase string - if passphraseFile != "" { - // Read passphrase from file - passphraseBytes, err := os.ReadFile(passphraseFile) - if err != nil { - return fmt.Errorf("failed to read passphrase from file '%s': %w", passphraseFile, err) - } - passphrase = strings.TrimSpace(string(passphraseBytes)) - - if passphrase == "" { - return fmt.Errorf("passphrase file '%s' is empty", passphraseFile) - } - } - - proposerAddress, err := rollcmd.CreateSigner(cmd.Context(), &cfg, homePath, passphrase) - if err != nil { - return err - } - - if err := cfg.SaveAsYaml(); err != nil { - return fmt.Errorf("error writing evnode.yml file: %w", err) - } - - if err := rollcmd.LoadOrGenNodeKey(homePath); err != nil { - return err - } - - // get chain ID or use default - chainID, err := cmd.Flags().GetString(rollgenesis.ChainIDFlag) - if err != nil { - return err - } - - // Initialize genesis without app state - err = rollgenesis.CreateGenesis(homePath, chainID, 1, proposerAddress) - genesisPath := rollgenesis.GenesisPath(homePath) - if errors.Is(err, rollgenesis.ErrGenesisExists) { - // check if existing genesis file is valid - if genesis, err := rollgenesis.LoadGenesis(genesisPath); err == nil { - if err := genesis.Validate(); err != nil { - return fmt.Errorf("existing genesis file is invalid: %w", err) - } - } else { - return fmt.Errorf("error loading existing genesis file: %w", err) - } - - cmd.Printf("Genesis file already exists at %s, skipping creation.\n", genesisPath) - } else if err != nil { - return fmt.Errorf("error initializing genesis file: %w", err) - } - - cmd.Printf("Successfully initialized config file at %s\n", cfg.ConfigPath()) - return nil - }, - } - - // Add configuration flags - rollconf.AddFlags(initCmd) - initCmd.Flags().String(rollgenesis.ChainIDFlag, "grpc-test-chain", "chain ID") - - return initCmd -} diff --git a/apps/grpc/cmd/run.go b/apps/grpc/cmd/run.go deleted file mode 100644 index 026cfcd0a6..0000000000 --- a/apps/grpc/cmd/run.go +++ /dev/null @@ -1,172 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - "path/filepath" - - "github.com/ipfs/go-datastore" - "github.com/rs/zerolog" - "github.com/spf13/cobra" - - "github.com/evstack/ev-node/block" - "github.com/evstack/ev-node/core/execution" - coresequencer "github.com/evstack/ev-node/core/sequencer" - executiongrpc "github.com/evstack/ev-node/execution/grpc" - "github.com/evstack/ev-node/node" - rollcmd "github.com/evstack/ev-node/pkg/cmd" - "github.com/evstack/ev-node/pkg/config" - blobrpc "github.com/evstack/ev-node/pkg/da/jsonrpc" - da "github.com/evstack/ev-node/pkg/da/types" - "github.com/evstack/ev-node/pkg/genesis" - rollgenesis "github.com/evstack/ev-node/pkg/genesis" - "github.com/evstack/ev-node/pkg/p2p/key" - "github.com/evstack/ev-node/pkg/sequencers/based" - "github.com/evstack/ev-node/pkg/sequencers/single" - "github.com/evstack/ev-node/pkg/store" -) - -const ( - grpcDbName = "grpc-single" - // FlagGrpcExecutorURL is the flag for the gRPC executor endpoint. - FlagGrpcExecutorURL = "grpc-executor-url" -) - -var RunCmd = &cobra.Command{ - Use: "start", - Aliases: []string{"node", "run"}, - Short: "Run the evolve node with gRPC execution client", - Long: `Start a Evolve node that connects to a remote execution client via gRPC. -The execution client must implement the Evolve execution gRPC interface.`, - RunE: func(cmd *cobra.Command, args []string) error { - // Create gRPC execution client - executor, err := createGRPCExecutionClient(cmd) - if err != nil { - return err - } - - // Parse node configuration - nodeConfig, err := rollcmd.ParseConfig(cmd) - if err != nil { - return err - } - - logger := rollcmd.SetupLogger(nodeConfig.Log) - - headerNamespace := da.NamespaceFromString(nodeConfig.DA.GetNamespace()) - dataNamespace := da.NamespaceFromString(nodeConfig.DA.GetDataNamespace()) - - logger.Info().Str("headerNamespace", headerNamespace.HexString()).Str("dataNamespace", dataNamespace.HexString()).Msg("namespaces") - - // Create datastore - datastore, err := store.NewDefaultKVStore(nodeConfig.RootDir, nodeConfig.DBPath, grpcDbName) - if err != nil { - return err - } - - // Load genesis - genesis, err := rollgenesis.LoadGenesis(rollgenesis.GenesisPath(nodeConfig.RootDir)) - if err != nil { - return err - } - - if genesis.DAStartHeight == 0 && !nodeConfig.Node.Aggregator { - logger.Warn().Msg("da_start_height is not set in genesis.json, ask your chain developer") - } - - // Create sequencer based on configuration - sequencer, err := createSequencer(cmd.Context(), logger, datastore, nodeConfig, genesis, executor) - if err != nil { - return err - } - - // Load node key - nodeKey, err := key.LoadNodeKey(filepath.Dir(nodeConfig.ConfigPath())) - if err != nil { - return err - } - - // Start the node - return rollcmd.StartNode(logger, cmd, executor, sequencer, nodeKey, datastore, nodeConfig, genesis, node.NodeOptions{}) - }, -} - -func init() { - // Add evolve configuration flags - config.AddFlags(RunCmd) - - // Add gRPC-specific flags - addGRPCFlags(RunCmd) -} - -// createSequencer creates a sequencer based on the configuration. -func createSequencer( - ctx context.Context, - logger zerolog.Logger, - datastore datastore.Batching, - nodeConfig config.Config, - genesis genesis.Genesis, - executor execution.Executor, -) (coresequencer.Sequencer, error) { - blobClient, err := blobrpc.NewWSClient(ctx, logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, "") - if err != nil { - return nil, fmt.Errorf("failed to create blob client: %w", err) - } - - daClient := block.NewDAClient(blobClient, nodeConfig, logger) - - if nodeConfig.Node.BasedSequencer { - // Based sequencer mode - fetch transactions only from DA - if !nodeConfig.Node.Aggregator { - return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled") - } - - basedSeq, err := based.NewBasedSequencer(ctx, daClient, nodeConfig, datastore, genesis, logger, executor) - if err != nil { - return nil, fmt.Errorf("failed to create based sequencer: %w", err) - } - - logger.Info(). - Str("forced_inclusion_namespace", nodeConfig.DA.GetForcedInclusionNamespace()). - Uint64("da_epoch", genesis.DAEpochForcedInclusion). - Msg("based sequencer initialized") - - return basedSeq, nil - } - - sequencer, err := single.NewSequencer( - logger, - datastore, - daClient, - nodeConfig, - []byte(genesis.ChainID), - 1000, - genesis, - executor, - ) - if err != nil { - return nil, fmt.Errorf("failed to create single sequencer: %w", err) - } - - return sequencer, nil -} - -// createGRPCExecutionClient creates a new gRPC execution client from command flags -func createGRPCExecutionClient(cmd *cobra.Command) (execution.Executor, error) { - // Get the gRPC executor URL from flags - executorURL, err := cmd.Flags().GetString(FlagGrpcExecutorURL) - if err != nil { - return nil, fmt.Errorf("failed to get '%s' flag: %w", FlagGrpcExecutorURL, err) - } - - if executorURL == "" { - return nil, fmt.Errorf("%s flag is required", FlagGrpcExecutorURL) - } - - return executiongrpc.NewClient(executorURL) -} - -// addGRPCFlags adds flags specific to the gRPC execution client -func addGRPCFlags(cmd *cobra.Command) { - cmd.Flags().String(FlagGrpcExecutorURL, "http://localhost:50051", "URL of the gRPC execution service, or unix:///path/to/executor.sock") -} diff --git a/apps/grpc/docker-compose.yml b/apps/grpc/docker-compose.yml deleted file mode 100644 index bcb1072697..0000000000 --- a/apps/grpc/docker-compose.yml +++ /dev/null @@ -1,64 +0,0 @@ -version: "3.8" - -services: - # Local DA service for development - local-da: - build: - context: ../../../ - dockerfile: tools/local-da/Dockerfile - ports: - - "7980:7980" - environment: - - DA_NAMESPACE=00000000000000000000000000000000000000000000000000000000deadbeef - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:7980/health"] - interval: 5s - timeout: 3s - retries: 5 - - # Example gRPC execution service (replace with your implementation) - # execution-service: - # image: your-execution-service:latest - # ports: - # - "50051:50051" - # environment: - # - GRPC_PORT=50051 - # healthcheck: - # test: ["CMD", "grpc_health_probe", "-addr=:50051"] - # interval: 5s - # timeout: 3s - # retries: 5 - - # Evolve node with gRPC execution client - evolve-grpc: - build: - context: ../../../ - dockerfile: apps/grpc/Dockerfile - depends_on: - local-da: - condition: service_healthy - # execution-service: - # condition: service_healthy - ports: - - "26656:26656" # P2P - - "26657:26657" # RPC - - "26660:26660" # Prometheus metrics - environment: - - DA_ADDRESS=http://local-da:7980 - - DA_NAMESPACE=00000000000000000000000000000000000000000000000000deadbeef - - GRPC_EXECUTOR_URL=http://host.docker.internal:50051 # Change to your execution service - volumes: - - evolve-data:/home/evolve/.evgrpc - command: - - start - - --root-dir=/home/evolve/.evgrpc - - --da.address=${DA_ADDRESS:-http://local-da:7980} - - --da.namespace=${DA_NAMESPACE} - - --grpc-executor-url=${GRPC_EXECUTOR_URL:-http://host.docker.internal:50051} - - --p2p.listen-address=/ip4/0.0.0.0/tcp/26656 - - --rpc.laddr=tcp://0.0.0.0:26657 - - --instrumentation.prometheus=true - - --instrumentation.prometheus-listen-addr=0.0.0.0:26660 - -volumes: - evolve-data: diff --git a/apps/grpc/go.mod b/apps/grpc/go.mod deleted file mode 100644 index 97a7cdde6a..0000000000 --- a/apps/grpc/go.mod +++ /dev/null @@ -1,219 +0,0 @@ -module github.com/evstack/ev-node/apps/grpc - -go 1.25.8 - -replace ( - github.com/evstack/ev-node => ../../ - github.com/evstack/ev-node/core => ../../core - github.com/evstack/ev-node/execution/grpc => ../../execution/grpc -) - -require ( - github.com/evstack/ev-node v1.1.3 - github.com/evstack/ev-node/core v1.0.0 - github.com/evstack/ev-node/execution/grpc v1.0.0 - github.com/ipfs/go-datastore v0.9.1 - github.com/rs/zerolog v1.35.1 - github.com/spf13/cobra v1.10.2 -) - -require ( - cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth v0.20.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.7.0 // indirect - cloud.google.com/go/kms v1.31.0 // indirect - cloud.google.com/go/longrunning v0.9.0 // indirect - connectrpc.com/connect v1.20.0 // indirect - connectrpc.com/grpcreflect v1.3.0 // indirect - filippo.io/bigmod v0.1.1-0.20260103110540-f8a47775ebe5 // indirect - filippo.io/keygen v0.0.0-20260114151900-8e2790ea4c5b // indirect - github.com/armon/go-metrics v0.4.1 // indirect - github.com/aws/aws-sdk-go-v2 v1.42.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.25 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.24 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 // indirect - github.com/aws/aws-sdk-go-v2/service/kms v1.53.4 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 // indirect - github.com/aws/smithy-go v1.27.1 // indirect - github.com/benbjohnson/clock v1.3.5 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/boltdb/bolt v1.3.1 // indirect - github.com/celestiaorg/go-header v0.8.5 // indirect - github.com/celestiaorg/go-libp2p-messenger v0.2.2 // indirect - github.com/celestiaorg/go-square/merkle v0.0.0-20240627094109-7d01436067a3 // indirect - github.com/celestiaorg/go-square/v3 v3.0.2 // indirect - github.com/celestiaorg/nmt v0.24.3 // indirect - github.com/cenkalti/backoff/v5 v5.0.3 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 // indirect - github.com/dgraph-io/badger/v4 v4.5.1 // indirect - github.com/dgraph-io/ristretto/v2 v2.1.0 // indirect - github.com/dunglas/httpsfv v1.1.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/fatih/color v1.18.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/filecoin-project/go-clock v0.1.0 // indirect - github.com/filecoin-project/go-jsonrpc v0.10.1 // indirect - github.com/flynn/noise v1.1.0 // indirect - github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/go-kit/kit v0.13.0 // indirect - github.com/go-logr/logr v1.4.3 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.5.0 // indirect - github.com/goccy/go-yaml v1.19.2 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect - github.com/google/flatbuffers v25.1.24+incompatible // indirect - github.com/google/gopacket v1.1.19 // indirect - github.com/google/s2a-go v0.1.9 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.16 // indirect - github.com/googleapis/gax-go/v2 v2.22.0 // indirect - github.com/gorilla/websocket v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect - github.com/hashicorp/go-hclog v1.6.3 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-metrics v0.5.4 // indirect - github.com/hashicorp/go-msgpack v0.5.5 // indirect - github.com/hashicorp/go-msgpack/v2 v2.1.2 // indirect - github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/hashicorp/raft v1.7.3 // indirect - github.com/hashicorp/raft-boltdb v0.0.0-20251103221153-05f9dd7a5148 // indirect - github.com/huin/goupnp v1.3.0 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/ipfs/boxo v0.39.0 // indirect - github.com/ipfs/go-cid v0.6.1 // indirect - github.com/ipfs/go-ds-badger4 v0.1.8 // indirect - github.com/ipfs/go-log/v2 v2.9.2 // indirect - github.com/ipld/go-ipld-prime v0.23.0 // indirect - github.com/jackpal/go-nat-pmp v1.0.2 // indirect - github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect - github.com/klauspost/compress v1.18.5 // indirect - github.com/klauspost/cpuid/v2 v2.3.0 // indirect - github.com/koron/go-ssdp v0.0.6 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-flow-metrics v0.3.0 // indirect - github.com/libp2p/go-libp2p v0.48.0 // indirect - github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect - github.com/libp2p/go-libp2p-kad-dht v0.40.0 // indirect - github.com/libp2p/go-libp2p-kbucket v0.8.0 // indirect - github.com/libp2p/go-libp2p-pubsub v0.16.0 // indirect - github.com/libp2p/go-libp2p-record v0.3.1 // indirect - github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect - github.com/libp2p/go-msgio v0.3.0 // indirect - github.com/libp2p/go-netroute v0.4.0 // indirect - github.com/libp2p/go-reuseport v0.4.0 // indirect - github.com/libp2p/go-yamux/v5 v5.0.1 // indirect - github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect - github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.22 // indirect - github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect - github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect - github.com/minio/sha256-simd v1.0.1 // indirect - github.com/mr-tron/base58 v1.3.0 // indirect - github.com/multiformats/go-base32 v0.1.0 // indirect - github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.16.1 // indirect - github.com/multiformats/go-multiaddr-dns v0.5.0 // indirect - github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect - github.com/multiformats/go-multibase v0.3.0 // indirect - github.com/multiformats/go-multicodec v0.10.0 // indirect - github.com/multiformats/go-multihash v0.2.3 // indirect - github.com/multiformats/go-multistream v0.6.1 // indirect - github.com/multiformats/go-varint v0.1.0 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect - github.com/pelletier/go-toml/v2 v2.2.4 // indirect - github.com/pion/datachannel v1.5.10 // indirect - github.com/pion/dtls/v3 v3.1.2 // indirect - github.com/pion/ice/v4 v4.0.10 // indirect - github.com/pion/interceptor v0.1.40 // indirect - github.com/pion/logging v0.2.4 // indirect - github.com/pion/mdns/v2 v2.0.7 // indirect - github.com/pion/randutil v0.1.0 // indirect - github.com/pion/rtcp v1.2.16 // indirect - github.com/pion/rtp v1.8.19 // indirect - github.com/pion/sctp v1.8.39 // indirect - github.com/pion/sdp/v3 v3.0.18 // indirect - github.com/pion/srtp/v3 v3.0.6 // indirect - github.com/pion/stun/v3 v3.1.1 // indirect - github.com/pion/transport/v3 v3.0.7 // indirect - github.com/pion/transport/v4 v4.0.1 // indirect - github.com/pion/turn/v4 v4.0.2 // indirect - github.com/pion/webrtc/v4 v4.1.2 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/polydawn/refmt v0.89.1-0.20231129105047-37766d95467a // indirect - github.com/prometheus/client_golang v1.23.2 // indirect - github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.67.5 // indirect - github.com/prometheus/procfs v0.20.1 // indirect - github.com/quic-go/qpack v0.6.0 // indirect - github.com/quic-go/quic-go v0.59.0 // indirect - github.com/quic-go/webtransport-go v0.10.0 // indirect - github.com/sagikazarmark/locafero v0.11.0 // indirect - github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/afero v1.15.0 // indirect - github.com/spf13/cast v1.10.0 // indirect - github.com/spf13/pflag v1.0.10 // indirect - github.com/spf13/viper v1.21.0 // indirect - github.com/stretchr/objx v0.5.2 // indirect - github.com/stretchr/testify v1.11.1 // indirect - github.com/subosito/gotenv v1.6.0 // indirect - github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect - github.com/wlynxg/anet v0.0.5 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect - go.opentelemetry.io/otel v1.44.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.44.0 // indirect - go.opentelemetry.io/otel/metric v1.44.0 // indirect - go.opentelemetry.io/otel/sdk v1.44.0 // indirect - go.opentelemetry.io/otel/trace v1.44.0 // indirect - go.opentelemetry.io/proto/otlp v1.10.0 // indirect - go.uber.org/dig v1.19.0 // indirect - go.uber.org/fx v1.24.0 // indirect - go.uber.org/mock v0.5.2 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.28.0 // indirect - go.yaml.in/yaml/v2 v2.4.4 // indirect - go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.53.0 // indirect - golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f // indirect - golang.org/x/mod v0.36.0 // indirect - golang.org/x/net v0.56.0 // indirect - golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.21.0 // indirect - golang.org/x/sys v0.46.0 // indirect - golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 // indirect - golang.org/x/text v0.38.0 // indirect - golang.org/x/time v0.15.0 // indirect - golang.org/x/tools v0.45.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - gonum.org/v1/gonum v0.17.0 // indirect - google.golang.org/api v0.286.0 // indirect - google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad // indirect - google.golang.org/grpc v1.81.1 // indirect - google.golang.org/protobuf v1.36.11 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - lukechampine.com/blake3 v1.4.1 // indirect -) diff --git a/apps/grpc/go.sum b/apps/grpc/go.sum deleted file mode 100644 index 163545691d..0000000000 --- a/apps/grpc/go.sum +++ /dev/null @@ -1,1224 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= -cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA= -cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q= -cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= -cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= -cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/iam v1.7.0 h1:JD3zh0C6LHl16aCn5Akff0+GELdp1+4hmh6ndoFLl8U= -cloud.google.com/go/iam v1.7.0/go.mod h1:tetWZW1PD/m6vcuY2Zj/aU0eCHNPuxedbnbRTyKXvdY= -cloud.google.com/go/kms v1.31.0 h1:LS8N92OxFDgOLg5NCo3OmbvjtQAIVT5gUHVLKIDHaFE= -cloud.google.com/go/kms v1.31.0/go.mod h1:YIyXZym11R5uovJJt4oN5eUL3oPmirF3yKeIh6QAf4U= -cloud.google.com/go/longrunning v0.9.0 h1:0EzbDEGsAvOZNbqXopgniY0w0a1phvu5IdUFq8grmqY= -cloud.google.com/go/longrunning v0.9.0/go.mod h1:pkTz846W7bF4o2SzdWJ40Hu0Re+UoNT6Q5t+igIcb8E= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -connectrpc.com/connect v1.20.0 h1:6TNDAB+WeNd2uolWNlYczB5E0KNNaVMNUEx8JEUsPmQ= -connectrpc.com/connect v1.20.0/go.mod h1:A2ygJrukXwWy32vkCAAHNVguZrqZ+jeZ9rGRnGR4dN4= -connectrpc.com/grpcreflect v1.3.0 h1:Y4V+ACf8/vOb1XOc251Qun7jMB75gCUNw6llvB9csXc= -connectrpc.com/grpcreflect v1.3.0/go.mod h1:nfloOtCS8VUQOQ1+GTdFzVg2CJo4ZGaat8JIovCtDYs= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/bigmod v0.1.1-0.20260103110540-f8a47775ebe5 h1:JA0fFr+kxpqTdxR9LOBiTWpGNchqmkcsgmdeJZRclZ0= -filippo.io/bigmod v0.1.1-0.20260103110540-f8a47775ebe5/go.mod h1:OjOXDNlClLblvXdwgFFOQFJEocLhhtai8vGLy0JCZlI= -filippo.io/keygen v0.0.0-20260114151900-8e2790ea4c5b h1:REI1FbdW71yO56Are4XAxD+OS/e+BQsB3gE4mZRQEXY= -filippo.io/keygen v0.0.0-20260114151900-8e2790ea4c5b/go.mod h1:9nnw1SlYHYuPSo/3wjQzNjSbeHlq2NsKo5iEtfJPWP0= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Sereal/Sereal/Go/sereal v0.0.0-20231009093132-b9187f1a92c6/go.mod h1:JwrycNnC8+sZPDyzM3MQ86LvaGzSpfxg885KOOwFRW4= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA= -github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= -github.com/aws/aws-sdk-go-v2/config v1.32.25 h1:ACCejvStYoilgwrfegSt5ZntCbPrk52qfwyNcnl3omM= -github.com/aws/aws-sdk-go-v2/config v1.32.25/go.mod h1:LJyU8sDRbXUxFn8xMJIGP+v9QYYwveNLI8a/giAOiAs= -github.com/aws/aws-sdk-go-v2/credentials v1.19.24 h1:2hQqYCV9yqyePQ9o6dCrZc/zO8U3TwPr9mIKlZnPu/I= -github.com/aws/aws-sdk-go-v2/credentials v1.19.24/go.mod h1:IDwpACtwqHLISdzfwUUNq4P9DsB/h5BLg4FwJPNfqFY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 h1:r6qZHbT+wxgWO/e9vYNUEtg7lv5+UN3pRqKhLXvnArg= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29/go.mod h1:QRnaRcTVGKPGRy8w78HMQtKUGRYcnMZAANATkeVA6Mo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 h1:f3vKqSo13fhTYb+JEcXwXefZQE26I1FB5eTSniU67ko= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29/go.mod h1:MzoLFUArKGpGD+ukmPiTPG1X5x4o6M2kq4v2dr1FiEc= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 h1:RdwIf/CuUsvJX3RgJagbOyotl/cxoLY4xviKuE7p2GY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29/go.mod h1:71wt8W2EgswdZy9Mf9KNnzxZ3TiZlv4caKghPktDOkA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 h1:VTGy885W5DKBxWRUJbym9hytNaYzsyaPkCHGRRMAOhU= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30/go.mod h1:AS0HycUvJRFvTt613AYDOgO2jzw+00cVSMny8XB3yMY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 h1:ZD2+BSw9vFsNlKYIasSNt3uDbjqqXIBcM13UJv/Lx2k= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12/go.mod h1:Ms4zlcVBbXbiP7EVLhl+lgjvA/a7YphqQ3Ih3174EmI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 h1:DRebniUGZ2MqiiIVmQJ04vIXr918hubdHMnarSLEWyU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29/go.mod h1:LfRkPCD8YHDM2E5eTkos2UpwYeZnBcVarTa8L59bJHA= -github.com/aws/aws-sdk-go-v2/service/kms v1.53.4 h1:PEgVSsWtR8NNxsDxFL2Ywisi7R+1EFQARGsT4q3mWwI= -github.com/aws/aws-sdk-go-v2/service/kms v1.53.4/go.mod h1:3EeKyDGPGSCEphG2OolwNGNF45RvQIfm27AYYpfEWrw= -github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 h1:3nXpRcFwRCW8n7HgO2QGy0Dc20eQNfBuUemGQhpF8m8= -github.com/aws/aws-sdk-go-v2/service/signin v1.2.0/go.mod h1:LxYujSTLPRlp2vTtcUO/+1ilrew8ytt6SvQyOgejzFQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 h1:ey1XLTYXb9PcLt4535632o5kCGXNXEhNb620Dqwuylo= -github.com/aws/aws-sdk-go-v2/service/sso v1.31.3/go.mod h1:Lk7PlmoTYryQmyBG0EXqj5BcUbj3whXdU2s3yGI3EAc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 h1:yLr03zQE/5Eu5l3QU0Si+xMbLMbSDF2YXsigqXngs6g= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6/go.mod h1:Q5N6icH+KJZDLh+ESNwzdv6cZ6vLFF/egy3IOxWhmz4= -github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 h1:VrIhKRCSK1umelSgB9RghvA9RTUYeQffyAS5ApXehNI= -github.com/aws/aws-sdk-go-v2/service/sts v1.43.3/go.mod h1:r8wkDOuLaaMFqFiYAb8dGY2A3gJCOujMc6CFOVC4Zhc= -github.com/aws/smithy-go v1.27.1 h1:4T340VFndXtADGF52gYa1POyL7s9E4Z1OeZ1hCscIw8= -github.com/aws/smithy-go v1.27.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= -github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= -github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/canonical/go-sp800.90a-drbg v0.0.0-20210314144037-6eeb1040d6c3 h1:oe6fCvaEpkhyW3qAicT0TnGtyht/UrgvOwMcEgLb7Aw= -github.com/canonical/go-sp800.90a-drbg v0.0.0-20210314144037-6eeb1040d6c3/go.mod h1:qdP0gaj0QtgX2RUZhnlVrceJ+Qln8aSlDyJwelLLFeM= -github.com/celestiaorg/go-header v0.8.5 h1:MkzlioiSeybKVNDa0805fS3mS3NG8ub93Gs2xaKwSZ4= -github.com/celestiaorg/go-header v0.8.5/go.mod h1:DKl6pcKCJ0ehGUgDmfxBNz6Lv0Ky4E1Oyrcx96eQm/4= -github.com/celestiaorg/go-libp2p-messenger v0.2.2 h1:osoUfqjss7vWTIZrrDSy953RjQz+ps/vBFE7bychLEc= -github.com/celestiaorg/go-libp2p-messenger v0.2.2/go.mod h1:oTCRV5TfdO7V/k6nkx7QjQzGrWuJbupv+0o1cgnY2i4= -github.com/celestiaorg/go-square/merkle v0.0.0-20240627094109-7d01436067a3 h1:wP84mtwOCVNOTfS3zErICjxKLnh74Z1uf+tdrlSFjVM= -github.com/celestiaorg/go-square/merkle v0.0.0-20240627094109-7d01436067a3/go.mod h1:86qIYnEhmn/hfW+xvw98NOI3zGaDEB3x8JGjYo2FqLs= -github.com/celestiaorg/go-square/v3 v3.0.2 h1:eSQOgNII8inK9IhiBZ+6GADQeWbRq4HYY72BOgcduA4= -github.com/celestiaorg/go-square/v3 v3.0.2/go.mod h1:oFReMLsSDMRs82ICFEeFQFCqNvwdsbIM1BzCcb0f7dM= -github.com/celestiaorg/nmt v0.24.3 h1:ylQnRlXkVoTtq36CxtCyXYZX4JISBsHgKlAAUAnf7ig= -github.com/celestiaorg/nmt v0.24.3/go.mod h1:vgLBpWBi8F5KLxTdXSwb7AU4NhiIQ1AQRGa+PzdcLEA= -github.com/celestiaorg/utils v0.1.0 h1:WsP3O8jF7jKRgLNFmlDCwdThwOFMFxg0MnqhkLFVxPo= -github.com/celestiaorg/utils v0.1.0/go.mod h1:vQTh7MHnvpIeCQZ2/Ph+w7K1R2UerDheZbgJEJD2hSU= -github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= -github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= -github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892/go.mod h1:CTDl0pzVzE5DEzZhPfvhY/9sPFMQIxaJ9VAMs9AagrE= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc= -github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= -github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 h1:5RVFMOWjMyRy8cARdy79nAmgYw3hK/4HUq48LQ6Wwqo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= -github.com/dgraph-io/badger/v4 v4.5.1 h1:7DCIXrQjo1LKmM96YD+hLVJ2EEsyyoWxJfpdd56HLps= -github.com/dgraph-io/badger/v4 v4.5.1/go.mod h1:qn3Be0j3TfV4kPbVoK0arXCD1/nr1ftth6sbL5jxdoA= -github.com/dgraph-io/ristretto/v2 v2.1.0 h1:59LjpOJLNDULHh8MC4UaegN52lC4JnO2dITsie/Pa8I= -github.com/dgraph-io/ristretto/v2 v2.1.0/go.mod h1:uejeqfYXpUomfse0+lO+13ATz4TypQYLJZzBSAemuB4= -github.com/dgryski/go-ddmin v0.0.0-20210904190556-96a6d69f1034/go.mod h1:zz4KxBkcXUWKjIcrc+uphJ1gPh/t18ymGm3PmQ+VGTk= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dunglas/httpsfv v1.1.0 h1:Jw76nAyKWKZKFrpMMcL76y35tOpYHqQPzHQiwDvpe54= -github.com/dunglas/httpsfv v1.1.0/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnDwH8TiMg= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= -github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= -github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= -github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= -github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU= -github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs= -github.com/filecoin-project/go-jsonrpc v0.10.1 h1:iEhgrjO0+rawwOZWRNgexLrWGLA+IEUyWiRRL134Ob8= -github.com/filecoin-project/go-jsonrpc v0.10.1/go.mod h1:OG7kVBVh/AbDFHIwx7Kw0l9ARmKOS6gGOr0LbdBpbLc= -github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= -github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= -github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= -github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= -github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= -github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= -github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= -github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/flatbuffers v25.1.24+incompatible h1:4wPqL3K7GzBd1CwyhSd3usxLKOaJN/AC6puCca6Jm7o= -github.com/google/flatbuffers v25.1.24+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= -github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -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/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= -github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= -github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= -github.com/google/uuid v1.1.2/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/googleapis/enterprise-certificate-proxy v0.3.16 h1:F/VPrx0YPBdksZJQdCAp0WUsqnNmZpUZszzfYt0M5Dw= -github.com/googleapis/enterprise-certificate-proxy v0.3.16/go.mod h1:9Yb0eAkH/Xqhvv3zbeKf/+wMJqCeocWc6KIhDvEAuYE= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= -github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= -github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= -github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= -github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= -github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-metrics v0.5.4 h1:8mmPiIJkTPPEbAiV97IxdAGNdRdaWwVap1BU6elejKY= -github.com/hashicorp/go-metrics v0.5.4/go.mod h1:CG5yz4NZ/AI/aQt9Ucm/vdBnbh7fvmv4lxZ350i+QQI= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack/v2 v2.1.2 h1:4Ee8FTp834e+ewB71RDrQ0VKpyFdrKOjvYtnQ/ltVj0= -github.com/hashicorp/go-msgpack/v2 v2.1.2/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= -github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/raft v1.7.3 h1:DxpEqZJysHN0wK+fviai5mFcSYsCkNpFUl1xpAW8Rbo= -github.com/hashicorp/raft v1.7.3/go.mod h1:DfvCGFxpAUPE0L4Uc8JLlTPtc3GzSbdH0MTJCLgnmJQ= -github.com/hashicorp/raft-boltdb v0.0.0-20251103221153-05f9dd7a5148 h1:tjaIHlfKX22DCCPTx2mK+6N/kTP9DV7B3bxEUyQtjKA= -github.com/hashicorp/raft-boltdb v0.0.0-20251103221153-05f9dd7a5148/go.mod h1:sgCxzMuvQ3huVxgmeDdj73YIMmezWZ40HQu2IPmjJWk= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= -github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/ipfs/boxo v0.39.0 h1:u9jLf5pLx5SWROXjHtj8VMvv+iDlMbiTyZ/vVTQ4VhI= -github.com/ipfs/boxo v0.39.0/go.mod h1:k9YCvMjytFguMHndEiGdCGMMj4b7CkdOT44vtgAxOdk= -github.com/ipfs/go-block-format v0.2.3 h1:mpCuDaNXJ4wrBJLrtEaGFGXkferrw5eqVvzaHhtFKQk= -github.com/ipfs/go-block-format v0.2.3/go.mod h1:WJaQmPAKhD3LspLixqlqNFxiZ3BZ3xgqxxoSR/76pnA= -github.com/ipfs/go-cid v0.6.1 h1:T5TnNb08+ueovG76Z5gx1L4Y7QOaGTXHg1F6raWFxIc= -github.com/ipfs/go-cid v0.6.1/go.mod h1:zrY0SwOhjrrIdfPQ/kf+k1sXyJ0QE7cMxfCployLBs0= -github.com/ipfs/go-datastore v0.9.1 h1:67Po2epre/o0UxrmkzdS9ZTe2GFGODgTd2odx8Wh6Yo= -github.com/ipfs/go-datastore v0.9.1/go.mod h1:zi07Nvrpq1bQwSkEnx3bfjz+SQZbdbWyCNvyxMh9pN0= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ds-badger4 v0.1.8 h1:frNczf5CjCVm62RJ5mW5tD/oLQY/9IKAUpKviRV9QAI= -github.com/ipfs/go-ds-badger4 v0.1.8/go.mod h1:FdqSLA5TMsyqooENB/Hf4xzYE/iH0z/ErLD6ogtfMrA= -github.com/ipfs/go-log/v2 v2.9.2 h1:O/5BB0elpkRILvT24rCJ5976wWd7u0nJ436T3rdYdc4= -github.com/ipfs/go-log/v2 v2.9.2/go.mod h1:RziRwwXWhndlk8L75RnEe0zeAYaq2heKtEMc3jqUov0= -github.com/ipfs/go-test v0.3.0 h1:0Y4Uve3tp9HI+2lIJjfOliOrOgv/YpXg/l1y3P4DEYE= -github.com/ipfs/go-test v0.3.0/go.mod h1:JK+U8pRpATZb7lsYNSJlCj3WYB3cFfWIbI6nWRM/GFk= -github.com/ipld/go-ipld-prime v0.23.0 h1:csqdPZH60BsTC+AZrv7fpa27v+09I/oTqyHYYYE27eE= -github.com/ipld/go-ipld-prime v0.23.0/go.mod h1:46YCFSFNFBJHPjB0pfMuv7Ly7df2eChpkpyPo5SE0bA= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= -github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= -github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= -github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= -github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU= -github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/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= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= -github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= -github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784= -github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo= -github.com/libp2p/go-libp2p v0.48.0 h1:h2BrLAgrj7X8bEN05K7qmrjpNHYA+6tnsGRdprjTnvo= -github.com/libp2p/go-libp2p v0.48.0/go.mod h1:Q1fBZNdmC2Hf82husCTfkKJVfHm2we5zk+NWmOGEmWk= -github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= -github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= -github.com/libp2p/go-libp2p-kad-dht v0.40.0 h1:as8U7Y1RX9CTKCBiFBHWKZ6tSS+rE+6WNz+H1+M+wbo= -github.com/libp2p/go-libp2p-kad-dht v0.40.0/go.mod h1:iLUjII47u3/HjxyhucI2lhsl29lrzlAs/ym16+H40jE= -github.com/libp2p/go-libp2p-kbucket v0.8.0 h1:QAK7RzKJpYe+EuSEATAaaHYMYLkPDGC18m9jxPLnU8s= -github.com/libp2p/go-libp2p-kbucket v0.8.0/go.mod h1:JMlxqcEyKwO6ox716eyC0hmiduSWZZl6JY93mGaaqc4= -github.com/libp2p/go-libp2p-pubsub v0.16.0 h1:j7G2C8kJwkcAQqYR7Wmq3d75d3Sgw/N0Hhiv0dVx7OY= -github.com/libp2p/go-libp2p-pubsub v0.16.0/go.mod h1:lr4oE8bFgQaifRcoc2uWhWWiK6tPdOEKpUuR408GFN4= -github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg= -github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E= -github.com/libp2p/go-libp2p-routing-helpers v0.7.5 h1:HdwZj9NKovMx0vqq6YNPTh6aaNzey5zHD7HeLJtq6fI= -github.com/libp2p/go-libp2p-routing-helpers v0.7.5/go.mod h1:3YaxrwP0OBPDD7my3D0KxfR89FlcX/IEbxDEDfAmj98= -github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= -github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= -github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= -github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= -github.com/libp2p/go-netroute v0.4.0 h1:sZZx9hyANYUx9PZyqcgE/E1GUG3iEtTZHUEvdtXT7/Q= -github.com/libp2p/go-netroute v0.4.0/go.mod h1:Nkd5ShYgSMS5MUKy/MU2T57xFoOKvvLR92Lic48LEyA= -github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= -github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= -github.com/libp2p/go-yamux/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg= -github.com/libp2p/go-yamux/v5 v5.0.1/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marcopolo/simnet v0.0.4 h1:50Kx4hS9kFGSRIbrt9xUS3NJX33EyPqHVmpXvaKLqrY= -github.com/marcopolo/simnet v0.0.4/go.mod h1:tfQF1u2DmaB6WHODMtQaLtClEf3a296CKQLq5gAsIS0= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.9/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.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= -github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -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.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= -github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -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/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.3.0 h1:K6Y13R2h+dku0wOqKtecgRnBUBPrZzLZy5aIj8lCcJI= -github.com/mr-tron/base58 v1.3.0/go.mod h1:2BuubE67DCSWwVfx37JWNG8emOC0sHEU4/HpcYgCLX8= -github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= -github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= -github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= -github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= -github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.16.1 h1:fgJ0Pitow+wWXzN9do+1b8Pyjmo8m5WhGfzpL82MpCw= -github.com/multiformats/go-multiaddr v0.16.1/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0= -github.com/multiformats/go-multiaddr-dns v0.5.0 h1:p/FTyHKX0nl59f+S+dEUe8HRK+i5Ow/QHMw8Nh3gPCo= -github.com/multiformats/go-multiaddr-dns v0.5.0/go.mod h1:yJ349b8TPIAANUyuOzn1oz9o22tV9f+06L+cCeMxC14= -github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= -github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= -github.com/multiformats/go-multibase v0.3.0 h1:8helZD2+4Db7NNWFiktk2NePbF0boolBe6bDQvM4r68= -github.com/multiformats/go-multibase v0.3.0/go.mod h1:MoBLQPCkRTOL3eveIPO81860j2AQY8JwcnNlRkGRUfI= -github.com/multiformats/go-multicodec v0.10.0 h1:UpP223cig/Cx8J76jWt91njpK3GTAO1w02sdcjZDSuc= -github.com/multiformats/go-multicodec v0.10.0/go.mod h1:wg88pM+s2kZJEQfRCKBNU+g32F5aWBEjyFHXvZLTcLI= -github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= -github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= -github.com/multiformats/go-multistream v0.6.1 h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ= -github.com/multiformats/go-multistream v0.6.1/go.mod h1:ksQf6kqHAb6zIsyw7Zm+gAuVo57Qbq84E27YlYqavqw= -github.com/multiformats/go-varint v0.1.0 h1:i2wqFp4sdl3IcIxfAonHQV9qU5OsZ4Ts9IOoETFs5dI= -github.com/multiformats/go-varint v0.1.0/go.mod h1:5KVAVXegtfmNQQm/lCY+ATvDzvJJhSkUlGQV9wgObdI= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= -github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= -github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o= -github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M= -github.com/pion/dtls/v3 v3.1.2 h1:gqEdOUXLtCGW+afsBLO0LtDD8GnuBBjEy6HRtyofZTc= -github.com/pion/dtls/v3 v3.1.2/go.mod h1:Hw/igcX4pdY69z1Hgv5x7wJFrUkdgHwAn/Q/uo7YHRo= -github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4= -github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw= -github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4= -github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic= -github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8= -github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so= -github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM= -github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA= -github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= -github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= -github.com/pion/rtcp v1.2.16 h1:fk1B1dNW4hsI78XUCljZJlC4kZOPk67mNRuQ0fcEkSo= -github.com/pion/rtcp v1.2.16/go.mod h1:/as7VKfYbs5NIb4h6muQ35kQF/J0ZVNz2Z3xKoCBYOo= -github.com/pion/rtp v1.8.19 h1:jhdO/3XhL/aKm/wARFVmvTfq0lC/CvN1xwYKmduly3c= -github.com/pion/rtp v1.8.19/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk= -github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE= -github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE= -github.com/pion/sdp/v3 v3.0.18 h1:l0bAXazKHpepazVdp+tPYnrsy9dfh7ZbT8DxesH5ZnI= -github.com/pion/sdp/v3 v3.0.18/go.mod h1:ZREGo6A9ZygQ9XkqAj5xYCQtQpif0i6Pa81HOiAdqQ8= -github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4= -github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY= -github.com/pion/stun/v3 v3.1.1 h1:CkQxveJ4xGQjulGSROXbXq94TAWu8gIX2dT+ePhUkqw= -github.com/pion/stun/v3 v3.1.1/go.mod h1:qC1DfmcCTQjl9PBaMa5wSn3x9IPmKxSdcCsxBcDBndM= -github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= -github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= -github.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k8o= -github.com/pion/transport/v4 v4.0.1/go.mod h1:nEuEA4AD5lPdcIegQDpVLgNoDGreqM/YqmEx3ovP4jM= -github.com/pion/turn/v4 v4.0.2 h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps= -github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs= -github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54= -github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= -github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polydawn/refmt v0.89.1-0.20231129105047-37766d95467a h1:cgqrm0F3zwf9IPzca7xN4w+Zy6MC9ZkPvAC8QEWa/iQ= -github.com/polydawn/refmt v0.89.1-0.20231129105047-37766d95467a/go.mod h1:ocZfO/tLSHqfScRDNTJbAJR1by4D1lewauX9OwTaPuY= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= -github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= -github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= -github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= -github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= -github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= -github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= -github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw= -github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU= -github.com/quic-go/webtransport-go v0.10.0 h1:LqXXPOXuETY5Xe8ITdGisBzTYmUOy5eSj+9n4hLTjHI= -github.com/quic-go/webtransport-go v0.10.0/go.mod h1:LeGIXr5BQKE3UsynwVBeQrU1TPrbh73MGoC6jd+V7ow= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= -github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/rs/zerolog v1.35.1 h1:m7xQeoiLIiV0BCEY4Hs+j2NG4Gp2o2KPKmhnnLiazKI= -github.com/rs/zerolog v1.35.1/go.mod h1:EjML9kdfa/RMA7h/6z6pYmq1ykOuA8/mjWaEvGI+jcw= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= -github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY= -github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY= -github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60= -github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= -github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= -github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= -github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= -github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= -github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= -github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -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.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= -github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= -github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= -github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= -github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= -github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= -go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= -go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= -go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.44.0 h1:lgh3PiVrRUWMLOVSkQicxzZll5NjF1r+AtsX1XRIHw0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.44.0/go.mod h1:5Cnhth3m/AgOeTgE3ex12pPmiu/gGtZit03kSzx9X7s= -go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= -go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= -go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= -go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= -go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= -go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= -go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= -go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= -go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= -go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4= -go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= -go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg= -go.uber.org/fx v1.24.0/go.mod h1:AmDeGyS+ZARGKM4tlH4FY2Jr63VjbEDJHtqXTGP5hbo= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= -go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= -go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= -go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= -go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= -go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= -go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= -golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM= -golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4= -golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= -golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= -golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= -golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/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-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-20220503163025-988cb79eb6c6/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.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.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 h1:HjU6IWBiAgRIdAJ9/y1rwCn+UELEmwV+VsTLzj/W4sE= -golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6/go.mod h1:Eqhaxk/wZsWEH8CRxLwj6xzEJbz7k1EFGqx7nyCoabE= -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.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= -golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= -golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= -golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -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/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= -gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.286.0 h1:TdTXMvzYKnWV1/lPbCdbXRqBrkDqjPto22H2xeZZ8LI= -google.golang.org/api v0.286.0/go.mod h1:NlOlUIr8MPoIhT9Bb/oUnRuHbJOLwxb6JSYJM8Yz+jQ= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7 h1:XzmzkmB14QhVhgnawEVsOn6OFsnpyxNPRY9QV01dNB0= -google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:L43LFes82YgSonw6iTXTxXUX1OlULt4AQtkik4ULL/I= -google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= -google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad h1:45WmJvIV6C2+O/jjLkPUH+F3aOj/1miDoU2DD0+NWbg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= -google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -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.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -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-20190902080502-41f04d3bba15/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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/vmihailenco/msgpack.v2 v2.9.2/go.mod h1:/3Dn1Npt9+MYyLpYYXjInO/5jvMLamn+AEGwNEOatn8= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-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= -gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= -gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg= -lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/apps/grpc/main.go b/apps/grpc/main.go deleted file mode 100644 index 74b0a1182c..0000000000 --- a/apps/grpc/main.go +++ /dev/null @@ -1,40 +0,0 @@ -package main - -import ( - "fmt" - "os" - - "github.com/spf13/cobra" - - "github.com/evstack/ev-node/apps/grpc/cmd" - evcmd "github.com/evstack/ev-node/pkg/cmd" - "github.com/evstack/ev-node/pkg/config" -) - -func main() { - // Initiate the root command - rootCmd := &cobra.Command{ - Use: "evgrpc", - Short: "Evolve node with gRPC execution client; single sequencer", - Long: `Run a Evolve node with a gRPC-based execution client. -This allows you to connect to any execution layer that implements -the Evolve execution gRPC interface.`, - } - - config.AddGlobalFlags(rootCmd, "evgrpc") - - rootCmd.AddCommand( - cmd.InitCmd(), - cmd.RunCmd, - evcmd.VersionCmd, - evcmd.NetInfoCmd, - evcmd.StoreUnsafeCleanCmd, - evcmd.KeysCmd(), - ) - - if err := rootCmd.Execute(); err != nil { - // Print to stderr and exit with error - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} diff --git a/buf.gen.grpc.yaml b/buf.gen.grpc.yaml deleted file mode 100644 index 019de76139..0000000000 --- a/buf.gen.grpc.yaml +++ /dev/null @@ -1,11 +0,0 @@ -version: v2 - -plugins: - - remote: buf.build/protocolbuffers/go - out: execution/grpc/types/pb - opt: paths=source_relative - - remote: buf.build/connectrpc/go - out: execution/grpc/types/pb - opt: paths=source_relative -inputs: - - directory: execution/grpc/proto diff --git a/buf.yaml b/buf.yaml index f3aef299bd..bf7debf7cc 100644 --- a/buf.yaml +++ b/buf.yaml @@ -2,7 +2,6 @@ version: v2 modules: - path: proto - - path: execution/grpc/proto lint: use: - COMMENTS diff --git a/client/crates/types/src/proto/evnode.v1.messages.rs b/client/crates/types/src/proto/evnode.v1.messages.rs index 2e3d53e0af..3bba31f88c 100644 --- a/client/crates/types/src/proto/evnode.v1.messages.rs +++ b/client/crates/types/src/proto/evnode.v1.messages.rs @@ -278,161 +278,6 @@ pub struct BlockData { #[prost(bytes = "vec", repeated, tag = "3")] pub blobs: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, } -/// InitChainRequest contains the genesis parameters for chain initialization -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct InitChainRequest { - /// Timestamp marking chain start time in UTC - #[prost(message, optional, tag = "1")] - pub genesis_time: ::core::option::Option<::prost_types::Timestamp>, - /// First block height (must be > 0) - #[prost(uint64, tag = "2")] - pub initial_height: u64, - /// Unique identifier string for the blockchain - #[prost(string, tag = "3")] - pub chain_id: ::prost::alloc::string::String, -} -/// InitChainResponse contains the initial state and configuration -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct InitChainResponse { - /// Hash representing initial state - #[prost(bytes = "vec", tag = "1")] - pub state_root: ::prost::alloc::vec::Vec, -} -/// GetTxsRequest is the request for fetching transactions -/// -/// Empty for now, may include filtering criteria in the future -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetTxsRequest {} -/// TxBatch stores ordered transactions in one contiguous bytes buffer. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct TxBatch { - /// Concatenated transaction bytes. - #[prost(bytes = "vec", tag = "1")] - pub data: ::prost::alloc::vec::Vec, - /// Byte length for each transaction in order. - #[prost(uint32, repeated, tag = "2")] - pub tx_sizes: ::prost::alloc::vec::Vec, -} -/// GetTxsResponse contains the available transactions -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetTxsResponse { - /// Valid transactions from mempool in contiguous batch form. - #[prost(message, optional, tag = "2")] - pub tx_batch: ::core::option::Option, -} -/// ExecuteTxsRequest contains transactions and block context for execution -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ExecuteTxsRequest { - /// Height of block being created (must be > 0) - #[prost(uint64, tag = "2")] - pub block_height: u64, - /// Block creation time in UTC - #[prost(message, optional, tag = "3")] - pub timestamp: ::core::option::Option<::prost_types::Timestamp>, - /// Previous block's state root hash - #[prost(bytes = "vec", tag = "4")] - pub prev_state_root: ::prost::alloc::vec::Vec, - /// Ordered transactions to execute in contiguous batch form. - #[prost(message, optional, tag = "5")] - pub tx_batch: ::core::option::Option, -} -/// ExecuteTxsResponse contains the result of transaction execution -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ExecuteTxsResponse { - /// New state root after executing transactions - #[prost(bytes = "vec", tag = "1")] - pub updated_state_root: ::prost::alloc::vec::Vec, - /// Maximum allowed transaction size (may change with protocol updates) - #[prost(uint64, tag = "2")] - pub max_bytes: u64, - /// Proposer address that should sign the next block. - /// Empty means the current proposer remains active. - #[prost(bytes = "vec", tag = "3")] - pub next_proposer_address: ::prost::alloc::vec::Vec, -} -/// SetFinalRequest marks a block as finalized -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct SetFinalRequest { - /// Height of block to finalize - #[prost(uint64, tag = "1")] - pub block_height: u64, -} -/// SetFinalResponse indicates whether finalization was successful -/// -/// Empty response, errors are returned via gRPC status -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct SetFinalResponse {} -/// GetExecutionInfoRequest requests execution layer parameters -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetExecutionInfoRequest {} -/// GetExecutionInfoResponse contains execution layer parameters -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetExecutionInfoResponse { - /// Maximum gas allowed for transactions in a block - /// For non-gas-based execution layers, this should be 0 - #[prost(uint64, tag = "1")] - pub max_gas: u64, - /// Proposer address that should sign the next block from the execution - /// layer's current view. Empty means unchanged or unavailable. - #[prost(bytes = "vec", tag = "2")] - pub next_proposer_address: ::prost::alloc::vec::Vec, -} -/// FilterTxsRequest contains transactions to validate and filter -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct FilterTxsRequest { - /// Maximum cumulative size allowed (0 means no size limit) - #[prost(uint64, tag = "2")] - pub max_bytes: u64, - /// Maximum cumulative gas allowed (0 means no gas limit) - #[prost(uint64, tag = "3")] - pub max_gas: u64, - /// Whether force-included transactions are present - #[prost(bool, tag = "4")] - pub has_force_included_transaction: bool, - /// All transactions (force-included + mempool) in contiguous batch form. - #[prost(message, optional, tag = "5")] - pub tx_batch: ::core::option::Option, -} -/// FilterTxsResponse contains the filter status for each transaction -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct FilterTxsResponse { - /// Filter status for each transaction (same length as txs in request) - #[prost(enumeration = "FilterStatus", repeated, tag = "1")] - pub statuses: ::prost::alloc::vec::Vec, -} -/// FilterStatus represents the result of filtering a transaction -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] -#[repr(i32)] -pub enum FilterStatus { - /// Transaction will make it to the next batch - FilterOk = 0, - /// Transaction will be filtered out because invalid (too big, malformed, etc.) - FilterRemove = 1, - /// Transaction is valid but postponed for later processing due to size/gas constraint - FilterPostpone = 2, -} -impl FilterStatus { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Self::FilterOk => "FILTER_OK", - Self::FilterRemove => "FILTER_REMOVE", - Self::FilterPostpone => "FILTER_POSTPONE", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "FILTER_OK" => Some(Self::FilterOk), - "FILTER_REMOVE" => Some(Self::FilterRemove), - "FILTER_POSTPONE" => Some(Self::FilterPostpone), - _ => None, - } - } -} /// Block contains all the components of a complete block #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct Block { diff --git a/client/crates/types/src/proto/evnode.v1.services.rs b/client/crates/types/src/proto/evnode.v1.services.rs index c6fc86dd4a..608af18376 100644 --- a/client/crates/types/src/proto/evnode.v1.services.rs +++ b/client/crates/types/src/proto/evnode.v1.services.rs @@ -1023,851 +1023,6 @@ pub struct BlockData { #[prost(bytes = "vec", repeated, tag = "3")] pub blobs: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, } -/// InitChainRequest contains the genesis parameters for chain initialization -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct InitChainRequest { - /// Timestamp marking chain start time in UTC - #[prost(message, optional, tag = "1")] - pub genesis_time: ::core::option::Option<::prost_types::Timestamp>, - /// First block height (must be > 0) - #[prost(uint64, tag = "2")] - pub initial_height: u64, - /// Unique identifier string for the blockchain - #[prost(string, tag = "3")] - pub chain_id: ::prost::alloc::string::String, -} -/// InitChainResponse contains the initial state and configuration -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct InitChainResponse { - /// Hash representing initial state - #[prost(bytes = "vec", tag = "1")] - pub state_root: ::prost::alloc::vec::Vec, -} -/// GetTxsRequest is the request for fetching transactions -/// -/// Empty for now, may include filtering criteria in the future -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetTxsRequest {} -/// TxBatch stores ordered transactions in one contiguous bytes buffer. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct TxBatch { - /// Concatenated transaction bytes. - #[prost(bytes = "vec", tag = "1")] - pub data: ::prost::alloc::vec::Vec, - /// Byte length for each transaction in order. - #[prost(uint32, repeated, tag = "2")] - pub tx_sizes: ::prost::alloc::vec::Vec, -} -/// GetTxsResponse contains the available transactions -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetTxsResponse { - /// Valid transactions from mempool in contiguous batch form. - #[prost(message, optional, tag = "2")] - pub tx_batch: ::core::option::Option, -} -/// ExecuteTxsRequest contains transactions and block context for execution -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ExecuteTxsRequest { - /// Height of block being created (must be > 0) - #[prost(uint64, tag = "2")] - pub block_height: u64, - /// Block creation time in UTC - #[prost(message, optional, tag = "3")] - pub timestamp: ::core::option::Option<::prost_types::Timestamp>, - /// Previous block's state root hash - #[prost(bytes = "vec", tag = "4")] - pub prev_state_root: ::prost::alloc::vec::Vec, - /// Ordered transactions to execute in contiguous batch form. - #[prost(message, optional, tag = "5")] - pub tx_batch: ::core::option::Option, -} -/// ExecuteTxsResponse contains the result of transaction execution -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ExecuteTxsResponse { - /// New state root after executing transactions - #[prost(bytes = "vec", tag = "1")] - pub updated_state_root: ::prost::alloc::vec::Vec, - /// Maximum allowed transaction size (may change with protocol updates) - #[prost(uint64, tag = "2")] - pub max_bytes: u64, - /// Proposer address that should sign the next block. - /// Empty means the current proposer remains active. - #[prost(bytes = "vec", tag = "3")] - pub next_proposer_address: ::prost::alloc::vec::Vec, -} -/// SetFinalRequest marks a block as finalized -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct SetFinalRequest { - /// Height of block to finalize - #[prost(uint64, tag = "1")] - pub block_height: u64, -} -/// SetFinalResponse indicates whether finalization was successful -/// -/// Empty response, errors are returned via gRPC status -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct SetFinalResponse {} -/// GetExecutionInfoRequest requests execution layer parameters -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetExecutionInfoRequest {} -/// GetExecutionInfoResponse contains execution layer parameters -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetExecutionInfoResponse { - /// Maximum gas allowed for transactions in a block - /// For non-gas-based execution layers, this should be 0 - #[prost(uint64, tag = "1")] - pub max_gas: u64, - /// Proposer address that should sign the next block from the execution - /// layer's current view. Empty means unchanged or unavailable. - #[prost(bytes = "vec", tag = "2")] - pub next_proposer_address: ::prost::alloc::vec::Vec, -} -/// FilterTxsRequest contains transactions to validate and filter -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct FilterTxsRequest { - /// Maximum cumulative size allowed (0 means no size limit) - #[prost(uint64, tag = "2")] - pub max_bytes: u64, - /// Maximum cumulative gas allowed (0 means no gas limit) - #[prost(uint64, tag = "3")] - pub max_gas: u64, - /// Whether force-included transactions are present - #[prost(bool, tag = "4")] - pub has_force_included_transaction: bool, - /// All transactions (force-included + mempool) in contiguous batch form. - #[prost(message, optional, tag = "5")] - pub tx_batch: ::core::option::Option, -} -/// FilterTxsResponse contains the filter status for each transaction -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct FilterTxsResponse { - /// Filter status for each transaction (same length as txs in request) - #[prost(enumeration = "FilterStatus", repeated, tag = "1")] - pub statuses: ::prost::alloc::vec::Vec, -} -/// FilterStatus represents the result of filtering a transaction -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] -#[repr(i32)] -pub enum FilterStatus { - /// Transaction will make it to the next batch - FilterOk = 0, - /// Transaction will be filtered out because invalid (too big, malformed, etc.) - FilterRemove = 1, - /// Transaction is valid but postponed for later processing due to size/gas constraint - FilterPostpone = 2, -} -impl FilterStatus { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Self::FilterOk => "FILTER_OK", - Self::FilterRemove => "FILTER_REMOVE", - Self::FilterPostpone => "FILTER_POSTPONE", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "FILTER_OK" => Some(Self::FilterOk), - "FILTER_REMOVE" => Some(Self::FilterRemove), - "FILTER_POSTPONE" => Some(Self::FilterPostpone), - _ => None, - } - } -} -/// Generated client implementations. -pub mod executor_service_client { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value, - )] - use tonic::codegen::*; - use tonic::codegen::http::Uri; - /// ExecutorService defines the execution layer interface for EVNode - #[derive(Debug, Clone)] - pub struct ExecutorServiceClient { - inner: tonic::client::Grpc, - } - impl ExecutorServiceClient { - /// Attempt to create a new client by connecting to a given endpoint. - pub async fn connect(dst: D) -> Result - where - D: TryInto, - D::Error: Into, - { - let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; - Ok(Self::new(conn)) - } - } - impl ExecutorServiceClient - where - T: tonic::client::GrpcService, - T::Error: Into, - T::ResponseBody: Body + std::marker::Send + 'static, - ::Error: Into + std::marker::Send, - { - pub fn new(inner: T) -> Self { - let inner = tonic::client::Grpc::new(inner); - Self { inner } - } - pub fn with_origin(inner: T, origin: Uri) -> Self { - let inner = tonic::client::Grpc::with_origin(inner, origin); - Self { inner } - } - pub fn with_interceptor( - inner: T, - interceptor: F, - ) -> ExecutorServiceClient> - where - F: tonic::service::Interceptor, - T::ResponseBody: Default, - T: tonic::codegen::Service< - http::Request, - Response = http::Response< - >::ResponseBody, - >, - >, - , - >>::Error: Into + std::marker::Send + std::marker::Sync, - { - ExecutorServiceClient::new(InterceptedService::new(inner, interceptor)) - } - /// Compress requests with the given encoding. - /// - /// This requires the server to support it otherwise it might respond with an - /// error. - #[must_use] - pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.inner = self.inner.send_compressed(encoding); - self - } - /// Enable decompressing responses. - #[must_use] - pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.inner = self.inner.accept_compressed(encoding); - self - } - /// Limits the maximum size of a decoded message. - /// - /// Default: `4MB` - #[must_use] - pub fn max_decoding_message_size(mut self, limit: usize) -> Self { - self.inner = self.inner.max_decoding_message_size(limit); - self - } - /// Limits the maximum size of an encoded message. - /// - /// Default: `usize::MAX` - #[must_use] - pub fn max_encoding_message_size(mut self, limit: usize) -> Self { - self.inner = self.inner.max_encoding_message_size(limit); - self - } - /// InitChain initializes a new blockchain instance with genesis parameters - pub async fn init_chain( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::unknown( - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/evnode.v1.ExecutorService/InitChain", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert(GrpcMethod::new("evnode.v1.ExecutorService", "InitChain")); - self.inner.unary(req, path, codec).await - } - /// GetTxs fetches available transactions from the execution layer's mempool - pub async fn get_txs( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::unknown( - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/evnode.v1.ExecutorService/GetTxs", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert(GrpcMethod::new("evnode.v1.ExecutorService", "GetTxs")); - self.inner.unary(req, path, codec).await - } - /// ExecuteTxs processes transactions to produce a new block state - pub async fn execute_txs( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::unknown( - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/evnode.v1.ExecutorService/ExecuteTxs", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert(GrpcMethod::new("evnode.v1.ExecutorService", "ExecuteTxs")); - self.inner.unary(req, path, codec).await - } - /// SetFinal marks a block as finalized at the specified height - pub async fn set_final( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::unknown( - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/evnode.v1.ExecutorService/SetFinal", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert(GrpcMethod::new("evnode.v1.ExecutorService", "SetFinal")); - self.inner.unary(req, path, codec).await - } - /// GetExecutionInfo returns current execution layer parameters - pub async fn get_execution_info( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::unknown( - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/evnode.v1.ExecutorService/GetExecutionInfo", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert( - GrpcMethod::new("evnode.v1.ExecutorService", "GetExecutionInfo"), - ); - self.inner.unary(req, path, codec).await - } - /// FilterTxs validates force-included transactions and calculates gas for all transactions - pub async fn filter_txs( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::unknown( - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/evnode.v1.ExecutorService/FilterTxs", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert(GrpcMethod::new("evnode.v1.ExecutorService", "FilterTxs")); - self.inner.unary(req, path, codec).await - } - } -} -/// Generated server implementations. -pub mod executor_service_server { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value, - )] - use tonic::codegen::*; - /// Generated trait containing gRPC methods that should be implemented for use with ExecutorServiceServer. - #[async_trait] - pub trait ExecutorService: std::marker::Send + std::marker::Sync + 'static { - /// InitChain initializes a new blockchain instance with genesis parameters - async fn init_chain( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - /// GetTxs fetches available transactions from the execution layer's mempool - async fn get_txs( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status>; - /// ExecuteTxs processes transactions to produce a new block state - async fn execute_txs( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - /// SetFinal marks a block as finalized at the specified height - async fn set_final( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - /// GetExecutionInfo returns current execution layer parameters - async fn get_execution_info( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - /// FilterTxs validates force-included transactions and calculates gas for all transactions - async fn filter_txs( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - } - /// ExecutorService defines the execution layer interface for EVNode - #[derive(Debug)] - pub struct ExecutorServiceServer { - inner: Arc, - accept_compression_encodings: EnabledCompressionEncodings, - send_compression_encodings: EnabledCompressionEncodings, - max_decoding_message_size: Option, - max_encoding_message_size: Option, - } - impl ExecutorServiceServer { - pub fn new(inner: T) -> Self { - Self::from_arc(Arc::new(inner)) - } - pub fn from_arc(inner: Arc) -> Self { - Self { - inner, - accept_compression_encodings: Default::default(), - send_compression_encodings: Default::default(), - max_decoding_message_size: None, - max_encoding_message_size: None, - } - } - pub fn with_interceptor( - inner: T, - interceptor: F, - ) -> InterceptedService - where - F: tonic::service::Interceptor, - { - InterceptedService::new(Self::new(inner), interceptor) - } - /// Enable decompressing requests with the given encoding. - #[must_use] - pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.accept_compression_encodings.enable(encoding); - self - } - /// Compress responses with the given encoding, if the client supports it. - #[must_use] - pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.send_compression_encodings.enable(encoding); - self - } - /// Limits the maximum size of a decoded message. - /// - /// Default: `4MB` - #[must_use] - pub fn max_decoding_message_size(mut self, limit: usize) -> Self { - self.max_decoding_message_size = Some(limit); - self - } - /// Limits the maximum size of an encoded message. - /// - /// Default: `usize::MAX` - #[must_use] - pub fn max_encoding_message_size(mut self, limit: usize) -> Self { - self.max_encoding_message_size = Some(limit); - self - } - } - impl tonic::codegen::Service> for ExecutorServiceServer - where - T: ExecutorService, - B: Body + std::marker::Send + 'static, - B::Error: Into + std::marker::Send + 'static, - { - type Response = http::Response; - type Error = std::convert::Infallible; - type Future = BoxFuture; - fn poll_ready( - &mut self, - _cx: &mut Context<'_>, - ) -> Poll> { - Poll::Ready(Ok(())) - } - fn call(&mut self, req: http::Request) -> Self::Future { - match req.uri().path() { - "/evnode.v1.ExecutorService/InitChain" => { - #[allow(non_camel_case_types)] - struct InitChainSvc(pub Arc); - impl< - T: ExecutorService, - > tonic::server::UnaryService - for InitChainSvc { - type Response = super::InitChainResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::init_chain(&inner, request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = InitChainSvc(inner); - let codec = tonic_prost::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/evnode.v1.ExecutorService/GetTxs" => { - #[allow(non_camel_case_types)] - struct GetTxsSvc(pub Arc); - impl< - T: ExecutorService, - > tonic::server::UnaryService - for GetTxsSvc { - type Response = super::GetTxsResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::get_txs(&inner, request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = GetTxsSvc(inner); - let codec = tonic_prost::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/evnode.v1.ExecutorService/ExecuteTxs" => { - #[allow(non_camel_case_types)] - struct ExecuteTxsSvc(pub Arc); - impl< - T: ExecutorService, - > tonic::server::UnaryService - for ExecuteTxsSvc { - type Response = super::ExecuteTxsResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::execute_txs(&inner, request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = ExecuteTxsSvc(inner); - let codec = tonic_prost::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/evnode.v1.ExecutorService/SetFinal" => { - #[allow(non_camel_case_types)] - struct SetFinalSvc(pub Arc); - impl< - T: ExecutorService, - > tonic::server::UnaryService - for SetFinalSvc { - type Response = super::SetFinalResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::set_final(&inner, request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = SetFinalSvc(inner); - let codec = tonic_prost::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/evnode.v1.ExecutorService/GetExecutionInfo" => { - #[allow(non_camel_case_types)] - struct GetExecutionInfoSvc(pub Arc); - impl< - T: ExecutorService, - > tonic::server::UnaryService - for GetExecutionInfoSvc { - type Response = super::GetExecutionInfoResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::get_execution_info(&inner, request) - .await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = GetExecutionInfoSvc(inner); - let codec = tonic_prost::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/evnode.v1.ExecutorService/FilterTxs" => { - #[allow(non_camel_case_types)] - struct FilterTxsSvc(pub Arc); - impl< - T: ExecutorService, - > tonic::server::UnaryService - for FilterTxsSvc { - type Response = super::FilterTxsResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::filter_txs(&inner, request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = FilterTxsSvc(inner); - let codec = tonic_prost::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - _ => { - Box::pin(async move { - let mut response = http::Response::new( - tonic::body::Body::default(), - ); - let headers = response.headers_mut(); - headers - .insert( - tonic::Status::GRPC_STATUS, - (tonic::Code::Unimplemented as i32).into(), - ); - headers - .insert( - http::header::CONTENT_TYPE, - tonic::metadata::GRPC_CONTENT_TYPE, - ); - Ok(response) - }) - } - } - } - } - impl Clone for ExecutorServiceServer { - fn clone(&self) -> Self { - let inner = self.inner.clone(); - Self { - inner, - accept_compression_encodings: self.accept_compression_encodings, - send_compression_encodings: self.send_compression_encodings, - max_decoding_message_size: self.max_decoding_message_size, - max_encoding_message_size: self.max_encoding_message_size, - } - } - } - /// Generated gRPC service name - pub const SERVICE_NAME: &str = "evnode.v1.ExecutorService"; - impl tonic::server::NamedService for ExecutorServiceServer { - const NAME: &'static str = SERVICE_NAME; - } -} /// Block contains all the components of a complete block #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct Block { diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 04205d5e72..97e08dd868 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -351,6 +351,7 @@ function sidebarHome() { { text: "Overview", link: "/ev-reth/overview" }, { text: "Configuration", link: "/ev-reth/configuration" }, { text: "Engine API", link: "/ev-reth/engine-api" }, + { text: "Storage Ownership", link: "/ev-reth/storage-ownership" }, { text: "JavaScript Client", link: "/ev-reth/js-client" }, { text: "Features", diff --git a/docs/ev-reth/overview.md b/docs/ev-reth/overview.md index 5833e578b8..f0b0a027bf 100644 --- a/docs/ev-reth/overview.md +++ b/docs/ev-reth/overview.md @@ -69,4 +69,5 @@ Use ev-reth when you want: - [EVM Quickstart](/getting-started/evm/quickstart) — Get started - [Configuration](/ev-reth/configuration) — Chainspec and settings - [Engine API](/ev-reth/engine-api) — How ev-node communicates with ev-reth +- [Storage Ownership](/ev-reth/storage-ownership) — Proposed storage split between ev-node and ev-reth - [JavaScript Client](/ev-reth/js-client) — Build and sponsor type `0x76` transactions diff --git a/execution/grpc/README.md b/execution/grpc/README.md deleted file mode 100644 index 4b3742bc4a..0000000000 --- a/execution/grpc/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# gRPC Execution Client - -This package provides a gRPC-based implementation of the Evolve execution interface. It allows Evolve to communicate with execution clients via gRPC using the Connect-RPC framework. - -## Overview - -The gRPC execution client enables separation between the consensus layer (Evolve) and the execution layer by providing a process boundary for communication. Execution clients can run on different machines over TCP, or on the same machine over a Unix domain socket to avoid TCP/IP overhead. - -## Usage - -### Client - -To connect to a remote execution service: - -```go -import ( - "github.com/evstack/ev-node/execution/grpc" -) - -// Create a new gRPC client over TCP -client, err := grpc.NewClient("http://localhost:50051") -if err != nil { - return err -} - -// Or connect to an executor on the same machine over a Unix domain socket -client, err = grpc.NewClient("unix:///tmp/evolve-executor.sock") -if err != nil { - return err -} - -// Use the client as an execution.Executor -ctx := context.Background() -stateRoot, err := client.InitChain(ctx, time.Now(), 1, "my-chain") -``` - -### Server - -To serve an execution implementation via gRPC: - -```go -import ( - "net/http" - "github.com/evstack/ev-node/execution/grpc" -) - -// Wrap your executor implementation -handler := grpc.NewExecutorServiceHandler(myExecutor) - -// Start the HTTP server -http.ListenAndServe(":50051", handler) -``` - -To serve on a Unix domain socket: - -```go -import "github.com/evstack/ev-node/execution/grpc" - -err := grpc.ListenAndServeUnix("/tmp/evolve-executor.sock", myExecutor) -``` - -## Protocol - -The gRPC service is defined in `proto/evnode/v1/execution.proto` and provides the following methods: - -- `InitChain`: Initialize the blockchain with genesis parameters -- `GetTxs`: Fetch transactions from the mempool -- `ExecuteTxs`: Execute transactions and update state -- `SetFinal`: Mark a block as finalized -- `GetExecutionInfo`: Return current execution limits -- `FilterTxs`: Validate and filter force-included transactions - -## Features - -- Full implementation of the `execution.Executor` interface -- Support for HTTP/1.1 and HTTP/2 (via h2c) -- Support for Unix domain socket connections with `unix:///path/to/socket` -- gRPC reflection for debugging and service discovery -- Compression for efficient data transfer -- Contiguous `tx_batch` transaction encoding to reduce per-transaction protobuf overhead -- Comprehensive error handling and validation - -## Testing - -Run the tests with: - -```bash -go test ./execution/grpc/... -``` - -The package includes comprehensive unit tests for both client and server implementations. diff --git a/execution/grpc/client.go b/execution/grpc/client.go deleted file mode 100644 index 3b94e241b0..0000000000 --- a/execution/grpc/client.go +++ /dev/null @@ -1,241 +0,0 @@ -package grpc - -import ( - "context" - "crypto/tls" - "errors" - "fmt" - "net" - "net/http" - "strings" - "time" - - "connectrpc.com/connect" - "golang.org/x/net/http2" - "google.golang.org/protobuf/types/known/timestamppb" - - "github.com/evstack/ev-node/core/execution" - pb "github.com/evstack/ev-node/execution/grpc/types/pb/evnode/v1" - "github.com/evstack/ev-node/execution/grpc/types/pb/evnode/v1/v1connect" -) - -// Ensure Client implements the execution.Executor interface -var _ execution.Executor = (*Client)(nil) - -// Client is a gRPC client that implements the execution.Executor interface. -// It communicates with a remote execution service via gRPC using Connect-RPC. -type Client struct { - client v1connect.ExecutorServiceClient -} - -const ( - unixURLPrefix = "unix://" - unixHTTPBaseURL = "http://unix" -) - -// newHTTP2Client creates an HTTP/2 client that supports cleartext (h2c) connections. -// This is required to connect to native gRPC servers without TLS. -func newHTTP2Client() *http.Client { - return &http.Client{ - Transport: &http2.Transport{ - AllowHTTP: true, - DialTLSContext: func(ctx context.Context, network, addr string, _ *tls.Config) (net.Conn, error) { - var d net.Dialer - return d.DialContext(ctx, network, addr) - }, - }, - } -} - -// newUnixHTTP2Client creates an HTTP/2 client that speaks h2c over a Unix domain socket. -func newUnixHTTP2Client(socketPath string) (*http.Client, error) { - if socketPath == "" { - return nil, errors.New("unix socket path is required") - } - return &http.Client{ - Transport: &http2.Transport{ - AllowHTTP: true, - DialTLSContext: func(ctx context.Context, _, _ string, _ *tls.Config) (net.Conn, error) { - var d net.Dialer - return d.DialContext(ctx, "unix", socketPath) - }, - }, - }, nil -} - -func clientTransportForTarget(target string) (*http.Client, string, error) { - socketPath, ok := unixSocketPath(target) - if ok { - httpClient, err := newUnixHTTP2Client(socketPath) - if err != nil { - return nil, "", err - } - return httpClient, unixHTTPBaseURL, nil - } - return newHTTP2Client(), target, nil -} - -func unixSocketPath(target string) (string, bool) { - if !strings.HasPrefix(target, unixURLPrefix) { - return "", false - } - return strings.TrimPrefix(target, unixURLPrefix), true -} - -// NewClient creates a new gRPC execution client. -// -// Parameters: -// - url: The URL of the gRPC server (e.g., "http://localhost:50051" or "unix:///tmp/executor.sock") -// - opts: Optional Connect client options for configuring the connection -// -// Returns: -// - *Client: The initialized gRPC client -// - error: Any client construction error -func NewClient(url string, opts ...connect.ClientOption) (*Client, error) { - // Prepend WithGRPC to use the native gRPC protocol (required for tonic/gRPC servers) - opts = append([]connect.ClientOption{connect.WithGRPC()}, opts...) - httpClient, targetURL, err := clientTransportForTarget(url) - if err != nil { - return nil, err - } - opts = append([]connect.ClientOption{connect.WithInterceptors(outboundPropagationInterceptor())}, opts...) - return &Client{ - client: v1connect.NewExecutorServiceClient( - httpClient, - targetURL, - opts..., - ), - }, nil -} - -// InitChain initializes a new blockchain instance with genesis parameters. -// -// This method sends an InitChain request to the remote execution service and -// returns the initial state root. -func (c *Client) InitChain(ctx context.Context, genesisTime time.Time, initialHeight uint64, chainID string) (stateRoot []byte, err error) { - req := connect.NewRequest(&pb.InitChainRequest{ - GenesisTime: timestamppb.New(genesisTime), - InitialHeight: initialHeight, - ChainId: chainID, - }) - - resp, err := c.client.InitChain(ctx, req) - if err != nil { - return nil, fmt.Errorf("grpc client: failed to init chain: %w", err) - } - - return resp.Msg.StateRoot, nil -} - -// GetTxs fetches available transactions from the execution layer's mempool. -// -// This method retrieves transactions that are ready to be included in a block. -// The execution service may perform validation and filtering before returning transactions. -func (c *Client) GetTxs(ctx context.Context) ([][]byte, error) { - req := connect.NewRequest(&pb.GetTxsRequest{}) - - resp, err := c.client.GetTxs(ctx, req) - if err != nil { - return nil, fmt.Errorf("grpc client: failed to get txs: %w", err) - } - - txs, err := decodeTxBatch(resp.Msg.TxBatch) - if err != nil { - return nil, fmt.Errorf("grpc client: invalid get txs response: %w", err) - } - - return txs, nil -} - -// ExecuteTxs processes transactions to produce a new block state. -// -// This method sends transactions to the execution service for processing and -// returns the updated state root after execution. The execution service ensures -// deterministic execution and validates the state transition. -func (c *Client) ExecuteTxs(ctx context.Context, txs [][]byte, blockHeight uint64, timestamp time.Time, prevStateRoot []byte) (execution.ExecuteResult, error) { - txBatch, err := encodeTxBatch(txs) - if err != nil { - return execution.ExecuteResult{}, fmt.Errorf("grpc client: failed to encode tx batch: %w", err) - } - - req := connect.NewRequest(&pb.ExecuteTxsRequest{ - TxBatch: txBatch, - BlockHeight: blockHeight, - Timestamp: timestamppb.New(timestamp), - PrevStateRoot: prevStateRoot, - }) - - resp, err := c.client.ExecuteTxs(ctx, req) - if err != nil { - return execution.ExecuteResult{}, fmt.Errorf("grpc client: failed to execute txs: %w", err) - } - - return execution.ExecuteResult{ - UpdatedStateRoot: resp.Msg.UpdatedStateRoot, - NextProposerAddress: resp.Msg.NextProposerAddress, - }, nil -} - -// SetFinal marks a block as finalized at the specified height. -// -// This method notifies the execution service that a block has been finalized, -// allowing it to perform cleanup operations and commit the state permanently. -func (c *Client) SetFinal(ctx context.Context, blockHeight uint64) error { - req := connect.NewRequest(&pb.SetFinalRequest{ - BlockHeight: blockHeight, - }) - - _, err := c.client.SetFinal(ctx, req) - if err != nil { - return fmt.Errorf("grpc client: failed to set final: %w", err) - } - - return nil -} - -// GetExecutionInfo returns current execution layer parameters. -// -// This method retrieves execution parameters such as the block gas limit -// from the remote execution service. -func (c *Client) GetExecutionInfo(ctx context.Context) (execution.ExecutionInfo, error) { - req := connect.NewRequest(&pb.GetExecutionInfoRequest{}) - - resp, err := c.client.GetExecutionInfo(ctx, req) - if err != nil { - return execution.ExecutionInfo{}, fmt.Errorf("grpc client: failed to get execution info: %w", err) - } - - return execution.ExecutionInfo{ - MaxGas: resp.Msg.MaxGas, - }, nil -} - -// FilterTxs validates force-included transactions and applies gas and size filtering. -// -// This method sends transactions to the remote execution service for validation. -// Returns a slice of FilterStatus for each transaction. -func (c *Client) FilterTxs(ctx context.Context, txs [][]byte, maxBytes, maxGas uint64, hasForceIncludedTransaction bool) ([]execution.FilterStatus, error) { - txBatch, err := encodeTxBatch(txs) - if err != nil { - return nil, fmt.Errorf("grpc client: failed to encode tx batch: %w", err) - } - - req := connect.NewRequest(&pb.FilterTxsRequest{ - TxBatch: txBatch, - MaxBytes: maxBytes, - MaxGas: maxGas, - HasForceIncludedTransaction: hasForceIncludedTransaction, - }) - - resp, err := c.client.FilterTxs(ctx, req) - if err != nil { - return nil, fmt.Errorf("grpc client: failed to filter transactions: %w", err) - } - - // Convert protobuf FilterStatus to execution.FilterStatus - result := make([]execution.FilterStatus, len(resp.Msg.Statuses)) - for i, status := range resp.Msg.Statuses { - result[i] = execution.FilterStatus(status) - } - return result, nil -} diff --git a/execution/grpc/client_test.go b/execution/grpc/client_test.go deleted file mode 100644 index aad53ef0fd..0000000000 --- a/execution/grpc/client_test.go +++ /dev/null @@ -1,357 +0,0 @@ -package grpc - -import ( - "context" - "errors" - "net" - "net/http" - "net/http/httptest" - "strings" - "testing" - "time" - - "github.com/evstack/ev-node/core/execution" -) - -// mockExecutor is a mock implementation of execution.Executor for testing -type mockExecutor struct { - initChainFunc func(ctx context.Context, genesisTime time.Time, initialHeight uint64, chainID string) ([]byte, error) - getTxsFunc func(ctx context.Context) ([][]byte, error) - executeTxsFunc func(ctx context.Context, txs [][]byte, blockHeight uint64, timestamp time.Time, prevStateRoot []byte) (execution.ExecuteResult, error) - setFinalFunc func(ctx context.Context, blockHeight uint64) error - getExecutionInfoFunc func(ctx context.Context) (execution.ExecutionInfo, error) - filterTxsFunc func(ctx context.Context, txs [][]byte, maxBytes, maxGas uint64, hasForceIncludedTransaction bool) ([]execution.FilterStatus, error) -} - -func (m *mockExecutor) InitChain(ctx context.Context, genesisTime time.Time, initialHeight uint64, chainID string) ([]byte, error) { - if m.initChainFunc != nil { - return m.initChainFunc(ctx, genesisTime, initialHeight, chainID) - } - return []byte("mock_state_root"), nil -} - -func (m *mockExecutor) GetTxs(ctx context.Context) ([][]byte, error) { - if m.getTxsFunc != nil { - return m.getTxsFunc(ctx) - } - return [][]byte{[]byte("tx1"), []byte("tx2")}, nil -} - -func (m *mockExecutor) ExecuteTxs(ctx context.Context, txs [][]byte, blockHeight uint64, timestamp time.Time, prevStateRoot []byte) (execution.ExecuteResult, error) { - if m.executeTxsFunc != nil { - return m.executeTxsFunc(ctx, txs, blockHeight, timestamp, prevStateRoot) - } - return execution.ExecuteResult{UpdatedStateRoot: []byte("updated_state_root")}, nil -} - -func (m *mockExecutor) SetFinal(ctx context.Context, blockHeight uint64) error { - if m.setFinalFunc != nil { - return m.setFinalFunc(ctx, blockHeight) - } - return nil -} - -func (m *mockExecutor) GetExecutionInfo(ctx context.Context) (execution.ExecutionInfo, error) { - if m.getExecutionInfoFunc != nil { - return m.getExecutionInfoFunc(ctx) - } - return execution.ExecutionInfo{MaxGas: 0}, nil -} - -func (m *mockExecutor) FilterTxs(ctx context.Context, txs [][]byte, maxBytes, maxGas uint64, hasForceIncludedTransaction bool) ([]execution.FilterStatus, error) { - if m.filterTxsFunc != nil { - return m.filterTxsFunc(ctx, txs, maxBytes, maxGas, hasForceIncludedTransaction) - } - // Default: return all txs as OK - result := make([]execution.FilterStatus, len(txs)) - for i := range result { - result[i] = execution.FilterOK - } - return result, nil -} - -func newTestClient(t *testing.T, url string) *Client { - t.Helper() - - client, err := NewClient(url) - if err != nil { - t.Fatalf("new client: %v", err) - } - return client -} - -func TestClient_InitChain(t *testing.T) { - ctx := context.Background() - expectedStateRoot := []byte("test_state_root") - genesisTime := time.Now() - initialHeight := uint64(1) - chainID := "test-chain" - - mockExec := &mockExecutor{ - initChainFunc: func(ctx context.Context, gt time.Time, ih uint64, cid string) ([]byte, error) { - if !gt.Equal(genesisTime) { - t.Errorf("expected genesis time %v, got %v", genesisTime, gt) - } - if ih != initialHeight { - t.Errorf("expected initial height %d, got %d", initialHeight, ih) - } - if cid != chainID { - t.Errorf("expected chain ID %s, got %s", chainID, cid) - } - return expectedStateRoot, nil - }, - } - - // Start test server - handler := NewExecutorServiceHandler(mockExec) - server := httptest.NewServer(handler) - defer server.Close() - - // Create client - client := newTestClient(t, server.URL) - - // Test InitChain - stateRoot, err := client.InitChain(ctx, genesisTime, initialHeight, chainID) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - if string(stateRoot) != string(expectedStateRoot) { - t.Errorf("expected state root %s, got %s", expectedStateRoot, stateRoot) - } -} - -func TestClient_GetTxs(t *testing.T) { - ctx := context.Background() - expectedTxs := [][]byte{[]byte("tx1"), []byte("tx2"), []byte("tx3")} - - mockExec := &mockExecutor{ - getTxsFunc: func(ctx context.Context) ([][]byte, error) { - return expectedTxs, nil - }, - } - - // Start test server - handler := NewExecutorServiceHandler(mockExec) - server := httptest.NewServer(handler) - defer server.Close() - - // Create client - client := newTestClient(t, server.URL) - - // Test GetTxs - txs, err := client.GetTxs(ctx) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - if len(txs) != len(expectedTxs) { - t.Fatalf("expected %d txs, got %d", len(expectedTxs), len(txs)) - } - - for i, tx := range txs { - if string(tx) != string(expectedTxs[i]) { - t.Errorf("tx %d: expected %s, got %s", i, expectedTxs[i], tx) - } - } -} - -func TestClient_ExecuteTxs(t *testing.T) { - ctx := context.Background() - txs := [][]byte{[]byte("tx1"), []byte("tx2")} - blockHeight := uint64(10) - timestamp := time.Now() - prevStateRoot := []byte("prev_state_root") - expectedStateRoot := []byte("new_state_root") - - mockExec := &mockExecutor{ - executeTxsFunc: func(ctx context.Context, txsIn [][]byte, bh uint64, ts time.Time, psr []byte) (execution.ExecuteResult, error) { - if len(txsIn) != len(txs) { - t.Errorf("expected %d txs, got %d", len(txs), len(txsIn)) - } - if bh != blockHeight { - t.Errorf("expected block height %d, got %d", blockHeight, bh) - } - if !ts.Equal(timestamp) { - t.Errorf("expected timestamp %v, got %v", timestamp, ts) - } - if string(psr) != string(prevStateRoot) { - t.Errorf("expected prev state root %s, got %s", prevStateRoot, psr) - } - return execution.ExecuteResult{UpdatedStateRoot: expectedStateRoot}, nil - }, - } - - // Start test server - handler := NewExecutorServiceHandler(mockExec) - server := httptest.NewServer(handler) - defer server.Close() - - // Create client - client := newTestClient(t, server.URL) - - // Test ExecuteTxs - result, err := client.ExecuteTxs(ctx, txs, blockHeight, timestamp, prevStateRoot) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - if string(result.UpdatedStateRoot) != string(expectedStateRoot) { - t.Errorf("expected state root %s, got %s", expectedStateRoot, result.UpdatedStateRoot) - } -} - -func TestClient_SetFinal(t *testing.T) { - ctx := context.Background() - blockHeight := uint64(100) - - mockExec := &mockExecutor{ - setFinalFunc: func(ctx context.Context, bh uint64) error { - if bh != blockHeight { - t.Errorf("expected block height %d, got %d", blockHeight, bh) - } - return nil - }, - } - - // Start test server - handler := NewExecutorServiceHandler(mockExec) - server := httptest.NewServer(handler) - defer server.Close() - - // Create client - client := newTestClient(t, server.URL) - - // Test SetFinal - err := client.SetFinal(ctx, blockHeight) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestClient_FilterTxs(t *testing.T) { - ctx := context.Background() - txs := [][]byte{[]byte("tx1"), []byte{}, []byte("tx3")} - maxBytes := uint64(100) - maxGas := uint64(200) - hasForced := true - expectedStatuses := []execution.FilterStatus{ - execution.FilterOK, - execution.FilterRemove, - execution.FilterPostpone, - } - - mockExec := &mockExecutor{ - filterTxsFunc: func(ctx context.Context, txsIn [][]byte, mb, mg uint64, forced bool) ([]execution.FilterStatus, error) { - if len(txsIn) != len(txs) { - t.Fatalf("expected %d txs, got %d", len(txs), len(txsIn)) - } - for i, tx := range txsIn { - if string(tx) != string(txs[i]) { - t.Fatalf("tx %d: expected %q, got %q", i, txs[i], tx) - } - } - if mb != maxBytes { - t.Fatalf("expected max bytes %d, got %d", maxBytes, mb) - } - if mg != maxGas { - t.Fatalf("expected max gas %d, got %d", maxGas, mg) - } - if forced != hasForced { - t.Fatalf("expected forced=%t, got %t", hasForced, forced) - } - return expectedStatuses, nil - }, - } - - handler := NewExecutorServiceHandler(mockExec) - server := httptest.NewServer(handler) - defer server.Close() - - client := newTestClient(t, server.URL) - - statuses, err := client.FilterTxs(ctx, txs, maxBytes, maxGas, hasForced) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if len(statuses) != len(expectedStatuses) { - t.Fatalf("expected %d statuses, got %d", len(expectedStatuses), len(statuses)) - } - for i, status := range statuses { - if status != expectedStatuses[i] { - t.Fatalf("status %d: expected %v, got %v", i, expectedStatuses[i], status) - } - } -} - -func TestClient_UnixSocket(t *testing.T) { - ctx := context.Background() - socketPath := testUnixSocketPath(t) - expectedTxs := [][]byte{[]byte("tx1"), []byte("tx2")} - - mockExec := &mockExecutor{ - getTxsFunc: func(ctx context.Context) ([][]byte, error) { - return expectedTxs, nil - }, - } - - startUnixTestServer(t, mockExec, socketPath) - - client := newTestClient(t, "unix://"+socketPath) - txs, err := client.GetTxs(ctx) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if len(txs) != len(expectedTxs) { - t.Fatalf("expected %d txs, got %d", len(expectedTxs), len(txs)) - } - for i, tx := range txs { - if string(tx) != string(expectedTxs[i]) { - t.Fatalf("tx %d: expected %q, got %q", i, expectedTxs[i], tx) - } - } -} - -func TestNewClientRejectsEmptyUnixSocketPath(t *testing.T) { - client, err := NewClient("unix://") - if err == nil { - t.Fatalf("expected empty unix socket path error") - } - if client != nil { - t.Fatalf("expected nil client, got %v", client) - } - if !strings.Contains(err.Error(), "unix socket path is required") { - t.Fatalf("expected unix socket path error, got %v", err) - } -} - -func startUnixTestServer(t *testing.T, executor execution.Executor, socketPath string) { - t.Helper() - - listener, err := ListenUnix(socketPath) - if err != nil { - t.Fatalf("listen unix socket: %v", err) - } - - server := &http.Server{Handler: NewExecutorServiceHandler(executor)} - done := make(chan error, 1) - go func() { - err := server.Serve(listener) - if errors.Is(err, http.ErrServerClosed) || errors.Is(err, net.ErrClosed) { - err = nil - } - done <- err - }() - - t.Cleanup(func() { - _ = server.Close() - select { - case err := <-done: - if err != nil { - t.Errorf("unix socket server error: %v", err) - } - case <-time.After(time.Second): - t.Error("unix socket server did not stop") - } - }) -} diff --git a/execution/grpc/go.mod b/execution/grpc/go.mod deleted file mode 100644 index 6ee902c3be..0000000000 --- a/execution/grpc/go.mod +++ /dev/null @@ -1,30 +0,0 @@ -module github.com/evstack/ev-node/execution/grpc - -go 1.25.7 - -replace ( - github.com/evstack/ev-node => ../../ - github.com/evstack/ev-node/core => ../../core -) - -require ( - connectrpc.com/connect v1.20.0 - connectrpc.com/grpcreflect v1.3.0 - github.com/evstack/ev-node/core v1.0.0 - go.opentelemetry.io/otel v1.44.0 - go.opentelemetry.io/otel/sdk v1.44.0 - go.opentelemetry.io/otel/trace v1.44.0 - golang.org/x/net v0.56.0 - google.golang.org/protobuf v1.36.11 -) - -require ( - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/go-logr/logr v1.4.3 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/google/uuid v1.6.0 // indirect - go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/otel/metric v1.44.0 // indirect - golang.org/x/sys v0.46.0 // indirect - golang.org/x/text v0.38.0 // indirect -) diff --git a/execution/grpc/go.sum b/execution/grpc/go.sum deleted file mode 100644 index a748fff2f9..0000000000 --- a/execution/grpc/go.sum +++ /dev/null @@ -1,45 +0,0 @@ -connectrpc.com/connect v1.20.0 h1:6TNDAB+WeNd2uolWNlYczB5E0KNNaVMNUEx8JEUsPmQ= -connectrpc.com/connect v1.20.0/go.mod h1:A2ygJrukXwWy32vkCAAHNVguZrqZ+jeZ9rGRnGR4dN4= -connectrpc.com/grpcreflect v1.3.0 h1:Y4V+ACf8/vOb1XOc251Qun7jMB75gCUNw6llvB9csXc= -connectrpc.com/grpcreflect v1.3.0/go.mod h1:nfloOtCS8VUQOQ1+GTdFzVg2CJo4ZGaat8JIovCtDYs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/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/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= -github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= -go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= -go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= -go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= -go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= -go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= -go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= -go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= -go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= -go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= -go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= -golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= -golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/execution/grpc/handler.go b/execution/grpc/handler.go deleted file mode 100644 index 76db8e87f2..0000000000 --- a/execution/grpc/handler.go +++ /dev/null @@ -1,54 +0,0 @@ -package grpc - -import ( - "net/http" - "time" - - "connectrpc.com/connect" - "connectrpc.com/grpcreflect" - "golang.org/x/net/http2" - "golang.org/x/net/http2/h2c" - - "github.com/evstack/ev-node/core/execution" - "github.com/evstack/ev-node/execution/grpc/types/pb/evnode/v1/v1connect" -) - -// NewExecutorServiceHandler creates a new HTTP handler for the ExecutorService. -// It follows the same pattern as other services in the codebase, supporting -// both HTTP/1.1 and HTTP/2 without TLS using h2c. -// -// Parameters: -// - executor: The execution implementation to serve -// - opts: Optional server options for configuring the service -// -// Returns: -// - http.Handler: The configured HTTP handler -func NewExecutorServiceHandler(executor execution.Executor, opts ...connect.HandlerOption) http.Handler { - server := NewServer(executor) - opts = append([]connect.HandlerOption{connect.WithInterceptors(inboundPropagationInterceptor())}, opts...) - - mux := http.NewServeMux() - - // Configure compression to start at 1KB - compress1KB := connect.WithCompressMinBytes(1024) - - // Set up gRPC reflection for debugging and discovery - reflector := grpcreflect.NewStaticReflector( - v1connect.ExecutorServiceName, - ) - mux.Handle(grpcreflect.NewHandlerV1(reflector, compress1KB)) - mux.Handle(grpcreflect.NewHandlerV1Alpha(reflector, compress1KB)) - - // Register the ExecutorService - path, handler := v1connect.NewExecutorServiceHandler(server, append(opts, compress1KB)...) - mux.Handle(path, handler) - - // Use h2c to support HTTP/2 without TLS - return h2c.NewHandler(mux, &http2.Server{ - IdleTimeout: 120 * time.Second, - MaxReadFrameSize: 1 << 24, // 16MB - MaxConcurrentStreams: 100, - ReadIdleTimeout: 30 * time.Second, - PingTimeout: 15 * time.Second, - }) -} diff --git a/execution/grpc/otel_propagation.go b/execution/grpc/otel_propagation.go deleted file mode 100644 index da4d1595ed..0000000000 --- a/execution/grpc/otel_propagation.go +++ /dev/null @@ -1,29 +0,0 @@ -package grpc - -import ( - "context" - - "connectrpc.com/connect" - "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/propagation" -) - -func inboundPropagationInterceptor() connect.UnaryInterceptorFunc { - return connect.UnaryInterceptorFunc(func(next connect.UnaryFunc) connect.UnaryFunc { - return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { - prop := otel.GetTextMapPropagator() - ctx = prop.Extract(ctx, propagation.HeaderCarrier(req.Header())) - return next(ctx, req) - } - }) -} - -func outboundPropagationInterceptor() connect.UnaryInterceptorFunc { - return connect.UnaryInterceptorFunc(func(next connect.UnaryFunc) connect.UnaryFunc { - return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { - prop := otel.GetTextMapPropagator() - prop.Inject(ctx, propagation.HeaderCarrier(req.Header())) - return next(ctx, req) - } - }) -} diff --git a/execution/grpc/otel_propagation_test.go b/execution/grpc/otel_propagation_test.go deleted file mode 100644 index 5815732f2a..0000000000 --- a/execution/grpc/otel_propagation_test.go +++ /dev/null @@ -1,226 +0,0 @@ -package grpc - -import ( - "context" - "net/http/httptest" - "testing" - "time" - - "connectrpc.com/connect" - "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/baggage" - "go.opentelemetry.io/otel/propagation" - sdktrace "go.opentelemetry.io/otel/sdk/trace" - "go.opentelemetry.io/otel/sdk/trace/tracetest" - "go.opentelemetry.io/otel/trace" - - "github.com/evstack/ev-node/core/execution" -) - -func setupTracer(t *testing.T) (*tracetest.SpanRecorder, func()) { - t.Helper() - rec := tracetest.NewSpanRecorder() - tp := sdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(rec)) - oldTP := otel.GetTracerProvider() - oldProp := otel.GetTextMapPropagator() - otel.SetTracerProvider(tp) - otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})) - return rec, func() { - _ = tp.Shutdown(context.Background()) - otel.SetTracerProvider(oldTP) - otel.SetTextMapPropagator(oldProp) - } -} - -func TestInboundMetadataCreatesChildSpanWithSameTraceID(t *testing.T) { - rec, cleanup := setupTracer(t) - defer cleanup() - - tracer := otel.Tracer("test") - parentCtx, parent := tracer.Start(context.Background(), "parent") - defer parent.End() - parentTraceID := parent.SpanContext().TraceID() - - mockExec := &mockExecutor{getTxsFunc: func(ctx context.Context) ([][]byte, error) { - _, span := tracer.Start(ctx, "server-child") - span.End() - return [][]byte{}, nil - }} - - handler := NewExecutorServiceHandler(mockExec) - ts := httptest.NewServer(handler) - defer ts.Close() - - client, err := NewClient(ts.URL) - if err != nil { - t.Fatalf("NewClient failed: %v", err) - } - - _, err = client.GetTxs(parentCtx) - if err != nil { - t.Fatalf("GetTxs failed: %v", err) - } - - var found bool - for _, s := range rec.Ended() { - if s.Name() == "server-child" { - found = true - if s.SpanContext().TraceID() != parentTraceID { - t.Fatalf("trace id mismatch: got %s want %s", s.SpanContext().TraceID(), parentTraceID) - } - } - } - if !found { - t.Fatalf("server-child span not found") - } -} - -func TestOutboundGRPCCallCarriesTraceparentMetadata(t *testing.T) { - rec, cleanup := setupTracer(t) - _ = rec - defer cleanup() - - tracer := otel.Tracer("test") - ctx, parent := tracer.Start(context.Background(), "parent") - defer parent.End() - - gotTraceparent := "" - captureHeader := connect.UnaryInterceptorFunc(func(next connect.UnaryFunc) connect.UnaryFunc { - return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { - gotTraceparent = req.Header().Get("traceparent") - return next(ctx, req) - } - }) - - mockExec := &mockExecutor{} - handler := NewExecutorServiceHandler(mockExec, connect.WithInterceptors(captureHeader)) - ts := httptest.NewServer(handler) - defer ts.Close() - - client, err := NewClient(ts.URL) - if err != nil { - t.Fatalf("NewClient failed: %v", err) - } - - if _, err = client.GetTxs(ctx); err != nil { - t.Fatalf("GetTxs failed: %v", err) - } - if gotTraceparent == "" { - t.Fatalf("expected traceparent metadata to be propagated") - } -} - -func TestOutboundGRPCCallCarriesPropagationHeaders(t *testing.T) { - rec, cleanup := setupTracer(t) - _ = rec - defer cleanup() - - tracer := otel.Tracer("test") - ctx, parent := tracer.Start(context.Background(), "parent") - defer parent.End() - member, err := baggage.NewMember("tenant", "alpha") - if err != nil { - t.Fatalf("failed to create baggage member: %v", err) - } - bg, err := baggage.New(member) - if err != nil { - t.Fatalf("failed to create baggage: %v", err) - } - ctx = baggage.ContextWithBaggage(ctx, bg) - - var gotTraceparent string - var gotBaggage string - captureHeader := connect.UnaryInterceptorFunc(func(next connect.UnaryFunc) connect.UnaryFunc { - return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { - gotTraceparent = req.Header().Get("traceparent") - gotBaggage = req.Header().Get("baggage") - return next(ctx, req) - } - }) - - mockExec := &mockExecutor{} - handler := NewExecutorServiceHandler(mockExec, connect.WithInterceptors(captureHeader)) - ts := httptest.NewServer(handler) - defer ts.Close() - - client, err := NewClient(ts.URL) - if err != nil { - t.Fatalf("NewClient failed: %v", err) - } - - if _, err = client.GetTxs(ctx); err != nil { - t.Fatalf("GetTxs failed: %v", err) - } - - if gotTraceparent == "" { - t.Fatalf("expected traceparent metadata to be propagated") - } - if gotBaggage == "" { - t.Fatalf("expected baggage metadata to be propagated") - } -} - -func TestEndToEndParentChildAcrossServerClientHop(t *testing.T) { - rec, cleanup := setupTracer(t) - defer cleanup() - - tracer := otel.Tracer("test") - var midSpan trace.Span - - downstreamExec := &mockExecutor{getExecutionInfoFunc: func(ctx context.Context) (executionInfo execution.ExecutionInfo, err error) { - _, span := tracer.Start(ctx, "downstream-child") - span.End() - return execution.ExecutionInfo{MaxGas: 1}, nil - }} - downstreamHandler := NewExecutorServiceHandler(downstreamExec) - downstreamSrv := httptest.NewServer(downstreamHandler) - defer downstreamSrv.Close() - downstreamClient, err := NewClient(downstreamSrv.URL) - if err != nil { - t.Fatalf("NewClient failed: %v", err) - } - - upstreamExec := &mockExecutor{getTxsFunc: func(ctx context.Context) ([][]byte, error) { - ctx, span := tracer.Start(ctx, "upstream-mid") - midSpan = span - defer span.End() - _, err := downstreamClient.GetExecutionInfo(ctx) - if err != nil { - return nil, err - } - return [][]byte{}, nil - }} - upstreamHandler := NewExecutorServiceHandler(upstreamExec) - upstreamSrv := httptest.NewServer(upstreamHandler) - defer upstreamSrv.Close() - - client, err := NewClient(upstreamSrv.URL) - if err != nil { - t.Fatalf("NewClient failed: %v", err) - } - - rootCtx, root := tracer.Start(context.Background(), "root") - defer root.End() - if _, err := client.GetTxs(rootCtx); err != nil { - t.Fatalf("GetTxs failed: %v", err) - } - - time.Sleep(10 * time.Millisecond) - - rootTraceID := root.SpanContext().TraceID() - if midSpan.SpanContext().TraceID() != rootTraceID { - t.Fatalf("mid span trace id mismatch") - } - var found bool - for _, s := range rec.Ended() { - if s.Name() == "downstream-child" { - found = true - if s.SpanContext().TraceID() != rootTraceID { - t.Fatalf("downstream trace id mismatch") - } - } - } - if !found { - t.Fatalf("downstream-child span not found") - } -} diff --git a/execution/grpc/proto/evnode/v1/execution.proto b/execution/grpc/proto/evnode/v1/execution.proto deleted file mode 100644 index f5e635336e..0000000000 --- a/execution/grpc/proto/evnode/v1/execution.proto +++ /dev/null @@ -1,154 +0,0 @@ -syntax = "proto3"; -package evnode.v1; - -import "google/protobuf/timestamp.proto"; - -option go_package = "github.com/evstack/ev-node/execution/grpc/types/pb/evnode/v1"; - -// ExecutorService defines the execution layer interface for execution/grpc -service ExecutorService { - // InitChain initializes a new blockchain instance with genesis parameters - rpc InitChain(InitChainRequest) returns (InitChainResponse) {} - - // GetTxs fetches available transactions from the execution layer's mempool - rpc GetTxs(GetTxsRequest) returns (GetTxsResponse) {} - - // ExecuteTxs processes transactions to produce a new block state - rpc ExecuteTxs(ExecuteTxsRequest) returns (ExecuteTxsResponse) {} - - // SetFinal marks a block as finalized at the specified height - rpc SetFinal(SetFinalRequest) returns (SetFinalResponse) {} - - // GetExecutionInfo returns current execution layer parameters - rpc GetExecutionInfo(GetExecutionInfoRequest) returns (GetExecutionInfoResponse) {} - - // FilterTxs validates force-included transactions and calculates gas for all transactions - rpc FilterTxs(FilterTxsRequest) returns (FilterTxsResponse) {} -} - -// InitChainRequest contains the genesis parameters for chain initialization -message InitChainRequest { - // Timestamp marking chain start time in UTC - google.protobuf.Timestamp genesis_time = 1; - - // First block height (must be > 0) - uint64 initial_height = 2; - - // Unique identifier string for the blockchain - string chain_id = 3; -} - -// InitChainResponse contains the initial state and configuration -message InitChainResponse { - // Hash representing initial state - bytes state_root = 1; -} - -// GetTxsRequest is the request for fetching transactions -message GetTxsRequest { - // Empty for now, may include filtering criteria in the future -} - -// TxBatch stores ordered transactions in one contiguous bytes buffer. -message TxBatch { - // Concatenated transaction bytes. - bytes data = 1; - - // Byte length for each transaction in order. - repeated uint32 tx_sizes = 2; -} - -// GetTxsResponse contains the available transactions -message GetTxsResponse { - reserved 1; - reserved "txs"; - - // Valid transactions from mempool in contiguous batch form. - TxBatch tx_batch = 2; -} - -// ExecuteTxsRequest contains transactions and block context for execution -message ExecuteTxsRequest { - reserved 1; - reserved "txs"; - - // Height of block being created (must be > 0) - uint64 block_height = 2; - - // Block creation time in UTC - google.protobuf.Timestamp timestamp = 3; - - // Previous block's state root hash - bytes prev_state_root = 4; - - // Ordered transactions to execute in contiguous batch form. - TxBatch tx_batch = 5; -} - -// ExecuteTxsResponse contains the result of transaction execution -message ExecuteTxsResponse { - // New state root after executing transactions - bytes updated_state_root = 1; - - // Maximum allowed transaction size (may change with protocol updates) - uint64 max_bytes = 2; - - // Proposer address that should sign the next block. - // Empty means the current proposer remains active. - bytes next_proposer_address = 3; -} - -// SetFinalRequest marks a block as finalized -message SetFinalRequest { - // Height of block to finalize - uint64 block_height = 1; -} - -// SetFinalResponse indicates whether finalization was successful -message SetFinalResponse { - // Empty response, errors are returned via gRPC status -} - -// GetExecutionInfoRequest requests execution layer parameters -message GetExecutionInfoRequest {} - -// GetExecutionInfoResponse contains execution layer parameters -message GetExecutionInfoResponse { - // Maximum gas allowed for transactions in a block - // For non-gas-based execution layers, this should be 0 - uint64 max_gas = 1; -} - -// FilterStatus represents the result of filtering a transaction -enum FilterStatus { - // Transaction will make it to the next batch - FILTER_OK = 0; - // Transaction will be filtered out because invalid (too big, malformed, etc.) - FILTER_REMOVE = 1; - // Transaction is valid but postponed for later processing due to size/gas constraint - FILTER_POSTPONE = 2; -} - -// FilterTxsRequest contains transactions to validate and filter -message FilterTxsRequest { - reserved 1; - reserved "txs"; - - // Maximum cumulative size allowed (0 means no size limit) - uint64 max_bytes = 2; - - // Maximum cumulative gas allowed (0 means no gas limit) - uint64 max_gas = 3; - - // Whether force-included transactions are present - bool has_force_included_transaction = 4; - - // All transactions (force-included + mempool) in contiguous batch form. - TxBatch tx_batch = 5; -} - -// FilterTxsResponse contains the filter status for each transaction -message FilterTxsResponse { - // Filter status for each transaction (same length as txs in request) - repeated FilterStatus statuses = 1; -} diff --git a/execution/grpc/server.go b/execution/grpc/server.go deleted file mode 100644 index c4121ebd23..0000000000 --- a/execution/grpc/server.go +++ /dev/null @@ -1,195 +0,0 @@ -package grpc - -import ( - "context" - "errors" - "fmt" - - "connectrpc.com/connect" - - "github.com/evstack/ev-node/core/execution" - pb "github.com/evstack/ev-node/execution/grpc/types/pb/evnode/v1" -) - -// Server is a gRPC server that wraps an execution.Executor implementation. -// It handles the conversion between gRPC types and internal types. -type Server struct { - executor execution.Executor -} - -// NewServer creates a new gRPC server that wraps the given executor. -// -// Parameters: -// - executor: The underlying execution implementation to wrap -// -// Returns: -// - *Server: The initialized gRPC server -func NewServer(executor execution.Executor) *Server { - return &Server{ - executor: executor, - } -} - -// InitChain handles the InitChain RPC request. -// -// It initializes the blockchain with the given genesis parameters by delegating -// to the underlying executor implementation. -func (s *Server) InitChain( - ctx context.Context, - req *connect.Request[pb.InitChainRequest], -) (*connect.Response[pb.InitChainResponse], error) { - if req.Msg.GenesisTime == nil { - return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("genesis_time is required")) - } - - if req.Msg.InitialHeight == 0 { - return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("initial_height must be > 0")) - } - - if req.Msg.ChainId == "" { - return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("chain_id is required")) - } - - stateRoot, err := s.executor.InitChain( - ctx, - req.Msg.GenesisTime.AsTime(), - req.Msg.InitialHeight, - req.Msg.ChainId, - ) - if err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to init chain: %w", err)) - } - - return connect.NewResponse(&pb.InitChainResponse{ - StateRoot: stateRoot, - }), nil -} - -// GetTxs handles the GetTxs RPC request. -// -// It fetches available transactions from the execution layer's mempool. -func (s *Server) GetTxs( - ctx context.Context, - req *connect.Request[pb.GetTxsRequest], -) (*connect.Response[pb.GetTxsResponse], error) { - txs, err := s.executor.GetTxs(ctx) - if err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to get txs: %w", err)) - } - - txBatch, err := encodeTxBatch(txs) - if err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to encode tx batch: %w", err)) - } - - return connect.NewResponse(&pb.GetTxsResponse{ - TxBatch: txBatch, - }), nil -} - -// ExecuteTxs handles the ExecuteTxs RPC request. -// -// It processes transactions to produce a new block state by delegating to -// the underlying executor implementation. -func (s *Server) ExecuteTxs( - ctx context.Context, - req *connect.Request[pb.ExecuteTxsRequest], -) (*connect.Response[pb.ExecuteTxsResponse], error) { - if req.Msg.BlockHeight == 0 { - return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("block_height must be > 0")) - } - - if req.Msg.Timestamp == nil { - return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("timestamp is required")) - } - - if len(req.Msg.PrevStateRoot) == 0 { - return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("prev_state_root is required")) - } - - txs, err := decodeTxBatch(req.Msg.TxBatch) - if err != nil { - return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("invalid tx_batch: %w", err)) - } - - result, err := s.executor.ExecuteTxs( - ctx, - txs, - req.Msg.BlockHeight, - req.Msg.Timestamp.AsTime(), - req.Msg.PrevStateRoot, - ) - if err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to execute txs: %w", err)) - } - - return connect.NewResponse(&pb.ExecuteTxsResponse{ - UpdatedStateRoot: result.UpdatedStateRoot, - NextProposerAddress: result.NextProposerAddress, - }), nil -} - -// SetFinal handles the SetFinal RPC request. -// -// It marks a block as finalized at the specified height. -func (s *Server) SetFinal( - ctx context.Context, - req *connect.Request[pb.SetFinalRequest], -) (*connect.Response[pb.SetFinalResponse], error) { - if req.Msg.BlockHeight == 0 { - return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("block_height must be > 0")) - } - - err := s.executor.SetFinal(ctx, req.Msg.BlockHeight) - if err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to set final: %w", err)) - } - - return connect.NewResponse(&pb.SetFinalResponse{}), nil -} - -// GetExecutionInfo handles the GetExecutionInfo RPC request. -// -// It returns current execution layer parameters such as the block gas limit. -func (s *Server) GetExecutionInfo( - ctx context.Context, - req *connect.Request[pb.GetExecutionInfoRequest], -) (*connect.Response[pb.GetExecutionInfoResponse], error) { - info, err := s.executor.GetExecutionInfo(ctx) - if err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to get execution info: %w", err)) - } - - return connect.NewResponse(&pb.GetExecutionInfoResponse{ - MaxGas: info.MaxGas, - }), nil -} - -// FilterTxs handles the FilterTxs RPC request. -// -// It validates force-included transactions and applies gas and size filtering. -// Returns a slice of FilterStatus for each transaction. -func (s *Server) FilterTxs( - ctx context.Context, - req *connect.Request[pb.FilterTxsRequest], -) (*connect.Response[pb.FilterTxsResponse], error) { - txs, err := decodeTxBatch(req.Msg.TxBatch) - if err != nil { - return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("invalid tx_batch: %w", err)) - } - - result, err := s.executor.FilterTxs(ctx, txs, req.Msg.MaxBytes, req.Msg.MaxGas, req.Msg.HasForceIncludedTransaction) - if err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to filter transactions: %w", err)) - } - - // Convert execution.FilterStatus to protobuf FilterStatus - statuses := make([]pb.FilterStatus, len(result)) - for i, status := range result { - statuses[i] = pb.FilterStatus(status) - } - - return connect.NewResponse(&pb.FilterTxsResponse{ - Statuses: statuses, - }), nil -} diff --git a/execution/grpc/server_test.go b/execution/grpc/server_test.go deleted file mode 100644 index 0fde2d2800..0000000000 --- a/execution/grpc/server_test.go +++ /dev/null @@ -1,478 +0,0 @@ -package grpc - -import ( - "context" - "errors" - "testing" - "time" - - "connectrpc.com/connect" - "google.golang.org/protobuf/types/known/timestamppb" - - "github.com/evstack/ev-node/core/execution" - pb "github.com/evstack/ev-node/execution/grpc/types/pb/evnode/v1" -) - -func TestServer_InitChain(t *testing.T) { - ctx := context.Background() - genesisTime := time.Now() - initialHeight := uint64(1) - chainID := "test-chain" - expectedStateRoot := []byte("state_root") - - tests := []struct { - name string - req *pb.InitChainRequest - mockFunc func(ctx context.Context, genesisTime time.Time, initialHeight uint64, chainID string) ([]byte, error) - wantErr bool - wantCode connect.Code - }{ - { - name: "success", - req: &pb.InitChainRequest{ - GenesisTime: timestamppb.New(genesisTime), - InitialHeight: initialHeight, - ChainId: chainID, - }, - mockFunc: func(ctx context.Context, gt time.Time, ih uint64, cid string) ([]byte, error) { - return expectedStateRoot, nil - }, - wantErr: false, - }, - { - name: "missing genesis time", - req: &pb.InitChainRequest{ - InitialHeight: initialHeight, - ChainId: chainID, - }, - wantErr: true, - wantCode: connect.CodeInvalidArgument, - }, - { - name: "missing initial height", - req: &pb.InitChainRequest{ - GenesisTime: timestamppb.New(genesisTime), - ChainId: chainID, - }, - wantErr: true, - wantCode: connect.CodeInvalidArgument, - }, - { - name: "missing chain ID", - req: &pb.InitChainRequest{ - GenesisTime: timestamppb.New(genesisTime), - InitialHeight: initialHeight, - }, - wantErr: true, - wantCode: connect.CodeInvalidArgument, - }, - { - name: "executor error", - req: &pb.InitChainRequest{ - GenesisTime: timestamppb.New(genesisTime), - InitialHeight: initialHeight, - ChainId: chainID, - }, - mockFunc: func(ctx context.Context, gt time.Time, ih uint64, cid string) ([]byte, error) { - return nil, errors.New("init chain failed") - }, - wantErr: true, - wantCode: connect.CodeInternal, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - mockExec := &mockExecutor{ - initChainFunc: tt.mockFunc, - } - server := NewServer(mockExec) - - req := connect.NewRequest(tt.req) - resp, err := server.InitChain(ctx, req) - - if tt.wantErr { - if err == nil { - t.Fatalf("expected error but got none") - } - var connectErr *connect.Error - if errors.As(err, &connectErr) { - if connectErr.Code() != tt.wantCode { - t.Errorf("expected error code %v, got %v", tt.wantCode, connectErr.Code()) - } - } else { - t.Errorf("expected connect error, got %v", err) - } - return - } - - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - if string(resp.Msg.StateRoot) != string(expectedStateRoot) { - t.Errorf("expected state root %s, got %s", expectedStateRoot, resp.Msg.StateRoot) - } - }) - } -} - -func TestServer_GetTxs(t *testing.T) { - ctx := context.Background() - expectedTxs := [][]byte{[]byte("tx1"), []byte("tx2")} - - tests := []struct { - name string - mockFunc func(ctx context.Context) ([][]byte, error) - wantErr bool - wantCode connect.Code - }{ - { - name: "success", - mockFunc: func(ctx context.Context) ([][]byte, error) { - return expectedTxs, nil - }, - wantErr: false, - }, - { - name: "executor error", - mockFunc: func(ctx context.Context) ([][]byte, error) { - return nil, errors.New("get txs failed") - }, - wantErr: true, - wantCode: connect.CodeInternal, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - mockExec := &mockExecutor{ - getTxsFunc: tt.mockFunc, - } - server := NewServer(mockExec) - - req := connect.NewRequest(&pb.GetTxsRequest{}) - resp, err := server.GetTxs(ctx, req) - - if tt.wantErr { - if err == nil { - t.Fatalf("expected error but got none") - } - var connectErr *connect.Error - if errors.As(err, &connectErr) { - if connectErr.Code() != tt.wantCode { - t.Errorf("expected error code %v, got %v", tt.wantCode, connectErr.Code()) - } - } else { - t.Errorf("expected connect error, got %v", err) - } - return - } - - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - txs, err := decodeTxBatch(resp.Msg.TxBatch) - if err != nil { - t.Fatalf("unexpected tx batch decode error: %v", err) - } - if len(txs) != len(expectedTxs) { - t.Fatalf("expected %d txs, got %d", len(expectedTxs), len(txs)) - } - for i := range expectedTxs { - if string(txs[i]) != string(expectedTxs[i]) { - t.Fatalf("tx batch tx %d: expected %q, got %q", i, expectedTxs[i], txs[i]) - } - } - }) - } -} - -func TestServer_ExecuteTxs(t *testing.T) { - ctx := context.Background() - txs := [][]byte{[]byte("tx1"), []byte("tx2")} - blockHeight := uint64(10) - timestamp := time.Now() - prevStateRoot := []byte("prev_state_root") - expectedStateRoot := []byte("new_state_root") - - tests := []struct { - name string - req *pb.ExecuteTxsRequest - mockFunc func(ctx context.Context, txs [][]byte, blockHeight uint64, timestamp time.Time, prevStateRoot []byte) (execution.ExecuteResult, error) - wantErr bool - wantCode connect.Code - }{ - { - name: "success", - req: &pb.ExecuteTxsRequest{ - TxBatch: mustEncodeTxBatch(t, txs), - BlockHeight: blockHeight, - Timestamp: timestamppb.New(timestamp), - PrevStateRoot: prevStateRoot, - }, - mockFunc: func(ctx context.Context, t [][]byte, bh uint64, ts time.Time, psr []byte) (execution.ExecuteResult, error) { - return execution.ExecuteResult{UpdatedStateRoot: expectedStateRoot}, nil - }, - wantErr: false, - }, - { - name: "missing block height", - req: &pb.ExecuteTxsRequest{ - TxBatch: mustEncodeTxBatch(t, txs), - Timestamp: timestamppb.New(timestamp), - PrevStateRoot: prevStateRoot, - }, - wantErr: true, - wantCode: connect.CodeInvalidArgument, - }, - { - name: "missing timestamp", - req: &pb.ExecuteTxsRequest{ - TxBatch: mustEncodeTxBatch(t, txs), - BlockHeight: blockHeight, - PrevStateRoot: prevStateRoot, - }, - wantErr: true, - wantCode: connect.CodeInvalidArgument, - }, - { - name: "missing prev state root", - req: &pb.ExecuteTxsRequest{ - TxBatch: mustEncodeTxBatch(t, txs), - BlockHeight: blockHeight, - Timestamp: timestamppb.New(timestamp), - }, - wantErr: true, - wantCode: connect.CodeInvalidArgument, - }, - { - name: "invalid tx batch", - req: &pb.ExecuteTxsRequest{ - TxBatch: &pb.TxBatch{Data: []byte("tx"), TxSizes: []uint32{3}}, - BlockHeight: blockHeight, - Timestamp: timestamppb.New(timestamp), - PrevStateRoot: prevStateRoot, - }, - wantErr: true, - wantCode: connect.CodeInvalidArgument, - }, - { - name: "executor error", - req: &pb.ExecuteTxsRequest{ - TxBatch: mustEncodeTxBatch(t, txs), - BlockHeight: blockHeight, - Timestamp: timestamppb.New(timestamp), - PrevStateRoot: prevStateRoot, - }, - mockFunc: func(ctx context.Context, t [][]byte, bh uint64, ts time.Time, psr []byte) (execution.ExecuteResult, error) { - return execution.ExecuteResult{}, errors.New("execute txs failed") - }, - wantErr: true, - wantCode: connect.CodeInternal, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - mockExec := &mockExecutor{ - executeTxsFunc: tt.mockFunc, - } - server := NewServer(mockExec) - - req := connect.NewRequest(tt.req) - resp, err := server.ExecuteTxs(ctx, req) - - if tt.wantErr { - if err == nil { - t.Fatalf("expected error but got none") - } - var connectErr *connect.Error - if errors.As(err, &connectErr) { - if connectErr.Code() != tt.wantCode { - t.Errorf("expected error code %v, got %v", tt.wantCode, connectErr.Code()) - } - } else { - t.Errorf("expected connect error, got %v", err) - } - return - } - - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - if string(resp.Msg.UpdatedStateRoot) != string(expectedStateRoot) { - t.Errorf("expected state root %s, got %s", expectedStateRoot, resp.Msg.UpdatedStateRoot) - } - }) - } -} - -func TestServer_SetFinal(t *testing.T) { - ctx := context.Background() - blockHeight := uint64(100) - - tests := []struct { - name string - req *pb.SetFinalRequest - mockFunc func(ctx context.Context, blockHeight uint64) error - wantErr bool - wantCode connect.Code - }{ - { - name: "success", - req: &pb.SetFinalRequest{ - BlockHeight: blockHeight, - }, - mockFunc: func(ctx context.Context, bh uint64) error { - return nil - }, - wantErr: false, - }, - { - name: "missing block height", - req: &pb.SetFinalRequest{ - BlockHeight: 0, - }, - wantErr: true, - wantCode: connect.CodeInvalidArgument, - }, - { - name: "executor error", - req: &pb.SetFinalRequest{ - BlockHeight: blockHeight, - }, - mockFunc: func(ctx context.Context, bh uint64) error { - return errors.New("set final failed") - }, - wantErr: true, - wantCode: connect.CodeInternal, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - mockExec := &mockExecutor{ - setFinalFunc: tt.mockFunc, - } - server := NewServer(mockExec) - - req := connect.NewRequest(tt.req) - _, err := server.SetFinal(ctx, req) - - if tt.wantErr { - if err == nil { - t.Fatalf("expected error but got none") - } - var connectErr *connect.Error - if errors.As(err, &connectErr) { - if connectErr.Code() != tt.wantCode { - t.Errorf("expected error code %v, got %v", tt.wantCode, connectErr.Code()) - } - } else { - t.Errorf("expected connect error, got %v", err) - } - return - } - - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - }) - } -} - -func TestServer_FilterTxs(t *testing.T) { - ctx := context.Background() - txs := [][]byte{[]byte("tx1"), []byte("tx2")} - expectedStatuses := []execution.FilterStatus{execution.FilterOK, execution.FilterPostpone} - - tests := []struct { - name string - req *pb.FilterTxsRequest - mockFunc func(ctx context.Context, txs [][]byte, maxBytes, maxGas uint64, hasForceIncludedTransaction bool) ([]execution.FilterStatus, error) - wantErr bool - wantCode connect.Code - }{ - { - name: "success", - req: &pb.FilterTxsRequest{ - TxBatch: mustEncodeTxBatch(t, txs), - MaxBytes: 100, - MaxGas: 200, - HasForceIncludedTransaction: true, - }, - mockFunc: func(ctx context.Context, txsIn [][]byte, maxBytes, maxGas uint64, forced bool) ([]execution.FilterStatus, error) { - if len(txsIn) != len(txs) { - t.Fatalf("expected %d txs, got %d", len(txs), len(txsIn)) - } - if maxBytes != 100 { - t.Fatalf("expected max bytes 100, got %d", maxBytes) - } - if maxGas != 200 { - t.Fatalf("expected max gas 200, got %d", maxGas) - } - if !forced { - t.Fatalf("expected forced transaction flag") - } - return expectedStatuses, nil - }, - wantErr: false, - }, - { - name: "invalid tx batch", - req: &pb.FilterTxsRequest{ - TxBatch: &pb.TxBatch{Data: []byte("tx"), TxSizes: []uint32{3}}, - }, - wantErr: true, - wantCode: connect.CodeInvalidArgument, - }, - { - name: "executor error", - req: &pb.FilterTxsRequest{ - TxBatch: mustEncodeTxBatch(t, txs), - }, - mockFunc: func(ctx context.Context, txs [][]byte, maxBytes, maxGas uint64, hasForceIncludedTransaction bool) ([]execution.FilterStatus, error) { - return nil, errors.New("filter failed") - }, - wantErr: true, - wantCode: connect.CodeInternal, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - mockExec := &mockExecutor{ - filterTxsFunc: tt.mockFunc, - } - server := NewServer(mockExec) - - req := connect.NewRequest(tt.req) - resp, err := server.FilterTxs(ctx, req) - - if tt.wantErr { - if err == nil { - t.Fatalf("expected error but got none") - } - var connectErr *connect.Error - if errors.As(err, &connectErr) { - if connectErr.Code() != tt.wantCode { - t.Errorf("expected error code %v, got %v", tt.wantCode, connectErr.Code()) - } - } else { - t.Errorf("expected connect error, got %v", err) - } - return - } - - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if len(resp.Msg.Statuses) != len(expectedStatuses) { - t.Fatalf("expected %d statuses, got %d", len(expectedStatuses), len(resp.Msg.Statuses)) - } - }) - } -} diff --git a/execution/grpc/tx_batch.go b/execution/grpc/tx_batch.go deleted file mode 100644 index e80d7abbc6..0000000000 --- a/execution/grpc/tx_batch.go +++ /dev/null @@ -1,74 +0,0 @@ -package grpc - -import ( - "fmt" - - pb "github.com/evstack/ev-node/execution/grpc/types/pb/evnode/v1" -) - -// maxTxBatchTxSize is the largest transaction length representable in TxBatch.TxSizes: -// 4 GiB - 1 byte, or 4,294,967,295 bytes. -const maxTxBatchTxSize = uint64(1<<32 - 1) - -func encodeTxBatch(txs [][]byte) (*pb.TxBatch, error) { - if len(txs) == 0 { - return &pb.TxBatch{}, nil - } - - maxInt := uint64(int(^uint(0) >> 1)) - var total uint64 - txSizes := make([]uint32, len(txs)) - for i, tx := range txs { - txLen := uint64(len(tx)) - if txLen > maxTxBatchTxSize { - return nil, fmt.Errorf("tx %d size %d exceeds uint32", i, txLen) - } - total += txLen - if total > maxInt { - return nil, fmt.Errorf("tx batch size %d exceeds int", total) - } - txSizes[i] = uint32(txLen) - } - - data := make([]byte, 0, int(total)) - for _, tx := range txs { - data = append(data, tx...) - } - - return &pb.TxBatch{ - Data: data, - TxSizes: txSizes, - }, nil -} - -func decodeTxBatch(batch *pb.TxBatch) ([][]byte, error) { - if batch == nil { - return nil, nil - } - if len(batch.TxSizes) == 0 { - if len(batch.Data) != 0 { - return nil, fmt.Errorf("tx batch has %d data bytes but no tx sizes", len(batch.Data)) - } - return nil, nil - } - - var total uint64 - for i, txSize := range batch.TxSizes { - total += uint64(txSize) - if total > uint64(len(batch.Data)) { - return nil, fmt.Errorf("tx sizes exceed data length at index %d", i) - } - } - if total != uint64(len(batch.Data)) { - return nil, fmt.Errorf("tx sizes total %d does not match data length %d", total, len(batch.Data)) - } - - txs := make([][]byte, len(batch.TxSizes)) - offset := 0 - for i, txSize := range batch.TxSizes { - end := offset + int(txSize) - txs[i] = batch.Data[offset:end:end] - offset = end - } - return txs, nil -} diff --git a/execution/grpc/tx_batch_test.go b/execution/grpc/tx_batch_test.go deleted file mode 100644 index 7e21055651..0000000000 --- a/execution/grpc/tx_batch_test.go +++ /dev/null @@ -1,79 +0,0 @@ -package grpc - -import ( - "bytes" - "testing" - - pb "github.com/evstack/ev-node/execution/grpc/types/pb/evnode/v1" -) - -func mustEncodeTxBatch(t *testing.T, txs [][]byte) *pb.TxBatch { - t.Helper() - - batch, err := encodeTxBatch(txs) - if err != nil { - t.Fatalf("encode tx batch: %v", err) - } - return batch -} - -func TestEncodeDecodeTxBatch(t *testing.T) { - txs := [][]byte{[]byte("tx1"), nil, []byte("tx3"), []byte{}} - - batch := mustEncodeTxBatch(t, txs) - decoded, err := decodeTxBatch(batch) - if err != nil { - t.Fatalf("decode tx batch: %v", err) - } - if len(decoded) != len(txs) { - t.Fatalf("expected %d txs, got %d", len(txs), len(decoded)) - } - for i := range txs { - if !bytes.Equal(decoded[i], txs[i]) { - t.Fatalf("tx %d: expected %q, got %q", i, txs[i], decoded[i]) - } - } - - decoded[0] = append(decoded[0], 'x') - if !bytes.Equal(decoded[2], txs[2]) { - t.Fatalf("decoded tx slices should not have capacity overlap") - } -} - -func TestDecodeTxBatchRejectsMalformedInput(t *testing.T) { - tests := []struct { - name string - batch *pb.TxBatch - }{ - { - name: "data without sizes", - batch: &pb.TxBatch{Data: []byte("tx")}, - }, - { - name: "sizes exceed data", - batch: &pb.TxBatch{Data: []byte("tx"), TxSizes: []uint32{3}}, - }, - { - name: "sizes do not consume data", - batch: &pb.TxBatch{Data: []byte("tx"), TxSizes: []uint32{1}}, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if _, err := decodeTxBatch(tt.batch); err == nil { - t.Fatalf("expected decode error") - } - }) - } -} - -func TestDecodeTxBatchNil(t *testing.T) { - txs, err := decodeTxBatch(nil) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if len(txs) != 0 { - t.Fatalf("expected nil tx_batch to decode to empty txs, got %d txs", len(txs)) - } -} diff --git a/execution/grpc/types/pb/evnode/v1/execution.pb.go b/execution/grpc/types/pb/evnode/v1/execution.pb.go deleted file mode 100644 index 9e181222e3..0000000000 --- a/execution/grpc/types/pb/evnode/v1/execution.pb.go +++ /dev/null @@ -1,883 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.36.11 -// protoc (unknown) -// source: evnode/v1/execution.proto - -package v1 - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" - unsafe "unsafe" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// FilterStatus represents the result of filtering a transaction -type FilterStatus int32 - -const ( - // Transaction will make it to the next batch - FilterStatus_FILTER_OK FilterStatus = 0 - // Transaction will be filtered out because invalid (too big, malformed, etc.) - FilterStatus_FILTER_REMOVE FilterStatus = 1 - // Transaction is valid but postponed for later processing due to size/gas constraint - FilterStatus_FILTER_POSTPONE FilterStatus = 2 -) - -// Enum value maps for FilterStatus. -var ( - FilterStatus_name = map[int32]string{ - 0: "FILTER_OK", - 1: "FILTER_REMOVE", - 2: "FILTER_POSTPONE", - } - FilterStatus_value = map[string]int32{ - "FILTER_OK": 0, - "FILTER_REMOVE": 1, - "FILTER_POSTPONE": 2, - } -) - -func (x FilterStatus) Enum() *FilterStatus { - p := new(FilterStatus) - *p = x - return p -} - -func (x FilterStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (FilterStatus) Descriptor() protoreflect.EnumDescriptor { - return file_evnode_v1_execution_proto_enumTypes[0].Descriptor() -} - -func (FilterStatus) Type() protoreflect.EnumType { - return &file_evnode_v1_execution_proto_enumTypes[0] -} - -func (x FilterStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use FilterStatus.Descriptor instead. -func (FilterStatus) EnumDescriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{0} -} - -// InitChainRequest contains the genesis parameters for chain initialization -type InitChainRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Timestamp marking chain start time in UTC - GenesisTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=genesis_time,json=genesisTime,proto3" json:"genesis_time,omitempty"` - // First block height (must be > 0) - InitialHeight uint64 `protobuf:"varint,2,opt,name=initial_height,json=initialHeight,proto3" json:"initial_height,omitempty"` - // Unique identifier string for the blockchain - ChainId string `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *InitChainRequest) Reset() { - *x = InitChainRequest{} - mi := &file_evnode_v1_execution_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *InitChainRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InitChainRequest) ProtoMessage() {} - -func (x *InitChainRequest) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use InitChainRequest.ProtoReflect.Descriptor instead. -func (*InitChainRequest) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{0} -} - -func (x *InitChainRequest) GetGenesisTime() *timestamppb.Timestamp { - if x != nil { - return x.GenesisTime - } - return nil -} - -func (x *InitChainRequest) GetInitialHeight() uint64 { - if x != nil { - return x.InitialHeight - } - return 0 -} - -func (x *InitChainRequest) GetChainId() string { - if x != nil { - return x.ChainId - } - return "" -} - -// InitChainResponse contains the initial state and configuration -type InitChainResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Hash representing initial state - StateRoot []byte `protobuf:"bytes,1,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *InitChainResponse) Reset() { - *x = InitChainResponse{} - mi := &file_evnode_v1_execution_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *InitChainResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InitChainResponse) ProtoMessage() {} - -func (x *InitChainResponse) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use InitChainResponse.ProtoReflect.Descriptor instead. -func (*InitChainResponse) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{1} -} - -func (x *InitChainResponse) GetStateRoot() []byte { - if x != nil { - return x.StateRoot - } - return nil -} - -// GetTxsRequest is the request for fetching transactions -type GetTxsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetTxsRequest) Reset() { - *x = GetTxsRequest{} - mi := &file_evnode_v1_execution_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetTxsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetTxsRequest) ProtoMessage() {} - -func (x *GetTxsRequest) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetTxsRequest.ProtoReflect.Descriptor instead. -func (*GetTxsRequest) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{2} -} - -// TxBatch stores ordered transactions in one contiguous bytes buffer. -type TxBatch struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Concatenated transaction bytes. - Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` - // Byte length for each transaction in order. - TxSizes []uint32 `protobuf:"varint,2,rep,packed,name=tx_sizes,json=txSizes,proto3" json:"tx_sizes,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *TxBatch) Reset() { - *x = TxBatch{} - mi := &file_evnode_v1_execution_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *TxBatch) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TxBatch) ProtoMessage() {} - -func (x *TxBatch) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TxBatch.ProtoReflect.Descriptor instead. -func (*TxBatch) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{3} -} - -func (x *TxBatch) GetData() []byte { - if x != nil { - return x.Data - } - return nil -} - -func (x *TxBatch) GetTxSizes() []uint32 { - if x != nil { - return x.TxSizes - } - return nil -} - -// GetTxsResponse contains the available transactions -type GetTxsResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Valid transactions from mempool in contiguous batch form. - TxBatch *TxBatch `protobuf:"bytes,2,opt,name=tx_batch,json=txBatch,proto3" json:"tx_batch,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetTxsResponse) Reset() { - *x = GetTxsResponse{} - mi := &file_evnode_v1_execution_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetTxsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetTxsResponse) ProtoMessage() {} - -func (x *GetTxsResponse) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[4] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetTxsResponse.ProtoReflect.Descriptor instead. -func (*GetTxsResponse) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{4} -} - -func (x *GetTxsResponse) GetTxBatch() *TxBatch { - if x != nil { - return x.TxBatch - } - return nil -} - -// ExecuteTxsRequest contains transactions and block context for execution -type ExecuteTxsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Height of block being created (must be > 0) - BlockHeight uint64 `protobuf:"varint,2,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` - // Block creation time in UTC - Timestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Previous block's state root hash - PrevStateRoot []byte `protobuf:"bytes,4,opt,name=prev_state_root,json=prevStateRoot,proto3" json:"prev_state_root,omitempty"` - // Ordered transactions to execute in contiguous batch form. - TxBatch *TxBatch `protobuf:"bytes,5,opt,name=tx_batch,json=txBatch,proto3" json:"tx_batch,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ExecuteTxsRequest) Reset() { - *x = ExecuteTxsRequest{} - mi := &file_evnode_v1_execution_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ExecuteTxsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ExecuteTxsRequest) ProtoMessage() {} - -func (x *ExecuteTxsRequest) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[5] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ExecuteTxsRequest.ProtoReflect.Descriptor instead. -func (*ExecuteTxsRequest) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{5} -} - -func (x *ExecuteTxsRequest) GetBlockHeight() uint64 { - if x != nil { - return x.BlockHeight - } - return 0 -} - -func (x *ExecuteTxsRequest) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp - } - return nil -} - -func (x *ExecuteTxsRequest) GetPrevStateRoot() []byte { - if x != nil { - return x.PrevStateRoot - } - return nil -} - -func (x *ExecuteTxsRequest) GetTxBatch() *TxBatch { - if x != nil { - return x.TxBatch - } - return nil -} - -// ExecuteTxsResponse contains the result of transaction execution -type ExecuteTxsResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // New state root after executing transactions - UpdatedStateRoot []byte `protobuf:"bytes,1,opt,name=updated_state_root,json=updatedStateRoot,proto3" json:"updated_state_root,omitempty"` - // Maximum allowed transaction size (may change with protocol updates) - MaxBytes uint64 `protobuf:"varint,2,opt,name=max_bytes,json=maxBytes,proto3" json:"max_bytes,omitempty"` - // Proposer address that should sign the next block. - // Empty means the current proposer remains active. - NextProposerAddress []byte `protobuf:"bytes,3,opt,name=next_proposer_address,json=nextProposerAddress,proto3" json:"next_proposer_address,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ExecuteTxsResponse) Reset() { - *x = ExecuteTxsResponse{} - mi := &file_evnode_v1_execution_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ExecuteTxsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ExecuteTxsResponse) ProtoMessage() {} - -func (x *ExecuteTxsResponse) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[6] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ExecuteTxsResponse.ProtoReflect.Descriptor instead. -func (*ExecuteTxsResponse) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{6} -} - -func (x *ExecuteTxsResponse) GetUpdatedStateRoot() []byte { - if x != nil { - return x.UpdatedStateRoot - } - return nil -} - -func (x *ExecuteTxsResponse) GetMaxBytes() uint64 { - if x != nil { - return x.MaxBytes - } - return 0 -} - -func (x *ExecuteTxsResponse) GetNextProposerAddress() []byte { - if x != nil { - return x.NextProposerAddress - } - return nil -} - -// SetFinalRequest marks a block as finalized -type SetFinalRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Height of block to finalize - BlockHeight uint64 `protobuf:"varint,1,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SetFinalRequest) Reset() { - *x = SetFinalRequest{} - mi := &file_evnode_v1_execution_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SetFinalRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SetFinalRequest) ProtoMessage() {} - -func (x *SetFinalRequest) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[7] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SetFinalRequest.ProtoReflect.Descriptor instead. -func (*SetFinalRequest) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{7} -} - -func (x *SetFinalRequest) GetBlockHeight() uint64 { - if x != nil { - return x.BlockHeight - } - return 0 -} - -// SetFinalResponse indicates whether finalization was successful -type SetFinalResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SetFinalResponse) Reset() { - *x = SetFinalResponse{} - mi := &file_evnode_v1_execution_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SetFinalResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SetFinalResponse) ProtoMessage() {} - -func (x *SetFinalResponse) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[8] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SetFinalResponse.ProtoReflect.Descriptor instead. -func (*SetFinalResponse) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{8} -} - -// GetExecutionInfoRequest requests execution layer parameters -type GetExecutionInfoRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetExecutionInfoRequest) Reset() { - *x = GetExecutionInfoRequest{} - mi := &file_evnode_v1_execution_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetExecutionInfoRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetExecutionInfoRequest) ProtoMessage() {} - -func (x *GetExecutionInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[9] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetExecutionInfoRequest.ProtoReflect.Descriptor instead. -func (*GetExecutionInfoRequest) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{9} -} - -// GetExecutionInfoResponse contains execution layer parameters -type GetExecutionInfoResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Maximum gas allowed for transactions in a block - // For non-gas-based execution layers, this should be 0 - MaxGas uint64 `protobuf:"varint,1,opt,name=max_gas,json=maxGas,proto3" json:"max_gas,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetExecutionInfoResponse) Reset() { - *x = GetExecutionInfoResponse{} - mi := &file_evnode_v1_execution_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetExecutionInfoResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetExecutionInfoResponse) ProtoMessage() {} - -func (x *GetExecutionInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[10] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetExecutionInfoResponse.ProtoReflect.Descriptor instead. -func (*GetExecutionInfoResponse) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{10} -} - -func (x *GetExecutionInfoResponse) GetMaxGas() uint64 { - if x != nil { - return x.MaxGas - } - return 0 -} - -// FilterTxsRequest contains transactions to validate and filter -type FilterTxsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Maximum cumulative size allowed (0 means no size limit) - MaxBytes uint64 `protobuf:"varint,2,opt,name=max_bytes,json=maxBytes,proto3" json:"max_bytes,omitempty"` - // Maximum cumulative gas allowed (0 means no gas limit) - MaxGas uint64 `protobuf:"varint,3,opt,name=max_gas,json=maxGas,proto3" json:"max_gas,omitempty"` - // Whether force-included transactions are present - HasForceIncludedTransaction bool `protobuf:"varint,4,opt,name=has_force_included_transaction,json=hasForceIncludedTransaction,proto3" json:"has_force_included_transaction,omitempty"` - // All transactions (force-included + mempool) in contiguous batch form. - TxBatch *TxBatch `protobuf:"bytes,5,opt,name=tx_batch,json=txBatch,proto3" json:"tx_batch,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *FilterTxsRequest) Reset() { - *x = FilterTxsRequest{} - mi := &file_evnode_v1_execution_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *FilterTxsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FilterTxsRequest) ProtoMessage() {} - -func (x *FilterTxsRequest) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[11] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FilterTxsRequest.ProtoReflect.Descriptor instead. -func (*FilterTxsRequest) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{11} -} - -func (x *FilterTxsRequest) GetMaxBytes() uint64 { - if x != nil { - return x.MaxBytes - } - return 0 -} - -func (x *FilterTxsRequest) GetMaxGas() uint64 { - if x != nil { - return x.MaxGas - } - return 0 -} - -func (x *FilterTxsRequest) GetHasForceIncludedTransaction() bool { - if x != nil { - return x.HasForceIncludedTransaction - } - return false -} - -func (x *FilterTxsRequest) GetTxBatch() *TxBatch { - if x != nil { - return x.TxBatch - } - return nil -} - -// FilterTxsResponse contains the filter status for each transaction -type FilterTxsResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Filter status for each transaction (same length as txs in request) - Statuses []FilterStatus `protobuf:"varint,1,rep,packed,name=statuses,proto3,enum=evnode.v1.FilterStatus" json:"statuses,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *FilterTxsResponse) Reset() { - *x = FilterTxsResponse{} - mi := &file_evnode_v1_execution_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *FilterTxsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FilterTxsResponse) ProtoMessage() {} - -func (x *FilterTxsResponse) ProtoReflect() protoreflect.Message { - mi := &file_evnode_v1_execution_proto_msgTypes[12] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FilterTxsResponse.ProtoReflect.Descriptor instead. -func (*FilterTxsResponse) Descriptor() ([]byte, []int) { - return file_evnode_v1_execution_proto_rawDescGZIP(), []int{12} -} - -func (x *FilterTxsResponse) GetStatuses() []FilterStatus { - if x != nil { - return x.Statuses - } - return nil -} - -var File_evnode_v1_execution_proto protoreflect.FileDescriptor - -const file_evnode_v1_execution_proto_rawDesc = "" + - "\n" + - "\x19evnode/v1/execution.proto\x12\tevnode.v1\x1a\x1fgoogle/protobuf/timestamp.proto\"\x93\x01\n" + - "\x10InitChainRequest\x12=\n" + - "\fgenesis_time\x18\x01 \x01(\v2\x1a.google.protobuf.TimestampR\vgenesisTime\x12%\n" + - "\x0einitial_height\x18\x02 \x01(\x04R\rinitialHeight\x12\x19\n" + - "\bchain_id\x18\x03 \x01(\tR\achainId\"2\n" + - "\x11InitChainResponse\x12\x1d\n" + - "\n" + - "state_root\x18\x01 \x01(\fR\tstateRoot\"\x0f\n" + - "\rGetTxsRequest\"8\n" + - "\aTxBatch\x12\x12\n" + - "\x04data\x18\x01 \x01(\fR\x04data\x12\x19\n" + - "\btx_sizes\x18\x02 \x03(\rR\atxSizes\"J\n" + - "\x0eGetTxsResponse\x12-\n" + - "\btx_batch\x18\x02 \x01(\v2\x12.evnode.v1.TxBatchR\atxBatchJ\x04\b\x01\x10\x02R\x03txs\"\xd2\x01\n" + - "\x11ExecuteTxsRequest\x12!\n" + - "\fblock_height\x18\x02 \x01(\x04R\vblockHeight\x128\n" + - "\ttimestamp\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\ttimestamp\x12&\n" + - "\x0fprev_state_root\x18\x04 \x01(\fR\rprevStateRoot\x12-\n" + - "\btx_batch\x18\x05 \x01(\v2\x12.evnode.v1.TxBatchR\atxBatchJ\x04\b\x01\x10\x02R\x03txs\"\x93\x01\n" + - "\x12ExecuteTxsResponse\x12,\n" + - "\x12updated_state_root\x18\x01 \x01(\fR\x10updatedStateRoot\x12\x1b\n" + - "\tmax_bytes\x18\x02 \x01(\x04R\bmaxBytes\x122\n" + - "\x15next_proposer_address\x18\x03 \x01(\fR\x13nextProposerAddress\"4\n" + - "\x0fSetFinalRequest\x12!\n" + - "\fblock_height\x18\x01 \x01(\x04R\vblockHeight\"\x12\n" + - "\x10SetFinalResponse\"\x19\n" + - "\x17GetExecutionInfoRequest\"3\n" + - "\x18GetExecutionInfoResponse\x12\x17\n" + - "\amax_gas\x18\x01 \x01(\x04R\x06maxGas\"\xc7\x01\n" + - "\x10FilterTxsRequest\x12\x1b\n" + - "\tmax_bytes\x18\x02 \x01(\x04R\bmaxBytes\x12\x17\n" + - "\amax_gas\x18\x03 \x01(\x04R\x06maxGas\x12C\n" + - "\x1ehas_force_included_transaction\x18\x04 \x01(\bR\x1bhasForceIncludedTransaction\x12-\n" + - "\btx_batch\x18\x05 \x01(\v2\x12.evnode.v1.TxBatchR\atxBatchJ\x04\b\x01\x10\x02R\x03txs\"H\n" + - "\x11FilterTxsResponse\x123\n" + - "\bstatuses\x18\x01 \x03(\x0e2\x17.evnode.v1.FilterStatusR\bstatuses*E\n" + - "\fFilterStatus\x12\r\n" + - "\tFILTER_OK\x10\x00\x12\x11\n" + - "\rFILTER_REMOVE\x10\x01\x12\x13\n" + - "\x0fFILTER_POSTPONE\x10\x022\xd9\x03\n" + - "\x0fExecutorService\x12H\n" + - "\tInitChain\x12\x1b.evnode.v1.InitChainRequest\x1a\x1c.evnode.v1.InitChainResponse\"\x00\x12?\n" + - "\x06GetTxs\x12\x18.evnode.v1.GetTxsRequest\x1a\x19.evnode.v1.GetTxsResponse\"\x00\x12K\n" + - "\n" + - "ExecuteTxs\x12\x1c.evnode.v1.ExecuteTxsRequest\x1a\x1d.evnode.v1.ExecuteTxsResponse\"\x00\x12E\n" + - "\bSetFinal\x12\x1a.evnode.v1.SetFinalRequest\x1a\x1b.evnode.v1.SetFinalResponse\"\x00\x12]\n" + - "\x10GetExecutionInfo\x12\".evnode.v1.GetExecutionInfoRequest\x1a#.evnode.v1.GetExecutionInfoResponse\"\x00\x12H\n" + - "\tFilterTxs\x12\x1b.evnode.v1.FilterTxsRequest\x1a\x1c.evnode.v1.FilterTxsResponse\"\x00B>Z google.protobuf.Timestamp - 4, // 1: evnode.v1.GetTxsResponse.tx_batch:type_name -> evnode.v1.TxBatch - 14, // 2: evnode.v1.ExecuteTxsRequest.timestamp:type_name -> google.protobuf.Timestamp - 4, // 3: evnode.v1.ExecuteTxsRequest.tx_batch:type_name -> evnode.v1.TxBatch - 4, // 4: evnode.v1.FilterTxsRequest.tx_batch:type_name -> evnode.v1.TxBatch - 0, // 5: evnode.v1.FilterTxsResponse.statuses:type_name -> evnode.v1.FilterStatus - 1, // 6: evnode.v1.ExecutorService.InitChain:input_type -> evnode.v1.InitChainRequest - 3, // 7: evnode.v1.ExecutorService.GetTxs:input_type -> evnode.v1.GetTxsRequest - 6, // 8: evnode.v1.ExecutorService.ExecuteTxs:input_type -> evnode.v1.ExecuteTxsRequest - 8, // 9: evnode.v1.ExecutorService.SetFinal:input_type -> evnode.v1.SetFinalRequest - 10, // 10: evnode.v1.ExecutorService.GetExecutionInfo:input_type -> evnode.v1.GetExecutionInfoRequest - 12, // 11: evnode.v1.ExecutorService.FilterTxs:input_type -> evnode.v1.FilterTxsRequest - 2, // 12: evnode.v1.ExecutorService.InitChain:output_type -> evnode.v1.InitChainResponse - 5, // 13: evnode.v1.ExecutorService.GetTxs:output_type -> evnode.v1.GetTxsResponse - 7, // 14: evnode.v1.ExecutorService.ExecuteTxs:output_type -> evnode.v1.ExecuteTxsResponse - 9, // 15: evnode.v1.ExecutorService.SetFinal:output_type -> evnode.v1.SetFinalResponse - 11, // 16: evnode.v1.ExecutorService.GetExecutionInfo:output_type -> evnode.v1.GetExecutionInfoResponse - 13, // 17: evnode.v1.ExecutorService.FilterTxs:output_type -> evnode.v1.FilterTxsResponse - 12, // [12:18] is the sub-list for method output_type - 6, // [6:12] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name -} - -func init() { file_evnode_v1_execution_proto_init() } -func file_evnode_v1_execution_proto_init() { - if File_evnode_v1_execution_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: unsafe.Slice(unsafe.StringData(file_evnode_v1_execution_proto_rawDesc), len(file_evnode_v1_execution_proto_rawDesc)), - NumEnums: 1, - NumMessages: 13, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_evnode_v1_execution_proto_goTypes, - DependencyIndexes: file_evnode_v1_execution_proto_depIdxs, - EnumInfos: file_evnode_v1_execution_proto_enumTypes, - MessageInfos: file_evnode_v1_execution_proto_msgTypes, - }.Build() - File_evnode_v1_execution_proto = out.File - file_evnode_v1_execution_proto_goTypes = nil - file_evnode_v1_execution_proto_depIdxs = nil -} diff --git a/execution/grpc/types/pb/evnode/v1/v1connect/execution.connect.go b/execution/grpc/types/pb/evnode/v1/v1connect/execution.connect.go deleted file mode 100644 index c4f7f1df64..0000000000 --- a/execution/grpc/types/pb/evnode/v1/v1connect/execution.connect.go +++ /dev/null @@ -1,265 +0,0 @@ -// Code generated by protoc-gen-connect-go. DO NOT EDIT. -// -// Source: evnode/v1/execution.proto - -package v1connect - -import ( - connect "connectrpc.com/connect" - context "context" - errors "errors" - v1 "github.com/evstack/ev-node/execution/grpc/types/pb/evnode/v1" - http "net/http" - strings "strings" -) - -// This is a compile-time assertion to ensure that this generated file and the connect package are -// compatible. If you get a compiler error that this constant is not defined, this code was -// generated with a version of connect newer than the one compiled into your binary. You can fix the -// problem by either regenerating this code with an older version of connect or updating the connect -// version compiled into your binary. -const _ = connect.IsAtLeastVersion1_13_0 - -const ( - // ExecutorServiceName is the fully-qualified name of the ExecutorService service. - ExecutorServiceName = "evnode.v1.ExecutorService" -) - -// These constants are the fully-qualified names of the RPCs defined in this package. They're -// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. -// -// Note that these are different from the fully-qualified method names used by -// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to -// reflection-formatted method names, remove the leading slash and convert the remaining slash to a -// period. -const ( - // ExecutorServiceInitChainProcedure is the fully-qualified name of the ExecutorService's InitChain - // RPC. - ExecutorServiceInitChainProcedure = "/evnode.v1.ExecutorService/InitChain" - // ExecutorServiceGetTxsProcedure is the fully-qualified name of the ExecutorService's GetTxs RPC. - ExecutorServiceGetTxsProcedure = "/evnode.v1.ExecutorService/GetTxs" - // ExecutorServiceExecuteTxsProcedure is the fully-qualified name of the ExecutorService's - // ExecuteTxs RPC. - ExecutorServiceExecuteTxsProcedure = "/evnode.v1.ExecutorService/ExecuteTxs" - // ExecutorServiceSetFinalProcedure is the fully-qualified name of the ExecutorService's SetFinal - // RPC. - ExecutorServiceSetFinalProcedure = "/evnode.v1.ExecutorService/SetFinal" - // ExecutorServiceGetExecutionInfoProcedure is the fully-qualified name of the ExecutorService's - // GetExecutionInfo RPC. - ExecutorServiceGetExecutionInfoProcedure = "/evnode.v1.ExecutorService/GetExecutionInfo" - // ExecutorServiceFilterTxsProcedure is the fully-qualified name of the ExecutorService's FilterTxs - // RPC. - ExecutorServiceFilterTxsProcedure = "/evnode.v1.ExecutorService/FilterTxs" -) - -// ExecutorServiceClient is a client for the evnode.v1.ExecutorService service. -type ExecutorServiceClient interface { - // InitChain initializes a new blockchain instance with genesis parameters - InitChain(context.Context, *connect.Request[v1.InitChainRequest]) (*connect.Response[v1.InitChainResponse], error) - // GetTxs fetches available transactions from the execution layer's mempool - GetTxs(context.Context, *connect.Request[v1.GetTxsRequest]) (*connect.Response[v1.GetTxsResponse], error) - // ExecuteTxs processes transactions to produce a new block state - ExecuteTxs(context.Context, *connect.Request[v1.ExecuteTxsRequest]) (*connect.Response[v1.ExecuteTxsResponse], error) - // SetFinal marks a block as finalized at the specified height - SetFinal(context.Context, *connect.Request[v1.SetFinalRequest]) (*connect.Response[v1.SetFinalResponse], error) - // GetExecutionInfo returns current execution layer parameters - GetExecutionInfo(context.Context, *connect.Request[v1.GetExecutionInfoRequest]) (*connect.Response[v1.GetExecutionInfoResponse], error) - // FilterTxs validates force-included transactions and calculates gas for all transactions - FilterTxs(context.Context, *connect.Request[v1.FilterTxsRequest]) (*connect.Response[v1.FilterTxsResponse], error) -} - -// NewExecutorServiceClient constructs a client for the evnode.v1.ExecutorService service. By -// default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, -// and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the -// connect.WithGRPC() or connect.WithGRPCWeb() options. -// -// The URL supplied here should be the base URL for the Connect or gRPC server (for example, -// http://api.acme.com or https://acme.com/grpc). -func NewExecutorServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) ExecutorServiceClient { - baseURL = strings.TrimRight(baseURL, "/") - executorServiceMethods := v1.File_evnode_v1_execution_proto.Services().ByName("ExecutorService").Methods() - return &executorServiceClient{ - initChain: connect.NewClient[v1.InitChainRequest, v1.InitChainResponse]( - httpClient, - baseURL+ExecutorServiceInitChainProcedure, - connect.WithSchema(executorServiceMethods.ByName("InitChain")), - connect.WithClientOptions(opts...), - ), - getTxs: connect.NewClient[v1.GetTxsRequest, v1.GetTxsResponse]( - httpClient, - baseURL+ExecutorServiceGetTxsProcedure, - connect.WithSchema(executorServiceMethods.ByName("GetTxs")), - connect.WithClientOptions(opts...), - ), - executeTxs: connect.NewClient[v1.ExecuteTxsRequest, v1.ExecuteTxsResponse]( - httpClient, - baseURL+ExecutorServiceExecuteTxsProcedure, - connect.WithSchema(executorServiceMethods.ByName("ExecuteTxs")), - connect.WithClientOptions(opts...), - ), - setFinal: connect.NewClient[v1.SetFinalRequest, v1.SetFinalResponse]( - httpClient, - baseURL+ExecutorServiceSetFinalProcedure, - connect.WithSchema(executorServiceMethods.ByName("SetFinal")), - connect.WithClientOptions(opts...), - ), - getExecutionInfo: connect.NewClient[v1.GetExecutionInfoRequest, v1.GetExecutionInfoResponse]( - httpClient, - baseURL+ExecutorServiceGetExecutionInfoProcedure, - connect.WithSchema(executorServiceMethods.ByName("GetExecutionInfo")), - connect.WithClientOptions(opts...), - ), - filterTxs: connect.NewClient[v1.FilterTxsRequest, v1.FilterTxsResponse]( - httpClient, - baseURL+ExecutorServiceFilterTxsProcedure, - connect.WithSchema(executorServiceMethods.ByName("FilterTxs")), - connect.WithClientOptions(opts...), - ), - } -} - -// executorServiceClient implements ExecutorServiceClient. -type executorServiceClient struct { - initChain *connect.Client[v1.InitChainRequest, v1.InitChainResponse] - getTxs *connect.Client[v1.GetTxsRequest, v1.GetTxsResponse] - executeTxs *connect.Client[v1.ExecuteTxsRequest, v1.ExecuteTxsResponse] - setFinal *connect.Client[v1.SetFinalRequest, v1.SetFinalResponse] - getExecutionInfo *connect.Client[v1.GetExecutionInfoRequest, v1.GetExecutionInfoResponse] - filterTxs *connect.Client[v1.FilterTxsRequest, v1.FilterTxsResponse] -} - -// InitChain calls evnode.v1.ExecutorService.InitChain. -func (c *executorServiceClient) InitChain(ctx context.Context, req *connect.Request[v1.InitChainRequest]) (*connect.Response[v1.InitChainResponse], error) { - return c.initChain.CallUnary(ctx, req) -} - -// GetTxs calls evnode.v1.ExecutorService.GetTxs. -func (c *executorServiceClient) GetTxs(ctx context.Context, req *connect.Request[v1.GetTxsRequest]) (*connect.Response[v1.GetTxsResponse], error) { - return c.getTxs.CallUnary(ctx, req) -} - -// ExecuteTxs calls evnode.v1.ExecutorService.ExecuteTxs. -func (c *executorServiceClient) ExecuteTxs(ctx context.Context, req *connect.Request[v1.ExecuteTxsRequest]) (*connect.Response[v1.ExecuteTxsResponse], error) { - return c.executeTxs.CallUnary(ctx, req) -} - -// SetFinal calls evnode.v1.ExecutorService.SetFinal. -func (c *executorServiceClient) SetFinal(ctx context.Context, req *connect.Request[v1.SetFinalRequest]) (*connect.Response[v1.SetFinalResponse], error) { - return c.setFinal.CallUnary(ctx, req) -} - -// GetExecutionInfo calls evnode.v1.ExecutorService.GetExecutionInfo. -func (c *executorServiceClient) GetExecutionInfo(ctx context.Context, req *connect.Request[v1.GetExecutionInfoRequest]) (*connect.Response[v1.GetExecutionInfoResponse], error) { - return c.getExecutionInfo.CallUnary(ctx, req) -} - -// FilterTxs calls evnode.v1.ExecutorService.FilterTxs. -func (c *executorServiceClient) FilterTxs(ctx context.Context, req *connect.Request[v1.FilterTxsRequest]) (*connect.Response[v1.FilterTxsResponse], error) { - return c.filterTxs.CallUnary(ctx, req) -} - -// ExecutorServiceHandler is an implementation of the evnode.v1.ExecutorService service. -type ExecutorServiceHandler interface { - // InitChain initializes a new blockchain instance with genesis parameters - InitChain(context.Context, *connect.Request[v1.InitChainRequest]) (*connect.Response[v1.InitChainResponse], error) - // GetTxs fetches available transactions from the execution layer's mempool - GetTxs(context.Context, *connect.Request[v1.GetTxsRequest]) (*connect.Response[v1.GetTxsResponse], error) - // ExecuteTxs processes transactions to produce a new block state - ExecuteTxs(context.Context, *connect.Request[v1.ExecuteTxsRequest]) (*connect.Response[v1.ExecuteTxsResponse], error) - // SetFinal marks a block as finalized at the specified height - SetFinal(context.Context, *connect.Request[v1.SetFinalRequest]) (*connect.Response[v1.SetFinalResponse], error) - // GetExecutionInfo returns current execution layer parameters - GetExecutionInfo(context.Context, *connect.Request[v1.GetExecutionInfoRequest]) (*connect.Response[v1.GetExecutionInfoResponse], error) - // FilterTxs validates force-included transactions and calculates gas for all transactions - FilterTxs(context.Context, *connect.Request[v1.FilterTxsRequest]) (*connect.Response[v1.FilterTxsResponse], error) -} - -// NewExecutorServiceHandler builds an HTTP handler from the service implementation. It returns the -// path on which to mount the handler and the handler itself. -// -// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf -// and JSON codecs. They also support gzip compression. -func NewExecutorServiceHandler(svc ExecutorServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { - executorServiceMethods := v1.File_evnode_v1_execution_proto.Services().ByName("ExecutorService").Methods() - executorServiceInitChainHandler := connect.NewUnaryHandler( - ExecutorServiceInitChainProcedure, - svc.InitChain, - connect.WithSchema(executorServiceMethods.ByName("InitChain")), - connect.WithHandlerOptions(opts...), - ) - executorServiceGetTxsHandler := connect.NewUnaryHandler( - ExecutorServiceGetTxsProcedure, - svc.GetTxs, - connect.WithSchema(executorServiceMethods.ByName("GetTxs")), - connect.WithHandlerOptions(opts...), - ) - executorServiceExecuteTxsHandler := connect.NewUnaryHandler( - ExecutorServiceExecuteTxsProcedure, - svc.ExecuteTxs, - connect.WithSchema(executorServiceMethods.ByName("ExecuteTxs")), - connect.WithHandlerOptions(opts...), - ) - executorServiceSetFinalHandler := connect.NewUnaryHandler( - ExecutorServiceSetFinalProcedure, - svc.SetFinal, - connect.WithSchema(executorServiceMethods.ByName("SetFinal")), - connect.WithHandlerOptions(opts...), - ) - executorServiceGetExecutionInfoHandler := connect.NewUnaryHandler( - ExecutorServiceGetExecutionInfoProcedure, - svc.GetExecutionInfo, - connect.WithSchema(executorServiceMethods.ByName("GetExecutionInfo")), - connect.WithHandlerOptions(opts...), - ) - executorServiceFilterTxsHandler := connect.NewUnaryHandler( - ExecutorServiceFilterTxsProcedure, - svc.FilterTxs, - connect.WithSchema(executorServiceMethods.ByName("FilterTxs")), - connect.WithHandlerOptions(opts...), - ) - return "/evnode.v1.ExecutorService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - switch r.URL.Path { - case ExecutorServiceInitChainProcedure: - executorServiceInitChainHandler.ServeHTTP(w, r) - case ExecutorServiceGetTxsProcedure: - executorServiceGetTxsHandler.ServeHTTP(w, r) - case ExecutorServiceExecuteTxsProcedure: - executorServiceExecuteTxsHandler.ServeHTTP(w, r) - case ExecutorServiceSetFinalProcedure: - executorServiceSetFinalHandler.ServeHTTP(w, r) - case ExecutorServiceGetExecutionInfoProcedure: - executorServiceGetExecutionInfoHandler.ServeHTTP(w, r) - case ExecutorServiceFilterTxsProcedure: - executorServiceFilterTxsHandler.ServeHTTP(w, r) - default: - http.NotFound(w, r) - } - }) -} - -// UnimplementedExecutorServiceHandler returns CodeUnimplemented from all methods. -type UnimplementedExecutorServiceHandler struct{} - -func (UnimplementedExecutorServiceHandler) InitChain(context.Context, *connect.Request[v1.InitChainRequest]) (*connect.Response[v1.InitChainResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("evnode.v1.ExecutorService.InitChain is not implemented")) -} - -func (UnimplementedExecutorServiceHandler) GetTxs(context.Context, *connect.Request[v1.GetTxsRequest]) (*connect.Response[v1.GetTxsResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("evnode.v1.ExecutorService.GetTxs is not implemented")) -} - -func (UnimplementedExecutorServiceHandler) ExecuteTxs(context.Context, *connect.Request[v1.ExecuteTxsRequest]) (*connect.Response[v1.ExecuteTxsResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("evnode.v1.ExecutorService.ExecuteTxs is not implemented")) -} - -func (UnimplementedExecutorServiceHandler) SetFinal(context.Context, *connect.Request[v1.SetFinalRequest]) (*connect.Response[v1.SetFinalResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("evnode.v1.ExecutorService.SetFinal is not implemented")) -} - -func (UnimplementedExecutorServiceHandler) GetExecutionInfo(context.Context, *connect.Request[v1.GetExecutionInfoRequest]) (*connect.Response[v1.GetExecutionInfoResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("evnode.v1.ExecutorService.GetExecutionInfo is not implemented")) -} - -func (UnimplementedExecutorServiceHandler) FilterTxs(context.Context, *connect.Request[v1.FilterTxsRequest]) (*connect.Response[v1.FilterTxsResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("evnode.v1.ExecutorService.FilterTxs is not implemented")) -} diff --git a/execution/grpc/unix.go b/execution/grpc/unix.go deleted file mode 100644 index 69cb59daea..0000000000 --- a/execution/grpc/unix.go +++ /dev/null @@ -1,69 +0,0 @@ -package grpc - -import ( - "errors" - "fmt" - "net" - "net/http" - "os" - - "connectrpc.com/connect" - - "github.com/evstack/ev-node/core/execution" -) - -// ListenUnix creates a Unix domain socket listener for the gRPC execution service. -// -// If socketPath already exists, ListenUnix removes it only when it is a stale -// socket. Regular files, directories, and other path types are left untouched. -func ListenUnix(socketPath string) (net.Listener, error) { - if socketPath == "" { - return nil, errors.New("unix socket path is required") - } - if err := removeStaleUnixSocket(socketPath); err != nil { - return nil, err - } - listener, err := net.Listen("unix", socketPath) - if err != nil { - return nil, fmt.Errorf("listen unix socket %q: %w", socketPath, err) - } - return listener, nil -} - -// ListenAndServeUnix serves the gRPC execution service over a Unix domain socket. -// -// The NewExecutorServiceHandler handler is passed to http.Serve, so this -// function blocks until http.Serve returns an error. When it returns, deferred -// cleanup closes the listener with listener.Close and then removes the socket -// with removeStaleUnixSocket. Cleanup errors are currently ignored. -func ListenAndServeUnix(socketPath string, executor execution.Executor, opts ...connect.HandlerOption) error { - listener, err := ListenUnix(socketPath) - if err != nil { - return err - } - defer func() { - _ = listener.Close() - }() - defer func() { - _ = removeStaleUnixSocket(socketPath) - }() - - return http.Serve(listener, NewExecutorServiceHandler(executor, opts...)) -} - -func removeStaleUnixSocket(socketPath string) error { - info, err := os.Lstat(socketPath) - if errors.Is(err, os.ErrNotExist) { - return nil - } - if err != nil { - return fmt.Errorf("stat unix socket %q: %w", socketPath, err) - } - if info.Mode()&os.ModeSocket == 0 { - return fmt.Errorf("refusing to remove non-socket path %q", socketPath) - } - if err := os.Remove(socketPath); err != nil { - return fmt.Errorf("remove stale unix socket %q: %w", socketPath, err) - } - return nil -} diff --git a/execution/grpc/unix_test.go b/execution/grpc/unix_test.go deleted file mode 100644 index d90133a8e9..0000000000 --- a/execution/grpc/unix_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package grpc - -import ( - "fmt" - "net" - "os" - "path/filepath" - "strings" - "testing" - "time" -) - -func TestListenUnixRejectsNonSocketPath(t *testing.T) { - socketPath := filepath.Join(t.TempDir(), "executor.sock") - if err := os.WriteFile(socketPath, []byte("not a socket"), 0o600); err != nil { - t.Fatalf("write test file: %v", err) - } - - listener, err := ListenUnix(socketPath) - if err == nil { - _ = listener.Close() - t.Fatal("expected error for non-socket path") - } - if !strings.Contains(err.Error(), "refusing to remove non-socket path") { - t.Fatalf("expected non-socket refusal, got %v", err) - } -} - -func TestListenUnixRemovesStaleSocket(t *testing.T) { - socketPath := testUnixSocketPath(t) - staleListener, err := net.Listen("unix", socketPath) - if err != nil { - t.Fatalf("create stale unix socket: %v", err) - } - if err := staleListener.Close(); err != nil { - t.Fatalf("close stale unix socket: %v", err) - } - - listener, err := ListenUnix(socketPath) - if err != nil { - t.Fatalf("listen unix socket: %v", err) - } - if err := listener.Close(); err != nil { - t.Fatalf("close unix socket: %v", err) - } -} - -func testUnixSocketPath(t *testing.T) string { - t.Helper() - - socketPath := filepath.Join( - os.TempDir(), - fmt.Sprintf("ev-node-grpc-%d-%d.sock", os.Getpid(), time.Now().UnixNano()), - ) - t.Cleanup(func() { - _ = os.Remove(socketPath) - }) - return socketPath -} diff --git a/go.work.example b/go.work.example index 69dca9e40b..0dca970286 100644 --- a/go.work.example +++ b/go.work.example @@ -5,8 +5,6 @@ use ( ./core ./apps/testapp ./apps/evm - ./apps/grpc ./execution/evm - ./execution/grpc ./da/ )