From f4b37bc3d84249cb9fea0bf67ba303d9462b4db8 Mon Sep 17 00:00:00 2001 From: krasi Date: Thu, 21 May 2026 14:28:34 +0000 Subject: [PATCH 1/4] ci: add Docker build and push workflow for ghcr.io --- .github/workflows/docker.yml | 55 ++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 .github/workflows/docker.yml diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 000000000..0c7c55312 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,55 @@ +name: Docker + +on: + push: + branches: + - main + tags: + - 'v*' + - '!reporterd/v*' + +permissions: + contents: read + packages: write + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository_owner }}/layer + tags: | + type=ref,event=branch + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=raw,value=latest,enable={{is_default_branch}} + + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max From d2938002677a899ed5e0503359fb5c8b55579b1d Mon Sep 17 00:00:00 2001 From: krasi Date: Thu, 21 May 2026 15:59:15 +0000 Subject: [PATCH 2/4] ci: update Docker workflow to remove branch trigger and adjust metadata tags --- .github/workflows/docker.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 0c7c55312..5501e7a4a 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -2,8 +2,6 @@ name: Docker on: push: - branches: - - main tags: - 'v*' - '!reporterd/v*' @@ -38,10 +36,8 @@ jobs: with: images: ghcr.io/${{ github.repository_owner }}/layer tags: | - type=ref,event=branch type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} - type=raw,value=latest,enable={{is_default_branch}} - name: Build and push uses: docker/build-push-action@v6 From 1f1d302989a38825d950c7b96220eba84df94311 Mon Sep 17 00:00:00 2001 From: krasi Date: Fri, 12 Jun 2026 13:02:48 +0000 Subject: [PATCH 3/4] node: sign vote-ext via checkpoint/attestation RPCs not SignRaw --- Dockerfile | 3 + app/extend_vote.go | 124 +- app/mocks/BridgeKeeper.go | 50 + app/mocks/OracleKeeper.go | 24 + app/remotesigner/keyring.go | 229 ++++ cmd/layerd/cmd/root_option.go | 5 + go.mod | 35 +- go.sum | 893 ++++++++++++ vendor-api/gen/signer/v1/signer.pb.go | 1209 +++++++++++++++++ vendor-api/gen/signer/v1/signer_grpc.pb.go | 461 +++++++ vendor-api/go.mod | 15 + vendor-api/go.sum | 38 + vendor-api/proto/signer/v1/signer.proto | 262 ++++ vendor-api/tls/tls.go | 91 ++ .../keeper/golden_vector_attestation_test.go | 142 ++ x/bridge/keeper/golden_vector_test.go | 114 ++ x/bridge/keeper/keeper.go | 14 + x/bridge/keeper/sigcheck_test.go | 35 + 18 files changed, 3735 insertions(+), 9 deletions(-) create mode 100644 app/remotesigner/keyring.go create mode 100644 vendor-api/gen/signer/v1/signer.pb.go create mode 100644 vendor-api/gen/signer/v1/signer_grpc.pb.go create mode 100644 vendor-api/go.mod create mode 100644 vendor-api/go.sum create mode 100644 vendor-api/proto/signer/v1/signer.proto create mode 100644 vendor-api/tls/tls.go create mode 100644 x/bridge/keeper/golden_vector_attestation_test.go create mode 100644 x/bridge/keeper/golden_vector_test.go create mode 100644 x/bridge/keeper/sigcheck_test.go diff --git a/Dockerfile b/Dockerfile index 671f11b29..4769575a6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,6 +29,9 @@ RUN apk update && apk add --no-cache \ WORKDIR /layer COPY go.mod go.sum ./ +# Local replace target for the vendored bridge-remote-signer api — must be present +# before `go mod download` so the relative replace resolves. +COPY vendor-api ./vendor-api RUN --mount=type=cache,target=/go/pkg/mod \ go mod download diff --git a/app/extend_vote.go b/app/extend_vote.go index 0d629d6ab..5b2db2aaa 100644 --- a/app/extend_vote.go +++ b/app/extend_vote.go @@ -16,6 +16,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" "github.com/ethereum/go-ethereum/common" "github.com/spf13/viper" + "github.com/tellor-io/layer/app/remotesigner" bridgetypes "github.com/tellor-io/layer/x/bridge/types" oracletypes "github.com/tellor-io/layer/x/oracle/types" registrytypes "github.com/tellor-io/layer/x/registry/types" @@ -27,12 +28,14 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + signerv1 "github.com/tellor-io/bridge-remote-signer/api/gen/signer/v1" ) type OracleKeeper interface { GetTimestampBefore(ctx context.Context, queryId []byte, timestamp time.Time) (time.Time, error) GetTimestampAfter(ctx context.Context, queryId []byte, timestamp time.Time) (time.Time, error) GetAggregatedReportsByHeight(ctx context.Context, height uint64) ([]oracletypes.Aggregate, error) + GetAggregateByTimestamp(ctx context.Context, queryId []byte, timestamp uint64) (oracletypes.Aggregate, error) } type BridgeKeeper interface { @@ -50,6 +53,8 @@ type BridgeKeeper interface { GetValidatorDidSignCheckpoint(ctx context.Context, operatorAddr string, checkpointTimestamp uint64) (didSign bool, prevValsetIndex int64, err error) GetAttestationRequestsByHeight(ctx context.Context, height uint64) (*bridgetypes.AttestationRequests, error) SetOracleAttestation(ctx context.Context, operatorAddress string, snapshot, sig []byte) error + GetValsetCheckpointDomainSeparator(ctx context.Context) ([]byte, error) + GetAttestationSnapshotDataBySnapshot(ctx context.Context, snapshot []byte) (bridgetypes.AttestationSnapshotData, error) } type StakingKeeper interface { @@ -154,7 +159,7 @@ func (h *VoteExtHandler) ExtendVoteHandler(ctx sdk.Context, req *abci.RequestExt // iterate through snapshots and generate sigs if len(snapshots) > 0 { for _, snapshot := range snapshots { - sig, err := h.SignMessage(snapshot.Snapshot) + sig, err := h.SignSnapshot(ctx, snapshot.Snapshot) if err != nil { h.logger.Error("ExtendVoteHandler: failed to sign message", "error", err) bz, err := json.Marshal(voteExt) @@ -279,6 +284,62 @@ func (h *VoteExtHandler) SignMessage(msg []byte) ([]byte, error) { return sig, nil } +// SignSnapshot signs an oracle-attestation snapshot. When the keyring is backed +// by the remote signer, it builds the structured SignOracleAttestation request +// (which the signer recomputes the snapshot from and fails closed on mismatch) +// instead of the blind SignMessage path. With a local file keyring it falls back +// to the existing blind SignMessage path so behavior is unchanged. +func (h *VoteExtHandler) SignSnapshot(ctx context.Context, snapshot []byte) ([]byte, error) { + kr, err := h.GetKeyring() + if err != nil { + h.ForceProcessTermination("CRITICAL: failed to get keyring: %v", err) + return nil, err // won't reach here + } + rs, ok := kr.(remotesigner.BridgeRemoteSigner) + if !ok { + // Local file keyring: blind-sign path unchanged. + return h.SignMessage(snapshot) + } + + // Remote signer: build the structured, fail-closed request. + sd, err := h.bridgeKeeper.GetAttestationSnapshotDataBySnapshot(ctx, snapshot) + if err != nil { + h.logger.Error("SignSnapshot: failed to get attestation snapshot data", "error", err) + return nil, err + } + agg, err := h.oracleKeeper.GetAggregateByTimestamp(ctx, sd.QueryId, sd.Timestamp) + if err != nil { + h.logger.Error("SignSnapshot: failed to get aggregate by timestamp", "error", err) + return nil, err + } + // The node stores AggregateValue as a hex string; the signer expects the + // already-decoded raw value bytes (same as EncodeOracleAttestationData). + valueBytes, err := hex.DecodeString(registrytypes.Remove0xPrefix(agg.AggregateValue)) + if err != nil { + h.logger.Error("SignSnapshot: failed to hex-decode aggregate value", "error", err) + return nil, err + } + req := &signerv1.SignOracleAttestationRequest{ + QueryId: sd.QueryId, + Value: valueBytes, + Timestamp: sd.Timestamp, + AggregatePower: agg.AggregatePower, + PreviousTimestamp: sd.PrevReportTimestamp, + NextTimestamp: sd.NextReportTimestamp, + ValsetCheckpoint: sd.ValidatorCheckpoint, + AttestationTimestamp: sd.AttestationTimestamp, + LastConsensusTimestamp: sd.LastConsensusTimestamp, + ExpectedSnapshot: snapshot, + RequestId: "layer-vote-ext", + } + sig, err := rs.SignOracleAttestation(ctx, req) + if err != nil { + h.logger.Error("SignSnapshot: remote signer failed to sign oracle attestation", "error", err) + return nil, err + } + return sig, nil +} + func (h *VoteExtHandler) SignInitialMessage(operatorAddress string) ([]byte, []byte, error) { messageA := fmt.Sprintf("TellorLayer: Initial bridge signature A for operator %s", operatorAddress) messageB := fmt.Sprintf("TellorLayer: Initial bridge signature B for operator %s", operatorAddress) @@ -385,6 +446,53 @@ func (h *VoteExtHandler) CheckAndSignValidatorCheckpoint(ctx context.Context) (s return nil, 0, err } checkpoint := checkpointParams.Checkpoint + + // Remote signer: use the structured, fail-closed SignBridgeCheckpoint RPC + // instead of the blind sign path. Falls back to EncodeAndSignMessage when + // using a local file keyring (behavior unchanged). + kr, err := h.GetKeyring() + if err != nil { + h.logger.Error("failed to get keyring", "error", err) + return nil, 0, err + } + if rs, ok := kr.(remotesigner.BridgeRemoteSigner); ok { + domainSeparator, err := h.bridgeKeeper.GetValsetCheckpointDomainSeparator(ctx) + if err != nil { + h.logger.Error("failed to get valset checkpoint domain separator", "error", err) + return nil, 0, err + } + valset, err := h.bridgeKeeper.GetBridgeValsetByTimestamp(ctx, latestCheckpointTimestamp.Timestamp) + if err != nil { + h.logger.Error("failed to get bridge valset by timestamp", "error", err) + return nil, 0, err + } + validatorSet := make([]*signerv1.BridgeValidator, 0, len(valset.BridgeValidatorSet)) + for _, val := range valset.BridgeValidatorSet { + validatorSet = append(validatorSet, &signerv1.BridgeValidator{ + EthereumAddress: val.EthereumAddress, + Power: val.Power, + }) + } + req := &signerv1.SignBridgeCheckpointRequest{ + DomainSeparator: domainSeparator, + PowerThreshold: checkpointParams.PowerThreshold, + ValidatorTimestamp: checkpointParams.Timestamp, + ValidatorSetHash: checkpointParams.ValsetHash, + ValidatorSet: validatorSet, + BlockHeight: checkpointParams.BlockHeight, + CheckpointIndex: latestCheckpointIdx, + ChainId: sdk.UnwrapSDKContext(ctx).ChainID(), + ExpectedCheckpoint: checkpoint, + RequestId: "layer-vote-ext", + } + signature, err := rs.SignBridgeCheckpoint(ctx, req) + if err != nil { + h.logger.Error("remote signer failed to sign bridge checkpoint", "error", err) + return nil, 0, err + } + return signature, latestCheckpointTimestamp.Timestamp, nil + } + checkpointString := hex.EncodeToString(checkpoint) signature, err := h.EncodeAndSignMessage(checkpointString) if err != nil { @@ -420,6 +528,20 @@ func (h *VoteExtHandler) EncodeAndSignMessage(checkpointString string) ([]byte, } func (h *VoteExtHandler) InitKeyring() (keyring.Keyring, error) { + // Remote-signer mode: when --remote-signer-addr is set, sign vote-extensions + // through the remote signer (SignRaw over mTLS) — no local private key needed. + if addr := viper.GetString("remote-signer-addr"); addr != "" { + kr, err := remotesigner.NewKeyring(context.Background(), viper.GetString("key-name"), addr, + viper.GetString("remote-signer-ca-cert"), + viper.GetString("remote-signer-client-cert"), + viper.GetString("remote-signer-client-key")) + if err != nil { + return nil, fmt.Errorf("init remote-signer keyring: %w", err) + } + h.logger.Info("vote-extension signing via remote signer", "addr", addr) + return kr, nil + } + krBackend := viper.GetString("keyring-backend") if krBackend == "" { return nil, fmt.Errorf("keyring-backend not set, please use --keyring-backend flag") diff --git a/app/mocks/BridgeKeeper.go b/app/mocks/BridgeKeeper.go index c5ef8715c..0a9b19228 100644 --- a/app/mocks/BridgeKeeper.go +++ b/app/mocks/BridgeKeeper.go @@ -97,6 +97,56 @@ func (_m *BridgeKeeper) GetBridgeValsetByTimestamp(ctx context.Context, timestam return r0, r1 } +// GetAttestationSnapshotDataBySnapshot provides a mock function with given fields: ctx, snapshot +func (_m *BridgeKeeper) GetAttestationSnapshotDataBySnapshot(ctx context.Context, snapshot []byte) (types.AttestationSnapshotData, error) { + ret := _m.Called(ctx, snapshot) + + var r0 types.AttestationSnapshotData + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []byte) (types.AttestationSnapshotData, error)); ok { + return rf(ctx, snapshot) + } + if rf, ok := ret.Get(0).(func(context.Context, []byte) types.AttestationSnapshotData); ok { + r0 = rf(ctx, snapshot) + } else { + r0 = ret.Get(0).(types.AttestationSnapshotData) + } + + if rf, ok := ret.Get(1).(func(context.Context, []byte) error); ok { + r1 = rf(ctx, snapshot) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetValsetCheckpointDomainSeparator provides a mock function with given fields: ctx +func (_m *BridgeKeeper) GetValsetCheckpointDomainSeparator(ctx context.Context) ([]byte, error) { + ret := _m.Called(ctx) + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) ([]byte, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) []byte); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetEVMAddressByOperator provides a mock function with given fields: ctx, operatorAddress func (_m *BridgeKeeper) GetEVMAddressByOperator(ctx context.Context, operatorAddress string) ([]byte, error) { ret := _m.Called(ctx, operatorAddress) diff --git a/app/mocks/OracleKeeper.go b/app/mocks/OracleKeeper.go index 80c02c664..57f5b085f 100644 --- a/app/mocks/OracleKeeper.go +++ b/app/mocks/OracleKeeper.go @@ -42,6 +42,30 @@ func (_m *OracleKeeper) GetAggregatedReportsByHeight(ctx context.Context, height return r0, r1 } +// GetAggregateByTimestamp provides a mock function with given fields: ctx, queryId, timestamp +func (_m *OracleKeeper) GetAggregateByTimestamp(ctx context.Context, queryId []byte, timestamp uint64) (types.Aggregate, error) { + ret := _m.Called(ctx, queryId, timestamp) + + var r0 types.Aggregate + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []byte, uint64) (types.Aggregate, error)); ok { + return rf(ctx, queryId, timestamp) + } + if rf, ok := ret.Get(0).(func(context.Context, []byte, uint64) types.Aggregate); ok { + r0 = rf(ctx, queryId, timestamp) + } else { + r0 = ret.Get(0).(types.Aggregate) + } + + if rf, ok := ret.Get(1).(func(context.Context, []byte, uint64) error); ok { + r1 = rf(ctx, queryId, timestamp) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetTimestampAfter provides a mock function with given fields: ctx, queryId, timestamp func (_m *OracleKeeper) GetTimestampAfter(ctx context.Context, queryId []byte, timestamp time.Time) (time.Time, error) { ret := _m.Called(ctx, queryId, timestamp) diff --git a/app/remotesigner/keyring.go b/app/remotesigner/keyring.go new file mode 100644 index 000000000..3ffc656a4 --- /dev/null +++ b/app/remotesigner/keyring.go @@ -0,0 +1,229 @@ +// Package remotesigner provides a cosmos keyring.Keyring backed by the +// bridge-remote-signer over gRPC/mTLS. It lets the validator node sign +// vote-extension (bridge attestation) messages through the remote signer +// instead of a local private key in a file keyring. +// +// The Sign path computes sha256(msg) and calls the signer's SignRaw RPC, +// which is byte-for-byte identical to what a local cosmos secp256k1 keyring +// produces — so vote-extension signatures are unchanged. +package remotesigner + +import ( + "bytes" + "context" + "crypto/sha256" + "fmt" + + "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + cosmossecp "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/tx/signing" + signerv1 "github.com/tellor-io/bridge-remote-signer/api/gen/signer/v1" + bridgetls "github.com/tellor-io/bridge-remote-signer/api/tls" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" +) + +// remoteSignerKeyring implements keyring.Keyring backed by a remote gRPC signer. +// Only Key()/List()/Sign() are functional; mutating methods return errors. +type remoteSignerKeyring struct { + keyName string + pubKey cryptotypes.PubKey + signerConn signerv1.BridgeSignerClient +} + +func newRemoteSignerKeyring(keyName string, pubKeyBytes []byte, signerConn signerv1.BridgeSignerClient) (*remoteSignerKeyring, error) { + if len(pubKeyBytes) != 33 { + return nil, fmt.Errorf("remotesigner: expected 33-byte compressed public key, got %d", len(pubKeyBytes)) + } + return &remoteSignerKeyring{ + keyName: keyName, + pubKey: &cosmossecp.PubKey{Key: pubKeyBytes}, + signerConn: signerConn, + }, nil +} + +func (r *remoteSignerKeyring) Backend() string { return "remote-signer" } + +func (r *remoteSignerKeyring) List() ([]*keyring.Record, error) { + rec, err := keyring.NewOfflineRecord(r.keyName, r.pubKey) + if err != nil { + return nil, err + } + return []*keyring.Record{rec}, nil +} + +func (r *remoteSignerKeyring) SupportedAlgorithms() (keyring.SigningAlgoList, keyring.SigningAlgoList) { + return keyring.SigningAlgoList{hd.Secp256k1}, keyring.SigningAlgoList{} +} + +func (r *remoteSignerKeyring) Key(uid string) (*keyring.Record, error) { + rec, err := keyring.NewOfflineRecord(uid, r.pubKey) + if err != nil { + return nil, fmt.Errorf("remotesigner.Key: %w", err) + } + return rec, nil +} + +func (r *remoteSignerKeyring) KeyByAddress(address sdk.Address) (*keyring.Record, error) { + if !sdk.AccAddress(r.pubKey.Address()).Equals(address) { + return nil, fmt.Errorf("remotesigner.KeyByAddress: address not found") + } + return r.Key(r.keyName) +} + +func (r *remoteSignerKeyring) Delete(_ string) error { return fmt.Errorf("remotesigner: Delete not supported") } +func (r *remoteSignerKeyring) DeleteByAddress(_ sdk.Address) error { + return fmt.Errorf("remotesigner: DeleteByAddress not supported") +} +func (r *remoteSignerKeyring) Rename(_, _ string) error { + return fmt.Errorf("remotesigner: Rename not supported") +} +func (r *remoteSignerKeyring) NewMnemonic(_ string, _ keyring.Language, _, _ string, _ keyring.SignatureAlgo) (*keyring.Record, string, error) { + return nil, "", fmt.Errorf("remotesigner: NewMnemonic not supported") +} +func (r *remoteSignerKeyring) NewAccount(_, _, _, _ string, _ keyring.SignatureAlgo) (*keyring.Record, error) { + return nil, fmt.Errorf("remotesigner: NewAccount not supported") +} +func (r *remoteSignerKeyring) SaveLedgerKey(_ string, _ keyring.SignatureAlgo, _ string, _, _, _ uint32) (*keyring.Record, error) { + return nil, fmt.Errorf("remotesigner: SaveLedgerKey not supported") +} +func (r *remoteSignerKeyring) SaveOfflineKey(_ string, _ cryptotypes.PubKey) (*keyring.Record, error) { + return nil, fmt.Errorf("remotesigner: SaveOfflineKey not supported") +} +func (r *remoteSignerKeyring) SaveMultisig(_ string, _ cryptotypes.PubKey) (*keyring.Record, error) { + return nil, fmt.Errorf("remotesigner: SaveMultisig not supported") +} + +// Sign computes sha256(msg) and signs it via the remote signer's SignRaw RPC, +// returning a 64-byte (r||s) secp256k1 signature. +func (r *remoteSignerKeyring) Sign(_ string, msg []byte, _ signing.SignMode) ([]byte, cryptotypes.PubKey, error) { + hash := sha256.Sum256(msg) + resp, err := r.signerConn.SignRaw(context.Background(), &signerv1.SignRawRequest{ + Msg: hash[:], + RequestId: "layer-vote-ext", + }) + if err != nil { + return nil, nil, fmt.Errorf("remotesigner.Sign: SignRaw RPC failed: %w", err) + } + return resp.Signature, r.pubKey, nil +} + +func (r *remoteSignerKeyring) SignByAddress(address sdk.Address, msg []byte, signMode signing.SignMode) ([]byte, cryptotypes.PubKey, error) { + if !sdk.AccAddress(r.pubKey.Address()).Equals(address) { + return nil, nil, fmt.Errorf("remotesigner.SignByAddress: address mismatch") + } + return r.Sign(r.keyName, msg, signMode) +} + +func (r *remoteSignerKeyring) ImportPrivKey(_, _, _ string) error { + return fmt.Errorf("remotesigner: ImportPrivKey not supported") +} +func (r *remoteSignerKeyring) ImportPrivKeyHex(_, _, _ string) error { + return fmt.Errorf("remotesigner: ImportPrivKeyHex not supported") +} +func (r *remoteSignerKeyring) ImportPubKey(_, _ string) error { + return fmt.Errorf("remotesigner: ImportPubKey not supported") +} +func (r *remoteSignerKeyring) MigrateAll() ([]*keyring.Record, error) { + return nil, fmt.Errorf("remotesigner: MigrateAll not supported") +} +func (r *remoteSignerKeyring) ExportPubKeyArmor(_ string) (string, error) { + return "", fmt.Errorf("remotesigner: ExportPubKeyArmor not supported") +} +func (r *remoteSignerKeyring) ExportPubKeyArmorByAddress(_ sdk.Address) (string, error) { + return "", fmt.Errorf("remotesigner: ExportPubKeyArmorByAddress not supported") +} +func (r *remoteSignerKeyring) ExportPrivKeyArmor(_, _ string) (string, error) { + return "", fmt.Errorf("remotesigner: ExportPrivKeyArmor not supported") +} +func (r *remoteSignerKeyring) ExportPrivKeyArmorByAddress(_ sdk.Address, _ string) (string, error) { + return "", fmt.Errorf("remotesigner: ExportPrivKeyArmorByAddress not supported") +} + +// BridgeRemoteSigner is the validated-signing surface of the remote signer. +// The app type-asserts a keyring.Keyring to this interface to decide whether to +// use the structured, fail-closed RPCs (SignBridgeCheckpoint / +// SignOracleAttestation) instead of the blind SignRaw path. Only the remote +// signer keyring implements it; a local file keyring does not, so the blind +// path is used there. +type BridgeRemoteSigner interface { + SignBridgeCheckpoint(ctx context.Context, req *signerv1.SignBridgeCheckpointRequest) ([]byte, error) + SignOracleAttestation(ctx context.Context, req *signerv1.SignOracleAttestationRequest) ([]byte, error) +} + +// SignBridgeCheckpoint asks the remote signer to recompute the valset checkpoint +// from the structured inputs and sign it. The signer fails closed unless its +// recomputed checkpoint matches req.ExpectedCheckpoint, so a wrong input field +// yields an error here (the node simply does not sign), never a wrong signature. +func (r *remoteSignerKeyring) SignBridgeCheckpoint(ctx context.Context, req *signerv1.SignBridgeCheckpointRequest) ([]byte, error) { + resp, err := r.signerConn.SignBridgeCheckpoint(ctx, req) + if err != nil { + return nil, fmt.Errorf("remotesigner.SignBridgeCheckpoint: RPC failed: %w", err) + } + if len(resp.Signature) != 64 { + return nil, fmt.Errorf("remotesigner.SignBridgeCheckpoint: expected 64-byte signature, got %d", len(resp.Signature)) + } + if !bytes.Equal(resp.Checkpoint, req.ExpectedCheckpoint) { + return nil, fmt.Errorf("remotesigner.SignBridgeCheckpoint: signer checkpoint does not match expected checkpoint") + } + return resp.Signature, nil +} + +// SignOracleAttestation asks the remote signer to recompute the attestation +// snapshot from the structured inputs and sign it. The signer fails closed +// unless its recomputed snapshot matches req.ExpectedSnapshot. +func (r *remoteSignerKeyring) SignOracleAttestation(ctx context.Context, req *signerv1.SignOracleAttestationRequest) ([]byte, error) { + resp, err := r.signerConn.SignOracleAttestation(ctx, req) + if err != nil { + return nil, fmt.Errorf("remotesigner.SignOracleAttestation: RPC failed: %w", err) + } + if len(resp.Signature) != 64 { + return nil, fmt.Errorf("remotesigner.SignOracleAttestation: expected 64-byte signature, got %d", len(resp.Signature)) + } + if !bytes.Equal(resp.Snapshot, req.ExpectedSnapshot) { + return nil, fmt.Errorf("remotesigner.SignOracleAttestation: signer snapshot does not match expected snapshot") + } + return resp.Signature, nil +} + +var _ keyring.Keyring = (*remoteSignerKeyring)(nil) +var _ BridgeRemoteSigner = (*remoteSignerKeyring)(nil) + +// NewKeyring dials the remote signer at addr, fetches its public key, and returns +// a keyring.Keyring backed by it. When caCert/clientCert/clientKey are all set, +// mTLS is used; otherwise the connection is insecure (local/test only). +// The underlying gRPC connection stays open for the lifetime of the keyring. +func NewKeyring(ctx context.Context, keyName, addr, caCert, clientCert, clientKey string) (keyring.Keyring, error) { + var dialOpt grpc.DialOption + if caCert != "" && clientCert != "" && clientKey != "" { + creds, err := bridgetls.NewClientCredentials(caCert, clientCert, clientKey, "bridge-signer") + if err != nil { + return nil, fmt.Errorf("remotesigner: load mTLS credentials: %w", err) + } + dialOpt = grpc.WithTransportCredentials(creds) + } else { + dialOpt = grpc.WithTransportCredentials(insecure.NewCredentials()) + } + + conn, err := grpc.NewClient(addr, dialOpt) + if err != nil { + return nil, fmt.Errorf("remotesigner: dial %s: %w", addr, err) + } + + signerClient := signerv1.NewBridgeSignerClient(conn) + pubKeyResp, err := signerClient.GetPublicKey(ctx, &signerv1.GetPublicKeyRequest{}) + if err != nil { + conn.Close() + return nil, fmt.Errorf("remotesigner: GetPublicKey: %w", err) + } + + kr, err := newRemoteSignerKeyring(keyName, pubKeyResp.PublicKey, signerClient) + if err != nil { + conn.Close() + return nil, err + } + return kr, nil +} diff --git a/cmd/layerd/cmd/root_option.go b/cmd/layerd/cmd/root_option.go index e1d7a95b7..a98edc09a 100644 --- a/cmd/layerd/cmd/root_option.go +++ b/cmd/layerd/cmd/root_option.go @@ -25,6 +25,11 @@ func GetOptionWithCustomStartCmd() *RootCmdOption { f := func(cmd *cobra.Command) { cmd.Flags().String("keyring-backend", "test", "Select keyring's backend (os|file|kwallet|pass|test)") cmd.Flags().String("key-name", "alice", "Select key name") + // Remote-signer mode for vote-extension signing (no local key on this node). + cmd.Flags().String("remote-signer-addr", "", "remote signer gRPC address host:port; if set, vote-extensions are signed via the remote signer instead of a local keyring") + cmd.Flags().String("remote-signer-ca-cert", "", "mTLS CA cert path for the remote signer") + cmd.Flags().String("remote-signer-client-cert", "", "mTLS client cert path for the remote signer") + cmd.Flags().String("remote-signer-client-key", "", "mTLS client key path for the remote signer") } option.setCustomizeStartCmd(f) return option diff --git a/go.mod b/go.mod index 1fddbbd6e..89f78ead2 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 github.com/hashicorp/go-metrics v0.5.4 github.com/spf13/cast v1.9.2 github.com/spf13/cobra v1.9.1 @@ -44,12 +44,12 @@ require ( github.com/stretchr/testify v1.10.0 github.com/vektra/mockery/v2 v2.23.1 go.uber.org/mock v0.5.2 - golang.org/x/text v0.25.0 + golang.org/x/text v0.32.0 golang.org/x/tools v0.31.0 google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a - google.golang.org/grpc v1.72.2 + google.golang.org/grpc v1.79.3 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 - google.golang.org/protobuf v1.36.6 + google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -153,7 +153,7 @@ require ( github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.3 // indirect github.com/google/cel-go v0.20.1 // indirect - github.com/google/flatbuffers v1.12.1 // indirect + github.com/google/flatbuffers v2.0.8+incompatible // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-containerregistry v0.19.1 // indirect github.com/google/orderedcode v0.0.1 // indirect @@ -264,15 +264,15 @@ require ( golang.org/x/crypto v0.38.0 // indirect golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect golang.org/x/mod v0.24.0 // indirect - golang.org/x/net v0.40.0 // indirect + golang.org/x/net v0.48.0 // indirect golang.org/x/oauth2 v0.26.0 // indirect golang.org/x/sync v0.14.0 // indirect - golang.org/x/sys v0.33.0 // indirect + golang.org/x/sys v0.39.0 // indirect golang.org/x/term v0.32.0 // indirect golang.org/x/time v0.8.0 // indirect google.golang.org/api v0.215.0 // indirect google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect gotest.tools/v3 v3.5.2 // indirect nhooyr.io/websocket v1.8.10 // indirect pgregory.net/rapid v1.2.0 // indirect @@ -288,3 +288,22 @@ replace ( github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) + +// Vendored bridge-remote-signer api (gRPC client + mTLS) for remote vote-extension signing. +require github.com/tellor-io/bridge-remote-signer/api v0.0.0 + +replace github.com/tellor-io/bridge-remote-signer/api => ./vendor-api + +// Pin grpc/protobuf to the versions this module already uses, so the vendored +// api dependency cannot pull them up to incompatible versions. +replace google.golang.org/grpc => google.golang.org/grpc v1.72.2 + +replace google.golang.org/protobuf => google.golang.org/protobuf v1.36.6 + +replace golang.org/x/net => golang.org/x/net v0.40.0 + +replace golang.org/x/sys => golang.org/x/sys v0.33.0 + +replace golang.org/x/text => golang.org/x/text v0.25.0 + +replace google.golang.org/genproto/googleapis/rpc => google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a diff --git a/go.sum b/go.sum index 55c4e888a..efe0c8b2c 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,9 @@ buf.build/gen/go/bufbuild/registry/connectrpc/go v1.16.1-20240514010100-299bd9c9 buf.build/gen/go/bufbuild/registry/connectrpc/go v1.16.1-20240514010100-299bd9c9a0c4.1/go.mod h1:3Vwq3HRCNOcnv99Ra+/8K5cntwO/Gw98cIjsjQVxf4E= buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.34.1-20240514010100-299bd9c9a0c4.1 h1:zrXXp1IT3qukIKorguvnrw/JzxYttBrXzktUQGiQHqA= buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.34.1-20240514010100-299bd9c9a0c4.1/go.mod h1:8ONhsyCTLQ9kBslWnMgPrXTcxzCkKlxZqN9ewUveui8= +cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cel.dev/expr v0.19.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cel.dev/expr v0.20.0 h1:OunBvVCfvpWlt4dN7zg3FM6TDkzOePe1+foGJ9AXeeI= cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -12,6 +15,7 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT 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.44.3/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= @@ -24,6 +28,7 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY 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.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= 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= @@ -35,32 +40,119 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= +cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs= cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q= cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU= cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= 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= @@ -68,12 +160,55 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM 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/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= @@ -81,128 +216,571 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= +cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= 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/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= +cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= +cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= +cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= +cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= +cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= 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/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= 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= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= cloud.google.com/go/storage v1.49.0 h1:zenOPBOWHCnojRd9aJZAyQXBYqkJkdQS42dxL55CIMw= cloud.google.com/go/storage v1.49.0/go.mod h1:k1eHhhpLvrPjVGfo0mOUPEJ4Y2+a/Hv5PiwehZI9qGU= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= connectrpc.com/connect v1.16.1 h1:rOdrK/RTI/7TVnn3JsVxt3n028MlTRwmK5Q4heSpjis= connectrpc.com/connect v1.16.1/go.mod h1:XpZAduBQUySsb4/KO5JffORVkDI4B6/EYPi7N8xpNZw= connectrpc.com/otelconnect v0.7.0 h1:ZH55ZZtcJOTKWWLy3qmL4Pam4RzRWBJFOqTPyAqCXkY= @@ -238,6 +816,8 @@ cosmossdk.io/x/upgrade v0.1.1/go.mod h1:MNLptLPcIFK9CWt7Ra//8WUZAxweyRDNcbs5nkOc dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= @@ -248,6 +828,7 @@ github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dX github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.7 h1:ybO8RBeh29qrxIhCA9E8gKY6xfONU9T6G6aP9DTKfLE= github.com/DataDog/zstd v1.5.7/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 h1:f2Qw/Ehhimh5uO1fayV0QIW7DShEQqhtUfhYc+cBPlw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0/go.mod h1:2bIszWvQRlJVmJLiuLhukLImRjKPcYdzzsx6darK02A= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s= @@ -256,6 +837,7 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= @@ -271,16 +853,25 @@ github.com/adlio/schema v1.3.6/go.mod h1:qkxwLgPBd1FgLRHYVCmQT/rrBr3JH38J9LjmVzW github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agiledragon/gomonkey/v2 v2.12.0 h1:ek0dYu9K1rSV+TgkW5LvNNPRWyDZVIxGMCFI6Pz9o38= github.com/agiledragon/gomonkey/v2 v2.12.0/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= 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/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= 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/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= @@ -304,6 +895,8 @@ github.com/bgentry/speakeasy v0.2.0 h1:tgObeVOf8WAvtuAX6DhJ4xks4CFNwPDZiqzGqIHE5 github.com/bgentry/speakeasy v0.2.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= @@ -332,8 +925,11 @@ github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInq github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0/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/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= @@ -362,11 +958,17 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX 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/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 h1:Om6kYQYDUk5wWbT0t0q6pvyM49i9XZAv9dDrkDA7gjk= github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= @@ -471,6 +1073,7 @@ github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -493,13 +1096,22 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= +github.com/envoyproxy/go-control-plane/envoy v1.32.2/go.mod h1:eR2SOX2IedqlPvmiKjUH7Wu//S602JKI7HPC/L3SRq8= +github.com/envoyproxy/go-control-plane/envoy v1.32.3/go.mod h1:F6hWupPfh75TBXGKA++MCT/CZHFq5r9/uwt/kQYkZfE= github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/ethereum/go-ethereum v1.14.8 h1:NgOWvXS+lauK+zFukEvi85UmmsS/OkV0N23UZ1VTIig= @@ -513,6 +1125,8 @@ github.com/felixge/fgprof v0.9.4 h1:ocDNwMFlnA0NU0zSB3I52xkO4sFXk80VK9lXjLClu88= github.com/felixge/fgprof v0.9.4/go.mod h1:yKl+ERSa++RYOs32d8K6WEXCB4uXdLls4ZaZPpayhMM= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -533,6 +1147,11 @@ github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= 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= @@ -546,6 +1165,8 @@ github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4F github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= 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= @@ -556,6 +1177,8 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/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-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= @@ -570,6 +1193,7 @@ github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -581,7 +1205,10 @@ github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFG github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -618,6 +1245,7 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw 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.3/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.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -633,6 +1261,7 @@ github.com/google/cel-go v0.20.1 h1:nDx9r8S3L4pE61eDdt8igGj8rf5kjYR3ILxWIpWNi84= github.com/google/cel-go v0.20.1/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg= github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.8+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= @@ -648,6 +1277,7 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0/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/go-containerregistry v0.19.1 h1:yMQ62Al6/V0Z7CqIrrS1iYoA5/oQCm88DeNujc7C1KY= @@ -661,6 +1291,7 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi 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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= @@ -674,6 +1305,7 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf 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-20201218002935-b9804c9f04c2/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/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -684,6 +1316,9 @@ github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0Z github.com/google/pprof v0.0.0-20240509144519-723abb6459b7 h1:velgFPYr1X9TDwLIfkV7fWqsFlf7TeP11M/7kPd/dVI= github.com/google/pprof v0.0.0-20240509144519-723abb6459b7/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -694,6 +1329,8 @@ github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -705,9 +1342,15 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= @@ -728,8 +1371,11 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 h1:gDLXvp5S9izjldquuoAhDzccbskOL6tDC5jMSyx3zxE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2/go.mod h1:7pdNwVWBBHGiCxa9lAszqCJMbfTISJ7oMftp8+UGV08= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= @@ -788,6 +1434,7 @@ github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0Jr github.com/huandu/skiplist v1.2.1 h1:dTi93MgjwErA/8idWTzIw4Y1kZsMWx35fmI2c8Rij7w= github.com/huandu/skiplist v1.2.1/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -827,10 +1474,15 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X 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/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= @@ -845,6 +1497,8 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv 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.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= 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= @@ -861,6 +1515,11 @@ github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-b github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linxGnu/grocksdb v1.8.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ= github.com/linxGnu/grocksdb v1.8.14/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= +github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= @@ -878,15 +1537,20 @@ github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mdp/qrterminal/v3 v3.2.1 h1:6+yQjiiOsSuXT5n9/m60E54vdgFsw0zhADHhHLrFet4= github.com/mdp/qrterminal/v3 v3.2.1/go.mod h1:jOTmXvnBsMy5xqLniO0R++Jmjs2sTm9dFSuQ5kpz/SU= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -977,8 +1641,12 @@ github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8 github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= @@ -992,6 +1660,7 @@ github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6J github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= 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= @@ -1013,6 +1682,8 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -1038,10 +1709,16 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 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.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= 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/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= @@ -1053,6 +1730,8 @@ github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= @@ -1074,7 +1753,11 @@ github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJ github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.4.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= github.com/spf13/cast v1.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE= @@ -1114,6 +1797,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= @@ -1145,9 +1831,12 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= @@ -1175,6 +1864,7 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 h1:1u/AyyOqAWzy+SkPxDpahCNZParHV8Vid1RnI2clyDE= @@ -1183,15 +1873,20 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1232,13 +1927,27 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= 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= @@ -1246,10 +1955,22 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 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-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 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/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= 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= @@ -1273,7 +1994,17 @@ 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.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= 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.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1360,8 +2091,14 @@ golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7Lm golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1377,7 +2114,14 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/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.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.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.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1480,9 +2224,16 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= 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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +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.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1501,11 +2252,16 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb 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.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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-20190206041539-40960b6deb8e/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= @@ -1519,6 +2275,7 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw 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-20190927191325-030b2cf1153e/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-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1552,17 +2309,28 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc 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-20201124115921-2c860bdd6e78/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.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +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.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1573,6 +2341,14 @@ golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= 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= @@ -1621,7 +2397,21 @@ google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaE google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= +google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/api v0.215.0 h1:jdYF4qnyczlEz2ReWIsosNLDuzXyvFHJtI5gcr0J7t0= google.golang.org/api v0.215.0/go.mod h1:fta3CVtuJYOEdugLNWm6WodzOS8KdFckABwN4I40hzY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -1671,8 +2461,10 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D 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-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/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-20210226172003-ab064af71705/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= @@ -1706,6 +2498,7 @@ google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= @@ -1738,11 +2531,57 @@ google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53B google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= +google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a/go.mod h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY= +google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU= google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a h1:SGktgSolFCo75dnHJF2yMvnns6jCmHFJ0vE4Vn2JKvQ= google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a/go.mod h1:a77HrdMjoeKbnd2jmgcWdaS++ZLZAEq3orIOAEIKiVw= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -1790,6 +2629,7 @@ google.golang.org/grpc v1.72.2 h1:TdbGzwb82ty4OusHWepvFWGLgIbNo1/SUynEN0ssqv8= google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc/examples v0.0.0-20230224211313-3775f633ce20/go.mod h1:Nr5H8+MlGWr5+xX/STzdoEqJrO+YteqFbMyCsrb6mH0= 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= @@ -1848,6 +2688,58 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh 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= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= +modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= +modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= +modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= nhooyr.io/websocket v1.8.10 h1:mv4p+MnGrLDcPlBoWsvPP7XCzTYMXP9F9eIGoKbgx7Q= nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= @@ -1855,6 +2747,7 @@ nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYm pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/vendor-api/gen/signer/v1/signer.pb.go b/vendor-api/gen/signer/v1/signer.pb.go new file mode 100644 index 000000000..5c7f8c263 --- /dev/null +++ b/vendor-api/gen/signer/v1/signer.pb.go @@ -0,0 +1,1209 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc v3.21.12 +// source: signer/v1/signer.proto + +package signerv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + 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) +) + +// SignRequest is the signing request sent by the validator. +type SignRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // msg is the raw bytes to sign. Must be exactly 32 bytes. + Msg []byte `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + // request_id is an optional caller-assigned identifier for logs. + RequestId string `protobuf:"bytes,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignRequest) Reset() { + *x = SignRequest{} + mi := &file_signer_v1_signer_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignRequest) ProtoMessage() {} + +func (x *SignRequest) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 SignRequest.ProtoReflect.Descriptor instead. +func (*SignRequest) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{0} +} + +func (x *SignRequest) GetMsg() []byte { + if x != nil { + return x.Msg + } + return nil +} + +func (x *SignRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +// SignResponse contains the resulting signature. +type SignResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // signature is the 65-byte secp256k1 ECDSA signature (r || s || v). + // Compatible with Ethereum's ecrecover, v is 27 or 28. + Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignResponse) Reset() { + *x = SignResponse{} + mi := &file_signer_v1_signer_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignResponse) ProtoMessage() {} + +func (x *SignResponse) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 SignResponse.ProtoReflect.Descriptor instead. +func (*SignResponse) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{1} +} + +func (x *SignResponse) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +// GetPublicKeyRequest +type GetPublicKeyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetPublicKeyRequest) Reset() { + *x = GetPublicKeyRequest{} + mi := &file_signer_v1_signer_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetPublicKeyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetPublicKeyRequest) ProtoMessage() {} + +func (x *GetPublicKeyRequest) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 GetPublicKeyRequest.ProtoReflect.Descriptor instead. +func (*GetPublicKeyRequest) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{2} +} + +// GetPublicKeyResponse contains the public key. +type GetPublicKeyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // public_key is the compressed 33-byte secp256k1 public key. + // The validator uses this to derive the bech32 operator address + // and the Ethereum address for bridge contract verification. + PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetPublicKeyResponse) Reset() { + *x = GetPublicKeyResponse{} + mi := &file_signer_v1_signer_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetPublicKeyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetPublicKeyResponse) ProtoMessage() {} + +func (x *GetPublicKeyResponse) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 GetPublicKeyResponse.ProtoReflect.Descriptor instead. +func (*GetPublicKeyResponse) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{3} +} + +func (x *GetPublicKeyResponse) GetPublicKey() []byte { + if x != nil { + return x.PublicKey + } + return nil +} + +// SignRawRequest is the request for raw cosmos-compatible signing. +type SignRawRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // msg is the 32-byte hash to sign directly (no additional hashing). + Msg []byte `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + // request_id is an optional caller-assigned identifier for logs. + RequestId string `protobuf:"bytes,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignRawRequest) Reset() { + *x = SignRawRequest{} + mi := &file_signer_v1_signer_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignRawRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignRawRequest) ProtoMessage() {} + +func (x *SignRawRequest) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 SignRawRequest.ProtoReflect.Descriptor instead. +func (*SignRawRequest) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{4} +} + +func (x *SignRawRequest) GetMsg() []byte { + if x != nil { + return x.Msg + } + return nil +} + +func (x *SignRawRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +// SignRawResponse contains the resulting cosmos-format signature. +type SignRawResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // signature is the 64-byte secp256k1 ECDSA signature (r || s). + // Compatible with Cosmos SDK tx signing (no v byte). + Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignRawResponse) Reset() { + *x = SignRawResponse{} + mi := &file_signer_v1_signer_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignRawResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignRawResponse) ProtoMessage() {} + +func (x *SignRawResponse) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 SignRawResponse.ProtoReflect.Descriptor instead. +func (*SignRawResponse) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{5} +} + +func (x *SignRawResponse) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +// GetAddressRequest specifies the bech32 prefix to use. +type GetAddressRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // prefix is the bech32 human-readable part (e.g. "tellor"). + Prefix string `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAddressRequest) Reset() { + *x = GetAddressRequest{} + mi := &file_signer_v1_signer_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAddressRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAddressRequest) ProtoMessage() {} + +func (x *GetAddressRequest) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 GetAddressRequest.ProtoReflect.Descriptor instead. +func (*GetAddressRequest) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{6} +} + +func (x *GetAddressRequest) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +// GetAddressResponse contains the derived bech32 address. +type GetAddressResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // address is the bech32-encoded account address (e.g. "tellor1..."). + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAddressResponse) Reset() { + *x = GetAddressResponse{} + mi := &file_signer_v1_signer_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAddressResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAddressResponse) ProtoMessage() {} + +func (x *GetAddressResponse) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 GetAddressResponse.ProtoReflect.Descriptor instead. +func (*GetAddressResponse) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{7} +} + +func (x *GetAddressResponse) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +// SignTxRequest carries raw Cosmos SignDoc bytes for scope-checked signing. +type SignTxRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // sign_doc is the raw protobuf-encoded cosmos.tx.v1beta1.SignDoc bytes + // (the exact bytes that will be sha256-hashed and signed). + SignDoc []byte `protobuf:"bytes,1,opt,name=sign_doc,json=signDoc,proto3" json:"sign_doc,omitempty"` + // request_id is an optional caller-assigned identifier for logs. + RequestId string `protobuf:"bytes,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignTxRequest) Reset() { + *x = SignTxRequest{} + mi := &file_signer_v1_signer_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignTxRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignTxRequest) ProtoMessage() {} + +func (x *SignTxRequest) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 SignTxRequest.ProtoReflect.Descriptor instead. +func (*SignTxRequest) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{8} +} + +func (x *SignTxRequest) GetSignDoc() []byte { + if x != nil { + return x.SignDoc + } + return nil +} + +func (x *SignTxRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +// SignTxResponse contains the resulting cosmos-format signature. +type SignTxResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // signature is the 64-byte secp256k1 ECDSA signature (r || s). + Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignTxResponse) Reset() { + *x = SignTxResponse{} + mi := &file_signer_v1_signer_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignTxResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignTxResponse) ProtoMessage() {} + +func (x *SignTxResponse) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 SignTxResponse.ProtoReflect.Descriptor instead. +func (*SignTxResponse) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{9} +} + +func (x *SignTxResponse) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +// GetChainIDRequest +type GetChainIDRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetChainIDRequest) Reset() { + *x = GetChainIDRequest{} + mi := &file_signer_v1_signer_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetChainIDRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetChainIDRequest) ProtoMessage() {} + +func (x *GetChainIDRequest) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 GetChainIDRequest.ProtoReflect.Descriptor instead. +func (*GetChainIDRequest) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{10} +} + +// GetChainIDResponse contains the configured chain ID. +type GetChainIDResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // chain_id is the cosmos chain ID (e.g. "layertest-5"). + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetChainIDResponse) Reset() { + *x = GetChainIDResponse{} + mi := &file_signer_v1_signer_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetChainIDResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetChainIDResponse) ProtoMessage() {} + +func (x *GetChainIDResponse) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 GetChainIDResponse.ProtoReflect.Descriptor instead. +func (*GetChainIDResponse) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{11} +} + +func (x *GetChainIDResponse) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + +// BridgeValidator is a single entry of the bridge validator set, mirroring the +// node's x/bridge types.BridgeValidator. The signer re-sorts and re-encodes the +// set itself; caller ordering is not trusted. +type BridgeValidator struct { + state protoimpl.MessageState `protogen:"open.v1"` + // ethereum_address is the raw 20-byte EVM address of the validator. + EthereumAddress []byte `protobuf:"bytes,1,opt,name=ethereum_address,json=ethereumAddress,proto3" json:"ethereum_address,omitempty"` + // power is the validator's bridge voting power. + Power uint64 `protobuf:"varint,2,opt,name=power,proto3" json:"power,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BridgeValidator) Reset() { + *x = BridgeValidator{} + mi := &file_signer_v1_signer_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BridgeValidator) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BridgeValidator) ProtoMessage() {} + +func (x *BridgeValidator) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_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 BridgeValidator.ProtoReflect.Descriptor instead. +func (*BridgeValidator) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{12} +} + +func (x *BridgeValidator) GetEthereumAddress() []byte { + if x != nil { + return x.EthereumAddress + } + return nil +} + +func (x *BridgeValidator) GetPower() uint64 { + if x != nil { + return x.Power + } + return 0 +} + +// SignBridgeCheckpointRequest carries the STRUCTURED inputs the signer needs to +// recompute the valset checkpoint locally (never a blind hash). The signer +// recomputes the checkpoint and must match expected_checkpoint or fail closed. +type SignBridgeCheckpointRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // domain_separator is the 32-byte checkpoint domain separator the node + // computed. The signer independently recomputes it from chain_id and asserts + // equality. + DomainSeparator []byte `protobuf:"bytes,1,opt,name=domain_separator,json=domainSeparator,proto3" json:"domain_separator,omitempty"` + // power_threshold is sum(powers)*2/3 (node integer math). Re-derived + checked. + PowerThreshold uint64 `protobuf:"varint,2,opt,name=power_threshold,json=powerThreshold,proto3" json:"power_threshold,omitempty"` + // validator_timestamp is the valset timestamp in UNIX MILLISECONDS. + ValidatorTimestamp uint64 `protobuf:"varint,3,opt,name=validator_timestamp,json=validatorTimestamp,proto3" json:"validator_timestamp,omitempty"` + // validator_set_hash is the node-computed keccak256 hash of the encoded + // validator set. The signer recomputes it and asserts equality. + ValidatorSetHash []byte `protobuf:"bytes,4,opt,name=validator_set_hash,json=validatorSetHash,proto3" json:"validator_set_hash,omitempty"` + // validator_set is the structured validator set. The signer applies the + // node's canonical sort before encoding (caller ordering is not trusted). + ValidatorSet []*BridgeValidator `protobuf:"bytes,5,rep,name=validator_set,json=validatorSet,proto3" json:"validator_set,omitempty"` + // block_height is the consensus block height (audit/context only). + BlockHeight uint64 `protobuf:"varint,6,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` + // checkpoint_index is the valset checkpoint index (audit/context only). + CheckpointIndex uint64 `protobuf:"varint,7,opt,name=checkpoint_index,json=checkpointIndex,proto3" json:"checkpoint_index,omitempty"` + // chain_id is the cosmos chain ID used to recompute the domain separator + // (mainnet => fixed "checkpoint" constant; else keccak256(abi.encode(...))). + ChainId string `protobuf:"bytes,8,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // expected_checkpoint is the 32-byte checkpoint the node computed. The signer + // recomputes the checkpoint from the structured inputs and MUST match this, + // else it returns an error and signs nothing. + ExpectedCheckpoint []byte `protobuf:"bytes,9,opt,name=expected_checkpoint,json=expectedCheckpoint,proto3" json:"expected_checkpoint,omitempty"` + // request_id is an optional caller-assigned identifier for logs. + RequestId string `protobuf:"bytes,10,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignBridgeCheckpointRequest) Reset() { + *x = SignBridgeCheckpointRequest{} + mi := &file_signer_v1_signer_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignBridgeCheckpointRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignBridgeCheckpointRequest) ProtoMessage() {} + +func (x *SignBridgeCheckpointRequest) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_proto_msgTypes[13] + 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 SignBridgeCheckpointRequest.ProtoReflect.Descriptor instead. +func (*SignBridgeCheckpointRequest) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{13} +} + +func (x *SignBridgeCheckpointRequest) GetDomainSeparator() []byte { + if x != nil { + return x.DomainSeparator + } + return nil +} + +func (x *SignBridgeCheckpointRequest) GetPowerThreshold() uint64 { + if x != nil { + return x.PowerThreshold + } + return 0 +} + +func (x *SignBridgeCheckpointRequest) GetValidatorTimestamp() uint64 { + if x != nil { + return x.ValidatorTimestamp + } + return 0 +} + +func (x *SignBridgeCheckpointRequest) GetValidatorSetHash() []byte { + if x != nil { + return x.ValidatorSetHash + } + return nil +} + +func (x *SignBridgeCheckpointRequest) GetValidatorSet() []*BridgeValidator { + if x != nil { + return x.ValidatorSet + } + return nil +} + +func (x *SignBridgeCheckpointRequest) GetBlockHeight() uint64 { + if x != nil { + return x.BlockHeight + } + return 0 +} + +func (x *SignBridgeCheckpointRequest) GetCheckpointIndex() uint64 { + if x != nil { + return x.CheckpointIndex + } + return 0 +} + +func (x *SignBridgeCheckpointRequest) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + +func (x *SignBridgeCheckpointRequest) GetExpectedCheckpoint() []byte { + if x != nil { + return x.ExpectedCheckpoint + } + return nil +} + +func (x *SignBridgeCheckpointRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +// SignBridgeCheckpointResponse contains the signature over the recomputed +// checkpoint and the checkpoint itself (for caller verification). +type SignBridgeCheckpointResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // signature is the 64-byte secp256k1 ECDSA signature (r || s) over + // sha256(checkpoint). No v byte — the chain brute-forces the recovery id. + Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` + // checkpoint is the 32-byte keccak256 checkpoint the signer recomputed and + // signed (equals expected_checkpoint on success). + Checkpoint []byte `protobuf:"bytes,2,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignBridgeCheckpointResponse) Reset() { + *x = SignBridgeCheckpointResponse{} + mi := &file_signer_v1_signer_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignBridgeCheckpointResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignBridgeCheckpointResponse) ProtoMessage() {} + +func (x *SignBridgeCheckpointResponse) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_proto_msgTypes[14] + 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 SignBridgeCheckpointResponse.ProtoReflect.Descriptor instead. +func (*SignBridgeCheckpointResponse) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{14} +} + +func (x *SignBridgeCheckpointResponse) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *SignBridgeCheckpointResponse) GetCheckpoint() []byte { + if x != nil { + return x.Checkpoint + } + return nil +} + +// SignOracleAttestationRequest carries the STRUCTURED inputs the signer needs to +// recompute the oracle-attestation snapshot locally (never a blind hash). The +// signer recomputes the snapshot via the byte-exact node encoder +// (EncodeOracleAttestationData) and MUST match expected_snapshot or fail closed. +type SignOracleAttestationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // query_id is the attestation query id. Front-aligned into a bytes32 by the + // encoder (right zero-padded if < 32 bytes); must be <= 32 bytes. + QueryId []byte `protobuf:"bytes,1,opt,name=query_id,json=queryId,proto3" json:"query_id,omitempty"` + // value is the ALREADY-HEX-DECODED report value bytes. The node computes these + // as hex.DecodeString(Remove0xPrefix(valueString)); the request carries the + // resulting raw bytes directly. The signer ABI-packs them as the dynamic + // `bytes` argument (no further decoding) — do NOT send the 0x-prefixed string. + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + // timestamp is the report aggregate timestamp (UNIX MILLISECONDS). ABI uint256. + Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // aggregate_power is the total reporter power for the aggregate. ABI uint256. + AggregatePower uint64 `protobuf:"varint,4,opt,name=aggregate_power,json=aggregatePower,proto3" json:"aggregate_power,omitempty"` + // previous_timestamp is the previous report timestamp (ms). ABI uint256. + PreviousTimestamp uint64 `protobuf:"varint,5,opt,name=previous_timestamp,json=previousTimestamp,proto3" json:"previous_timestamp,omitempty"` + // next_timestamp is the next report timestamp (ms). ABI uint256. + NextTimestamp uint64 `protobuf:"varint,6,opt,name=next_timestamp,json=nextTimestamp,proto3" json:"next_timestamp,omitempty"` + // valset_checkpoint is the 32-byte valset checkpoint. Front-aligned into a + // bytes32 by the encoder (right zero-padded if < 32 bytes); must be <= 32 bytes. + ValsetCheckpoint []byte `protobuf:"bytes,7,opt,name=valset_checkpoint,json=valsetCheckpoint,proto3" json:"valset_checkpoint,omitempty"` + // attestation_timestamp is the attestation timestamp (ms). ABI uint256. + AttestationTimestamp uint64 `protobuf:"varint,8,opt,name=attestation_timestamp,json=attestationTimestamp,proto3" json:"attestation_timestamp,omitempty"` + // last_consensus_timestamp is the last consensus timestamp (ms). ABI uint256. + LastConsensusTimestamp uint64 `protobuf:"varint,9,opt,name=last_consensus_timestamp,json=lastConsensusTimestamp,proto3" json:"last_consensus_timestamp,omitempty"` + // expected_snapshot is the 32-byte snapshot (keccak256 of the ABI-packed + // attestation data) the node computed. The signer recomputes the snapshot from + // the structured inputs and MUST match this, else it returns an error and signs + // nothing. + ExpectedSnapshot []byte `protobuf:"bytes,10,opt,name=expected_snapshot,json=expectedSnapshot,proto3" json:"expected_snapshot,omitempty"` + // request_id is an optional caller-assigned identifier for logs. + RequestId string `protobuf:"bytes,11,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignOracleAttestationRequest) Reset() { + *x = SignOracleAttestationRequest{} + mi := &file_signer_v1_signer_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignOracleAttestationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignOracleAttestationRequest) ProtoMessage() {} + +func (x *SignOracleAttestationRequest) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_proto_msgTypes[15] + 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 SignOracleAttestationRequest.ProtoReflect.Descriptor instead. +func (*SignOracleAttestationRequest) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{15} +} + +func (x *SignOracleAttestationRequest) GetQueryId() []byte { + if x != nil { + return x.QueryId + } + return nil +} + +func (x *SignOracleAttestationRequest) GetValue() []byte { + if x != nil { + return x.Value + } + return nil +} + +func (x *SignOracleAttestationRequest) GetTimestamp() uint64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *SignOracleAttestationRequest) GetAggregatePower() uint64 { + if x != nil { + return x.AggregatePower + } + return 0 +} + +func (x *SignOracleAttestationRequest) GetPreviousTimestamp() uint64 { + if x != nil { + return x.PreviousTimestamp + } + return 0 +} + +func (x *SignOracleAttestationRequest) GetNextTimestamp() uint64 { + if x != nil { + return x.NextTimestamp + } + return 0 +} + +func (x *SignOracleAttestationRequest) GetValsetCheckpoint() []byte { + if x != nil { + return x.ValsetCheckpoint + } + return nil +} + +func (x *SignOracleAttestationRequest) GetAttestationTimestamp() uint64 { + if x != nil { + return x.AttestationTimestamp + } + return 0 +} + +func (x *SignOracleAttestationRequest) GetLastConsensusTimestamp() uint64 { + if x != nil { + return x.LastConsensusTimestamp + } + return 0 +} + +func (x *SignOracleAttestationRequest) GetExpectedSnapshot() []byte { + if x != nil { + return x.ExpectedSnapshot + } + return nil +} + +func (x *SignOracleAttestationRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +// SignOracleAttestationResponse contains the signature over the recomputed +// snapshot and the snapshot itself (for caller verification). +type SignOracleAttestationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // signature is the 64-byte secp256k1 ECDSA signature (r || s) over + // sha256(snapshot). No v byte — the chain brute-forces the recovery id. + Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` + // snapshot is the 32-byte keccak256 attestation snapshot the signer recomputed + // and signed (equals expected_snapshot on success). + Snapshot []byte `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignOracleAttestationResponse) Reset() { + *x = SignOracleAttestationResponse{} + mi := &file_signer_v1_signer_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignOracleAttestationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignOracleAttestationResponse) ProtoMessage() {} + +func (x *SignOracleAttestationResponse) ProtoReflect() protoreflect.Message { + mi := &file_signer_v1_signer_proto_msgTypes[16] + 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 SignOracleAttestationResponse.ProtoReflect.Descriptor instead. +func (*SignOracleAttestationResponse) Descriptor() ([]byte, []int) { + return file_signer_v1_signer_proto_rawDescGZIP(), []int{16} +} + +func (x *SignOracleAttestationResponse) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *SignOracleAttestationResponse) GetSnapshot() []byte { + if x != nil { + return x.Snapshot + } + return nil +} + +var File_signer_v1_signer_proto protoreflect.FileDescriptor + +const file_signer_v1_signer_proto_rawDesc = "" + + "\n" + + "\x16signer/v1/signer.proto\x12\tsigner.v1\">\n" + + "\vSignRequest\x12\x10\n" + + "\x03msg\x18\x01 \x01(\fR\x03msg\x12\x1d\n" + + "\n" + + "request_id\x18\x02 \x01(\tR\trequestId\",\n" + + "\fSignResponse\x12\x1c\n" + + "\tsignature\x18\x01 \x01(\fR\tsignature\"\x15\n" + + "\x13GetPublicKeyRequest\"5\n" + + "\x14GetPublicKeyResponse\x12\x1d\n" + + "\n" + + "public_key\x18\x01 \x01(\fR\tpublicKey\"A\n" + + "\x0eSignRawRequest\x12\x10\n" + + "\x03msg\x18\x01 \x01(\fR\x03msg\x12\x1d\n" + + "\n" + + "request_id\x18\x02 \x01(\tR\trequestId\"/\n" + + "\x0fSignRawResponse\x12\x1c\n" + + "\tsignature\x18\x01 \x01(\fR\tsignature\"+\n" + + "\x11GetAddressRequest\x12\x16\n" + + "\x06prefix\x18\x01 \x01(\tR\x06prefix\".\n" + + "\x12GetAddressResponse\x12\x18\n" + + "\aaddress\x18\x01 \x01(\tR\aaddress\"I\n" + + "\rSignTxRequest\x12\x19\n" + + "\bsign_doc\x18\x01 \x01(\fR\asignDoc\x12\x1d\n" + + "\n" + + "request_id\x18\x02 \x01(\tR\trequestId\".\n" + + "\x0eSignTxResponse\x12\x1c\n" + + "\tsignature\x18\x01 \x01(\fR\tsignature\"\x13\n" + + "\x11GetChainIDRequest\"/\n" + + "\x12GetChainIDResponse\x12\x19\n" + + "\bchain_id\x18\x01 \x01(\tR\achainId\"R\n" + + "\x0fBridgeValidator\x12)\n" + + "\x10ethereum_address\x18\x01 \x01(\fR\x0fethereumAddress\x12\x14\n" + + "\x05power\x18\x02 \x01(\x04R\x05power\"\xca\x03\n" + + "\x1bSignBridgeCheckpointRequest\x12)\n" + + "\x10domain_separator\x18\x01 \x01(\fR\x0fdomainSeparator\x12'\n" + + "\x0fpower_threshold\x18\x02 \x01(\x04R\x0epowerThreshold\x12/\n" + + "\x13validator_timestamp\x18\x03 \x01(\x04R\x12validatorTimestamp\x12,\n" + + "\x12validator_set_hash\x18\x04 \x01(\fR\x10validatorSetHash\x12?\n" + + "\rvalidator_set\x18\x05 \x03(\v2\x1a.signer.v1.BridgeValidatorR\fvalidatorSet\x12!\n" + + "\fblock_height\x18\x06 \x01(\x04R\vblockHeight\x12)\n" + + "\x10checkpoint_index\x18\a \x01(\x04R\x0fcheckpointIndex\x12\x19\n" + + "\bchain_id\x18\b \x01(\tR\achainId\x12/\n" + + "\x13expected_checkpoint\x18\t \x01(\fR\x12expectedCheckpoint\x12\x1d\n" + + "\n" + + "request_id\x18\n" + + " \x01(\tR\trequestId\"\\\n" + + "\x1cSignBridgeCheckpointResponse\x12\x1c\n" + + "\tsignature\x18\x01 \x01(\fR\tsignature\x12\x1e\n" + + "\n" + + "checkpoint\x18\x02 \x01(\fR\n" + + "checkpoint\"\xd4\x03\n" + + "\x1cSignOracleAttestationRequest\x12\x19\n" + + "\bquery_id\x18\x01 \x01(\fR\aqueryId\x12\x14\n" + + "\x05value\x18\x02 \x01(\fR\x05value\x12\x1c\n" + + "\ttimestamp\x18\x03 \x01(\x04R\ttimestamp\x12'\n" + + "\x0faggregate_power\x18\x04 \x01(\x04R\x0eaggregatePower\x12-\n" + + "\x12previous_timestamp\x18\x05 \x01(\x04R\x11previousTimestamp\x12%\n" + + "\x0enext_timestamp\x18\x06 \x01(\x04R\rnextTimestamp\x12+\n" + + "\x11valset_checkpoint\x18\a \x01(\fR\x10valsetCheckpoint\x123\n" + + "\x15attestation_timestamp\x18\b \x01(\x04R\x14attestationTimestamp\x128\n" + + "\x18last_consensus_timestamp\x18\t \x01(\x04R\x16lastConsensusTimestamp\x12+\n" + + "\x11expected_snapshot\x18\n" + + " \x01(\fR\x10expectedSnapshot\x12\x1d\n" + + "\n" + + "request_id\x18\v \x01(\tR\trequestId\"Y\n" + + "\x1dSignOracleAttestationResponse\x12\x1c\n" + + "\tsignature\x18\x01 \x01(\fR\tsignature\x12\x1a\n" + + "\bsnapshot\x18\x02 \x01(\fR\bsnapshot2\x84\x05\n" + + "\fBridgeSigner\x127\n" + + "\x04Sign\x12\x16.signer.v1.SignRequest\x1a\x17.signer.v1.SignResponse\x12O\n" + + "\fGetPublicKey\x12\x1e.signer.v1.GetPublicKeyRequest\x1a\x1f.signer.v1.GetPublicKeyResponse\x12@\n" + + "\aSignRaw\x12\x19.signer.v1.SignRawRequest\x1a\x1a.signer.v1.SignRawResponse\x12I\n" + + "\n" + + "GetAddress\x12\x1c.signer.v1.GetAddressRequest\x1a\x1d.signer.v1.GetAddressResponse\x12=\n" + + "\x06SignTx\x12\x18.signer.v1.SignTxRequest\x1a\x19.signer.v1.SignTxResponse\x12I\n" + + "\n" + + "GetChainID\x12\x1c.signer.v1.GetChainIDRequest\x1a\x1d.signer.v1.GetChainIDResponse\x12g\n" + + "\x14SignBridgeCheckpoint\x12&.signer.v1.SignBridgeCheckpointRequest\x1a'.signer.v1.SignBridgeCheckpointResponse\x12j\n" + + "\x15SignOracleAttestation\x12'.signer.v1.SignOracleAttestationRequest\x1a(.signer.v1.SignOracleAttestationResponseB?Z=github.com/tellor-io/bridge-signer/api/gen/signer/v1;signerv1b\x06proto3" + +var ( + file_signer_v1_signer_proto_rawDescOnce sync.Once + file_signer_v1_signer_proto_rawDescData []byte +) + +func file_signer_v1_signer_proto_rawDescGZIP() []byte { + file_signer_v1_signer_proto_rawDescOnce.Do(func() { + file_signer_v1_signer_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_signer_v1_signer_proto_rawDesc), len(file_signer_v1_signer_proto_rawDesc))) + }) + return file_signer_v1_signer_proto_rawDescData +} + +var file_signer_v1_signer_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_signer_v1_signer_proto_goTypes = []any{ + (*SignRequest)(nil), // 0: signer.v1.SignRequest + (*SignResponse)(nil), // 1: signer.v1.SignResponse + (*GetPublicKeyRequest)(nil), // 2: signer.v1.GetPublicKeyRequest + (*GetPublicKeyResponse)(nil), // 3: signer.v1.GetPublicKeyResponse + (*SignRawRequest)(nil), // 4: signer.v1.SignRawRequest + (*SignRawResponse)(nil), // 5: signer.v1.SignRawResponse + (*GetAddressRequest)(nil), // 6: signer.v1.GetAddressRequest + (*GetAddressResponse)(nil), // 7: signer.v1.GetAddressResponse + (*SignTxRequest)(nil), // 8: signer.v1.SignTxRequest + (*SignTxResponse)(nil), // 9: signer.v1.SignTxResponse + (*GetChainIDRequest)(nil), // 10: signer.v1.GetChainIDRequest + (*GetChainIDResponse)(nil), // 11: signer.v1.GetChainIDResponse + (*BridgeValidator)(nil), // 12: signer.v1.BridgeValidator + (*SignBridgeCheckpointRequest)(nil), // 13: signer.v1.SignBridgeCheckpointRequest + (*SignBridgeCheckpointResponse)(nil), // 14: signer.v1.SignBridgeCheckpointResponse + (*SignOracleAttestationRequest)(nil), // 15: signer.v1.SignOracleAttestationRequest + (*SignOracleAttestationResponse)(nil), // 16: signer.v1.SignOracleAttestationResponse +} +var file_signer_v1_signer_proto_depIdxs = []int32{ + 12, // 0: signer.v1.SignBridgeCheckpointRequest.validator_set:type_name -> signer.v1.BridgeValidator + 0, // 1: signer.v1.BridgeSigner.Sign:input_type -> signer.v1.SignRequest + 2, // 2: signer.v1.BridgeSigner.GetPublicKey:input_type -> signer.v1.GetPublicKeyRequest + 4, // 3: signer.v1.BridgeSigner.SignRaw:input_type -> signer.v1.SignRawRequest + 6, // 4: signer.v1.BridgeSigner.GetAddress:input_type -> signer.v1.GetAddressRequest + 8, // 5: signer.v1.BridgeSigner.SignTx:input_type -> signer.v1.SignTxRequest + 10, // 6: signer.v1.BridgeSigner.GetChainID:input_type -> signer.v1.GetChainIDRequest + 13, // 7: signer.v1.BridgeSigner.SignBridgeCheckpoint:input_type -> signer.v1.SignBridgeCheckpointRequest + 15, // 8: signer.v1.BridgeSigner.SignOracleAttestation:input_type -> signer.v1.SignOracleAttestationRequest + 1, // 9: signer.v1.BridgeSigner.Sign:output_type -> signer.v1.SignResponse + 3, // 10: signer.v1.BridgeSigner.GetPublicKey:output_type -> signer.v1.GetPublicKeyResponse + 5, // 11: signer.v1.BridgeSigner.SignRaw:output_type -> signer.v1.SignRawResponse + 7, // 12: signer.v1.BridgeSigner.GetAddress:output_type -> signer.v1.GetAddressResponse + 9, // 13: signer.v1.BridgeSigner.SignTx:output_type -> signer.v1.SignTxResponse + 11, // 14: signer.v1.BridgeSigner.GetChainID:output_type -> signer.v1.GetChainIDResponse + 14, // 15: signer.v1.BridgeSigner.SignBridgeCheckpoint:output_type -> signer.v1.SignBridgeCheckpointResponse + 16, // 16: signer.v1.BridgeSigner.SignOracleAttestation:output_type -> signer.v1.SignOracleAttestationResponse + 9, // [9:17] is the sub-list for method output_type + 1, // [1:9] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_signer_v1_signer_proto_init() } +func file_signer_v1_signer_proto_init() { + if File_signer_v1_signer_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_signer_v1_signer_proto_rawDesc), len(file_signer_v1_signer_proto_rawDesc)), + NumEnums: 0, + NumMessages: 17, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_signer_v1_signer_proto_goTypes, + DependencyIndexes: file_signer_v1_signer_proto_depIdxs, + MessageInfos: file_signer_v1_signer_proto_msgTypes, + }.Build() + File_signer_v1_signer_proto = out.File + file_signer_v1_signer_proto_goTypes = nil + file_signer_v1_signer_proto_depIdxs = nil +} diff --git a/vendor-api/gen/signer/v1/signer_grpc.pb.go b/vendor-api/gen/signer/v1/signer_grpc.pb.go new file mode 100644 index 000000000..122af69da --- /dev/null +++ b/vendor-api/gen/signer/v1/signer_grpc.pb.go @@ -0,0 +1,461 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.6.2 +// - protoc v3.21.12 +// source: signer/v1/signer.proto + +package signerv1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + BridgeSigner_Sign_FullMethodName = "/signer.v1.BridgeSigner/Sign" + BridgeSigner_GetPublicKey_FullMethodName = "/signer.v1.BridgeSigner/GetPublicKey" + BridgeSigner_SignRaw_FullMethodName = "/signer.v1.BridgeSigner/SignRaw" + BridgeSigner_GetAddress_FullMethodName = "/signer.v1.BridgeSigner/GetAddress" + BridgeSigner_SignTx_FullMethodName = "/signer.v1.BridgeSigner/SignTx" + BridgeSigner_GetChainID_FullMethodName = "/signer.v1.BridgeSigner/GetChainID" + BridgeSigner_SignBridgeCheckpoint_FullMethodName = "/signer.v1.BridgeSigner/SignBridgeCheckpoint" + BridgeSigner_SignOracleAttestation_FullMethodName = "/signer.v1.BridgeSigner/SignOracleAttestation" +) + +// BridgeSignerClient is the client API for BridgeSigner service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// BridgeSigner is the signing service exposed by the sidecar. +// The validator calls this during ExtendVoteHandler to sign +// oracle attestations and valset checkpoints. +type BridgeSignerClient interface { + // Sign signs the given message bytes with the secp256k1 bridge key + // and returns a 65-byte ECDSA signature (r || s || v). + // msg must be exactly 32 bytes (a hash). + // v is 27 or 28, compatible with Ethereum ecrecover. + Sign(ctx context.Context, in *SignRequest, opts ...grpc.CallOption) (*SignResponse, error) + // GetPublicKey returns the compressed 33-byte secp256k1 public key. + // Helps the node to derive the operator address. + GetPublicKey(ctx context.Context, in *GetPublicKeyRequest, opts ...grpc.CallOption) (*GetPublicKeyResponse, error) + // SignRaw signs the given 32-byte hash directly (no extra hashing). + // Returns a 64-byte secp256k1 signature (r || s), compatible with + // Cosmos SDK transaction signing. Used by the reporter to sign txs + // without a local keyring. + SignRaw(ctx context.Context, in *SignRawRequest, opts ...grpc.CallOption) (*SignRawResponse, error) + // GetAddress derives the bech32 address from the signer's public key + // using the given prefix (e.g. "tellor"). Allows the reporter to + // discover its own address without hard-coding it in config. + GetAddress(ctx context.Context, in *GetAddressRequest, opts ...grpc.CallOption) (*GetAddressResponse, error) + // SignTx accepts raw Cosmos SignDoc bytes, validates that every message + // type_url is on the server's allowlist, then signs with the secp256k1 + // key. Returns a 64-byte r||s signature (no v byte). + // Rejects with PERMISSION_DENIED if any message type is not allowed. + SignTx(ctx context.Context, in *SignTxRequest, opts ...grpc.CallOption) (*SignTxResponse, error) + // GetChainID returns the cosmos chain ID the signer is configured for, + // so callers (e.g. the monitor) can discover it without a local env var. + GetChainID(ctx context.Context, in *GetChainIDRequest, opts ...grpc.CallOption) (*GetChainIDResponse, error) + // SignBridgeCheckpoint accepts the STRUCTURED valset-checkpoint inputs + // (not a blind hash), recomputes the checkpoint itself using the byte-exact + // node encoder, validates it against the caller-supplied expected_checkpoint, + // enforces self-membership + a monotonic replay guard, then signs + // sha256(checkpoint) with the secp256k1 key. Returns a 64-byte r||s signature + // (no v byte) — the chain consumer brute-forces the recovery id itself. + // FAILS CLOSED (signs nothing) on any mismatch. + SignBridgeCheckpoint(ctx context.Context, in *SignBridgeCheckpointRequest, opts ...grpc.CallOption) (*SignBridgeCheckpointResponse, error) + // SignOracleAttestation accepts the STRUCTURED oracle-attestation inputs (not a + // blind hash), recomputes the attestation snapshot itself using the byte-exact + // node encoder (EncodeOracleAttestationData), validates it against the + // caller-supplied expected_snapshot, then signs sha256(snapshot) with the + // secp256k1 key. Returns a 64-byte r||s signature (no v byte) — the chain + // consumer brute-forces the recovery id itself. FAILS CLOSED (signs nothing) + // on any mismatch. + SignOracleAttestation(ctx context.Context, in *SignOracleAttestationRequest, opts ...grpc.CallOption) (*SignOracleAttestationResponse, error) +} + +type bridgeSignerClient struct { + cc grpc.ClientConnInterface +} + +func NewBridgeSignerClient(cc grpc.ClientConnInterface) BridgeSignerClient { + return &bridgeSignerClient{cc} +} + +func (c *bridgeSignerClient) Sign(ctx context.Context, in *SignRequest, opts ...grpc.CallOption) (*SignResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SignResponse) + err := c.cc.Invoke(ctx, BridgeSigner_Sign_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bridgeSignerClient) GetPublicKey(ctx context.Context, in *GetPublicKeyRequest, opts ...grpc.CallOption) (*GetPublicKeyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetPublicKeyResponse) + err := c.cc.Invoke(ctx, BridgeSigner_GetPublicKey_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bridgeSignerClient) SignRaw(ctx context.Context, in *SignRawRequest, opts ...grpc.CallOption) (*SignRawResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SignRawResponse) + err := c.cc.Invoke(ctx, BridgeSigner_SignRaw_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bridgeSignerClient) GetAddress(ctx context.Context, in *GetAddressRequest, opts ...grpc.CallOption) (*GetAddressResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetAddressResponse) + err := c.cc.Invoke(ctx, BridgeSigner_GetAddress_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bridgeSignerClient) SignTx(ctx context.Context, in *SignTxRequest, opts ...grpc.CallOption) (*SignTxResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SignTxResponse) + err := c.cc.Invoke(ctx, BridgeSigner_SignTx_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bridgeSignerClient) GetChainID(ctx context.Context, in *GetChainIDRequest, opts ...grpc.CallOption) (*GetChainIDResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetChainIDResponse) + err := c.cc.Invoke(ctx, BridgeSigner_GetChainID_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bridgeSignerClient) SignBridgeCheckpoint(ctx context.Context, in *SignBridgeCheckpointRequest, opts ...grpc.CallOption) (*SignBridgeCheckpointResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SignBridgeCheckpointResponse) + err := c.cc.Invoke(ctx, BridgeSigner_SignBridgeCheckpoint_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bridgeSignerClient) SignOracleAttestation(ctx context.Context, in *SignOracleAttestationRequest, opts ...grpc.CallOption) (*SignOracleAttestationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SignOracleAttestationResponse) + err := c.cc.Invoke(ctx, BridgeSigner_SignOracleAttestation_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// BridgeSignerServer is the server API for BridgeSigner service. +// All implementations must embed UnimplementedBridgeSignerServer +// for forward compatibility. +// +// BridgeSigner is the signing service exposed by the sidecar. +// The validator calls this during ExtendVoteHandler to sign +// oracle attestations and valset checkpoints. +type BridgeSignerServer interface { + // Sign signs the given message bytes with the secp256k1 bridge key + // and returns a 65-byte ECDSA signature (r || s || v). + // msg must be exactly 32 bytes (a hash). + // v is 27 or 28, compatible with Ethereum ecrecover. + Sign(context.Context, *SignRequest) (*SignResponse, error) + // GetPublicKey returns the compressed 33-byte secp256k1 public key. + // Helps the node to derive the operator address. + GetPublicKey(context.Context, *GetPublicKeyRequest) (*GetPublicKeyResponse, error) + // SignRaw signs the given 32-byte hash directly (no extra hashing). + // Returns a 64-byte secp256k1 signature (r || s), compatible with + // Cosmos SDK transaction signing. Used by the reporter to sign txs + // without a local keyring. + SignRaw(context.Context, *SignRawRequest) (*SignRawResponse, error) + // GetAddress derives the bech32 address from the signer's public key + // using the given prefix (e.g. "tellor"). Allows the reporter to + // discover its own address without hard-coding it in config. + GetAddress(context.Context, *GetAddressRequest) (*GetAddressResponse, error) + // SignTx accepts raw Cosmos SignDoc bytes, validates that every message + // type_url is on the server's allowlist, then signs with the secp256k1 + // key. Returns a 64-byte r||s signature (no v byte). + // Rejects with PERMISSION_DENIED if any message type is not allowed. + SignTx(context.Context, *SignTxRequest) (*SignTxResponse, error) + // GetChainID returns the cosmos chain ID the signer is configured for, + // so callers (e.g. the monitor) can discover it without a local env var. + GetChainID(context.Context, *GetChainIDRequest) (*GetChainIDResponse, error) + // SignBridgeCheckpoint accepts the STRUCTURED valset-checkpoint inputs + // (not a blind hash), recomputes the checkpoint itself using the byte-exact + // node encoder, validates it against the caller-supplied expected_checkpoint, + // enforces self-membership + a monotonic replay guard, then signs + // sha256(checkpoint) with the secp256k1 key. Returns a 64-byte r||s signature + // (no v byte) — the chain consumer brute-forces the recovery id itself. + // FAILS CLOSED (signs nothing) on any mismatch. + SignBridgeCheckpoint(context.Context, *SignBridgeCheckpointRequest) (*SignBridgeCheckpointResponse, error) + // SignOracleAttestation accepts the STRUCTURED oracle-attestation inputs (not a + // blind hash), recomputes the attestation snapshot itself using the byte-exact + // node encoder (EncodeOracleAttestationData), validates it against the + // caller-supplied expected_snapshot, then signs sha256(snapshot) with the + // secp256k1 key. Returns a 64-byte r||s signature (no v byte) — the chain + // consumer brute-forces the recovery id itself. FAILS CLOSED (signs nothing) + // on any mismatch. + SignOracleAttestation(context.Context, *SignOracleAttestationRequest) (*SignOracleAttestationResponse, error) + mustEmbedUnimplementedBridgeSignerServer() +} + +// UnimplementedBridgeSignerServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedBridgeSignerServer struct{} + +func (UnimplementedBridgeSignerServer) Sign(context.Context, *SignRequest) (*SignResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Sign not implemented") +} +func (UnimplementedBridgeSignerServer) GetPublicKey(context.Context, *GetPublicKeyRequest) (*GetPublicKeyResponse, error) { + return nil, status.Error(codes.Unimplemented, "method GetPublicKey not implemented") +} +func (UnimplementedBridgeSignerServer) SignRaw(context.Context, *SignRawRequest) (*SignRawResponse, error) { + return nil, status.Error(codes.Unimplemented, "method SignRaw not implemented") +} +func (UnimplementedBridgeSignerServer) GetAddress(context.Context, *GetAddressRequest) (*GetAddressResponse, error) { + return nil, status.Error(codes.Unimplemented, "method GetAddress not implemented") +} +func (UnimplementedBridgeSignerServer) SignTx(context.Context, *SignTxRequest) (*SignTxResponse, error) { + return nil, status.Error(codes.Unimplemented, "method SignTx not implemented") +} +func (UnimplementedBridgeSignerServer) GetChainID(context.Context, *GetChainIDRequest) (*GetChainIDResponse, error) { + return nil, status.Error(codes.Unimplemented, "method GetChainID not implemented") +} +func (UnimplementedBridgeSignerServer) SignBridgeCheckpoint(context.Context, *SignBridgeCheckpointRequest) (*SignBridgeCheckpointResponse, error) { + return nil, status.Error(codes.Unimplemented, "method SignBridgeCheckpoint not implemented") +} +func (UnimplementedBridgeSignerServer) SignOracleAttestation(context.Context, *SignOracleAttestationRequest) (*SignOracleAttestationResponse, error) { + return nil, status.Error(codes.Unimplemented, "method SignOracleAttestation not implemented") +} +func (UnimplementedBridgeSignerServer) mustEmbedUnimplementedBridgeSignerServer() {} +func (UnimplementedBridgeSignerServer) testEmbeddedByValue() {} + +// UnsafeBridgeSignerServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to BridgeSignerServer will +// result in compilation errors. +type UnsafeBridgeSignerServer interface { + mustEmbedUnimplementedBridgeSignerServer() +} + +func RegisterBridgeSignerServer(s grpc.ServiceRegistrar, srv BridgeSignerServer) { + // If the following call panics, it indicates UnimplementedBridgeSignerServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&BridgeSigner_ServiceDesc, srv) +} + +func _BridgeSigner_Sign_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SignRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BridgeSignerServer).Sign(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BridgeSigner_Sign_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BridgeSignerServer).Sign(ctx, req.(*SignRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BridgeSigner_GetPublicKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetPublicKeyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BridgeSignerServer).GetPublicKey(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BridgeSigner_GetPublicKey_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BridgeSignerServer).GetPublicKey(ctx, req.(*GetPublicKeyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BridgeSigner_SignRaw_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SignRawRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BridgeSignerServer).SignRaw(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BridgeSigner_SignRaw_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BridgeSignerServer).SignRaw(ctx, req.(*SignRawRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BridgeSigner_GetAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAddressRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BridgeSignerServer).GetAddress(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BridgeSigner_GetAddress_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BridgeSignerServer).GetAddress(ctx, req.(*GetAddressRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BridgeSigner_SignTx_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SignTxRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BridgeSignerServer).SignTx(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BridgeSigner_SignTx_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BridgeSignerServer).SignTx(ctx, req.(*SignTxRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BridgeSigner_GetChainID_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetChainIDRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BridgeSignerServer).GetChainID(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BridgeSigner_GetChainID_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BridgeSignerServer).GetChainID(ctx, req.(*GetChainIDRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BridgeSigner_SignBridgeCheckpoint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SignBridgeCheckpointRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BridgeSignerServer).SignBridgeCheckpoint(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BridgeSigner_SignBridgeCheckpoint_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BridgeSignerServer).SignBridgeCheckpoint(ctx, req.(*SignBridgeCheckpointRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BridgeSigner_SignOracleAttestation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SignOracleAttestationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BridgeSignerServer).SignOracleAttestation(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BridgeSigner_SignOracleAttestation_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BridgeSignerServer).SignOracleAttestation(ctx, req.(*SignOracleAttestationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// BridgeSigner_ServiceDesc is the grpc.ServiceDesc for BridgeSigner service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var BridgeSigner_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "signer.v1.BridgeSigner", + HandlerType: (*BridgeSignerServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Sign", + Handler: _BridgeSigner_Sign_Handler, + }, + { + MethodName: "GetPublicKey", + Handler: _BridgeSigner_GetPublicKey_Handler, + }, + { + MethodName: "SignRaw", + Handler: _BridgeSigner_SignRaw_Handler, + }, + { + MethodName: "GetAddress", + Handler: _BridgeSigner_GetAddress_Handler, + }, + { + MethodName: "SignTx", + Handler: _BridgeSigner_SignTx_Handler, + }, + { + MethodName: "GetChainID", + Handler: _BridgeSigner_GetChainID_Handler, + }, + { + MethodName: "SignBridgeCheckpoint", + Handler: _BridgeSigner_SignBridgeCheckpoint_Handler, + }, + { + MethodName: "SignOracleAttestation", + Handler: _BridgeSigner_SignOracleAttestation_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "signer/v1/signer.proto", +} diff --git a/vendor-api/go.mod b/vendor-api/go.mod new file mode 100644 index 000000000..432d91140 --- /dev/null +++ b/vendor-api/go.mod @@ -0,0 +1,15 @@ +module github.com/tellor-io/bridge-remote-signer/api + +go 1.23.2 + +require ( + google.golang.org/grpc v1.79.3 + google.golang.org/protobuf v1.36.11 +) + +require ( + golang.org/x/net v0.48.0 // indirect + golang.org/x/sys v0.39.0 // indirect + golang.org/x/text v0.32.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect +) diff --git a/vendor-api/go.sum b/vendor-api/go.sum new file mode 100644 index 000000000..d705bc9b7 --- /dev/null +++ b/vendor-api/go.sum @@ -0,0 +1,38 @@ +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/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/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +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= +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.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= +go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= +go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= +go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= +go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= +go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= +go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= +go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= +go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= +go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= diff --git a/vendor-api/proto/signer/v1/signer.proto b/vendor-api/proto/signer/v1/signer.proto new file mode 100644 index 000000000..28fdc0646 --- /dev/null +++ b/vendor-api/proto/signer/v1/signer.proto @@ -0,0 +1,262 @@ +syntax = "proto3"; + +package signer.v1; + +option go_package = "github.com/tellor-io/bridge-signer/api/gen/signer/v1;signerv1"; + +// BridgeSigner is the signing service exposed by the sidecar. +// The validator calls this during ExtendVoteHandler to sign +// oracle attestations and valset checkpoints. +service BridgeSigner { + // Sign signs the given message bytes with the secp256k1 bridge key + // and returns a 65-byte ECDSA signature (r || s || v). + // msg must be exactly 32 bytes (a hash). + // v is 27 or 28, compatible with Ethereum ecrecover. + rpc Sign(SignRequest) returns (SignResponse); + + // GetPublicKey returns the compressed 33-byte secp256k1 public key. + // Helps the node to derive the operator address. + rpc GetPublicKey(GetPublicKeyRequest) returns (GetPublicKeyResponse); + + // SignRaw signs the given 32-byte hash directly (no extra hashing). + // Returns a 64-byte secp256k1 signature (r || s), compatible with + // Cosmos SDK transaction signing. Used by the reporter to sign txs + // without a local keyring. + rpc SignRaw(SignRawRequest) returns (SignRawResponse); + + // GetAddress derives the bech32 address from the signer's public key + // using the given prefix (e.g. "tellor"). Allows the reporter to + // discover its own address without hard-coding it in config. + rpc GetAddress(GetAddressRequest) returns (GetAddressResponse); + + // SignTx accepts raw Cosmos SignDoc bytes, validates that every message + // type_url is on the server's allowlist, then signs with the secp256k1 + // key. Returns a 64-byte r||s signature (no v byte). + // Rejects with PERMISSION_DENIED if any message type is not allowed. + rpc SignTx(SignTxRequest) returns (SignTxResponse); + + // GetChainID returns the cosmos chain ID the signer is configured for, + // so callers (e.g. the monitor) can discover it without a local env var. + rpc GetChainID(GetChainIDRequest) returns (GetChainIDResponse); + + // SignBridgeCheckpoint accepts the STRUCTURED valset-checkpoint inputs + // (not a blind hash), recomputes the checkpoint itself using the byte-exact + // node encoder, validates it against the caller-supplied expected_checkpoint, + // enforces self-membership + a monotonic replay guard, then signs + // sha256(checkpoint) with the secp256k1 key. Returns a 64-byte r||s signature + // (no v byte) — the chain consumer brute-forces the recovery id itself. + // FAILS CLOSED (signs nothing) on any mismatch. + rpc SignBridgeCheckpoint(SignBridgeCheckpointRequest) returns (SignBridgeCheckpointResponse); + + // SignOracleAttestation accepts the STRUCTURED oracle-attestation inputs (not a + // blind hash), recomputes the attestation snapshot itself using the byte-exact + // node encoder (EncodeOracleAttestationData), validates it against the + // caller-supplied expected_snapshot, then signs sha256(snapshot) with the + // secp256k1 key. Returns a 64-byte r||s signature (no v byte) — the chain + // consumer brute-forces the recovery id itself. FAILS CLOSED (signs nothing) + // on any mismatch. + rpc SignOracleAttestation(SignOracleAttestationRequest) returns (SignOracleAttestationResponse); +} + +// SignRequest is the signing request sent by the validator. +message SignRequest { + // msg is the raw bytes to sign. Must be exactly 32 bytes. + bytes msg = 1; + + // request_id is an optional caller-assigned identifier for logs. + string request_id = 2; +} + +// SignResponse contains the resulting signature. +message SignResponse { + // signature is the 65-byte secp256k1 ECDSA signature (r || s || v). + // Compatible with Ethereum's ecrecover, v is 27 or 28. + bytes signature = 1; +} + +// GetPublicKeyRequest +message GetPublicKeyRequest {} + +// GetPublicKeyResponse contains the public key. +message GetPublicKeyResponse { + // public_key is the compressed 33-byte secp256k1 public key. + // The validator uses this to derive the bech32 operator address + // and the Ethereum address for bridge contract verification. + bytes public_key = 1; +} +// SignRawRequest is the request for raw cosmos-compatible signing. +message SignRawRequest { + // msg is the 32-byte hash to sign directly (no additional hashing). + bytes msg = 1; + + // request_id is an optional caller-assigned identifier for logs. + string request_id = 2; +} + +// SignRawResponse contains the resulting cosmos-format signature. +message SignRawResponse { + // signature is the 64-byte secp256k1 ECDSA signature (r || s). + // Compatible with Cosmos SDK tx signing (no v byte). + bytes signature = 1; +} + +// GetAddressRequest specifies the bech32 prefix to use. +message GetAddressRequest { + // prefix is the bech32 human-readable part (e.g. "tellor"). + string prefix = 1; +} + +// GetAddressResponse contains the derived bech32 address. +message GetAddressResponse { + // address is the bech32-encoded account address (e.g. "tellor1..."). + string address = 1; +} + +// SignTxRequest carries raw Cosmos SignDoc bytes for scope-checked signing. +message SignTxRequest { + // sign_doc is the raw protobuf-encoded cosmos.tx.v1beta1.SignDoc bytes + // (the exact bytes that will be sha256-hashed and signed). + bytes sign_doc = 1; + + // request_id is an optional caller-assigned identifier for logs. + string request_id = 2; +} + +// SignTxResponse contains the resulting cosmos-format signature. +message SignTxResponse { + // signature is the 64-byte secp256k1 ECDSA signature (r || s). + bytes signature = 1; +} + +// GetChainIDRequest +message GetChainIDRequest {} + +// GetChainIDResponse contains the configured chain ID. +message GetChainIDResponse { + // chain_id is the cosmos chain ID (e.g. "layertest-5"). + string chain_id = 1; +} + +// BridgeValidator is a single entry of the bridge validator set, mirroring the +// node's x/bridge types.BridgeValidator. The signer re-sorts and re-encodes the +// set itself; caller ordering is not trusted. +message BridgeValidator { + // ethereum_address is the raw 20-byte EVM address of the validator. + bytes ethereum_address = 1; + + // power is the validator's bridge voting power. + uint64 power = 2; +} + +// SignBridgeCheckpointRequest carries the STRUCTURED inputs the signer needs to +// recompute the valset checkpoint locally (never a blind hash). The signer +// recomputes the checkpoint and must match expected_checkpoint or fail closed. +message SignBridgeCheckpointRequest { + // domain_separator is the 32-byte checkpoint domain separator the node + // computed. The signer independently recomputes it from chain_id and asserts + // equality. + bytes domain_separator = 1; + + // power_threshold is sum(powers)*2/3 (node integer math). Re-derived + checked. + uint64 power_threshold = 2; + + // validator_timestamp is the valset timestamp in UNIX MILLISECONDS. + uint64 validator_timestamp = 3; + + // validator_set_hash is the node-computed keccak256 hash of the encoded + // validator set. The signer recomputes it and asserts equality. + bytes validator_set_hash = 4; + + // validator_set is the structured validator set. The signer applies the + // node's canonical sort before encoding (caller ordering is not trusted). + repeated BridgeValidator validator_set = 5; + + // block_height is the consensus block height (audit/context only). + uint64 block_height = 6; + + // checkpoint_index is the valset checkpoint index (audit/context only). + uint64 checkpoint_index = 7; + + // chain_id is the cosmos chain ID used to recompute the domain separator + // (mainnet => fixed "checkpoint" constant; else keccak256(abi.encode(...))). + string chain_id = 8; + + // expected_checkpoint is the 32-byte checkpoint the node computed. The signer + // recomputes the checkpoint from the structured inputs and MUST match this, + // else it returns an error and signs nothing. + bytes expected_checkpoint = 9; + + // request_id is an optional caller-assigned identifier for logs. + string request_id = 10; +} + +// SignBridgeCheckpointResponse contains the signature over the recomputed +// checkpoint and the checkpoint itself (for caller verification). +message SignBridgeCheckpointResponse { + // signature is the 64-byte secp256k1 ECDSA signature (r || s) over + // sha256(checkpoint). No v byte — the chain brute-forces the recovery id. + bytes signature = 1; + + // checkpoint is the 32-byte keccak256 checkpoint the signer recomputed and + // signed (equals expected_checkpoint on success). + bytes checkpoint = 2; +} + +// SignOracleAttestationRequest carries the STRUCTURED inputs the signer needs to +// recompute the oracle-attestation snapshot locally (never a blind hash). The +// signer recomputes the snapshot via the byte-exact node encoder +// (EncodeOracleAttestationData) and MUST match expected_snapshot or fail closed. +message SignOracleAttestationRequest { + // query_id is the attestation query id. Front-aligned into a bytes32 by the + // encoder (right zero-padded if < 32 bytes); must be <= 32 bytes. + bytes query_id = 1; + + // value is the ALREADY-HEX-DECODED report value bytes. The node computes these + // as hex.DecodeString(Remove0xPrefix(valueString)); the request carries the + // resulting raw bytes directly. The signer ABI-packs them as the dynamic + // `bytes` argument (no further decoding) — do NOT send the 0x-prefixed string. + bytes value = 2; + + // timestamp is the report aggregate timestamp (UNIX MILLISECONDS). ABI uint256. + uint64 timestamp = 3; + + // aggregate_power is the total reporter power for the aggregate. ABI uint256. + uint64 aggregate_power = 4; + + // previous_timestamp is the previous report timestamp (ms). ABI uint256. + uint64 previous_timestamp = 5; + + // next_timestamp is the next report timestamp (ms). ABI uint256. + uint64 next_timestamp = 6; + + // valset_checkpoint is the 32-byte valset checkpoint. Front-aligned into a + // bytes32 by the encoder (right zero-padded if < 32 bytes); must be <= 32 bytes. + bytes valset_checkpoint = 7; + + // attestation_timestamp is the attestation timestamp (ms). ABI uint256. + uint64 attestation_timestamp = 8; + + // last_consensus_timestamp is the last consensus timestamp (ms). ABI uint256. + uint64 last_consensus_timestamp = 9; + + // expected_snapshot is the 32-byte snapshot (keccak256 of the ABI-packed + // attestation data) the node computed. The signer recomputes the snapshot from + // the structured inputs and MUST match this, else it returns an error and signs + // nothing. + bytes expected_snapshot = 10; + + // request_id is an optional caller-assigned identifier for logs. + string request_id = 11; +} + +// SignOracleAttestationResponse contains the signature over the recomputed +// snapshot and the snapshot itself (for caller verification). +message SignOracleAttestationResponse { + // signature is the 64-byte secp256k1 ECDSA signature (r || s) over + // sha256(snapshot). No v byte — the chain brute-forces the recovery id. + bytes signature = 1; + + // snapshot is the 32-byte keccak256 attestation snapshot the signer recomputed + // and signed (equals expected_snapshot on success). + bytes snapshot = 2; +} diff --git a/vendor-api/tls/tls.go b/vendor-api/tls/tls.go new file mode 100644 index 000000000..df95064fd --- /dev/null +++ b/vendor-api/tls/tls.go @@ -0,0 +1,91 @@ +package tls + +import ( + "crypto/tls" + "crypto/x509" + "errors" + "fmt" + "os" + + "google.golang.org/grpc/credentials" +) + +// NewServerCredentials builds gRPC transport credentials for the sidecar server. +// Enforces mutual TLS — any client that cannot present a certificate signed by +// the CA is rejected at the TLS handshake before any RPC is processed. +func NewServerCredentials(caCertPath, serverCertPath, serverKeyPath string) (credentials.TransportCredentials, error) { + // Load the sidecar's own certificate and key. + serverCert, err := tls.LoadX509KeyPair(serverCertPath, serverKeyPath) + if err != nil { + return nil, fmt.Errorf("failed to load server cert/key pair: %w", err) + } + + // Load the CA certificate to verify client certificates. + caPool, err := loadCACert(caCertPath) + if err != nil { + return nil, fmt.Errorf("failed to load CA cert: %w", err) + } + + tlsCfg := &tls.Config{ + // Present sidecar certificate to the client. + Certificates: []tls.Certificate{serverCert}, + + // Require and verify the client's certificate. + // RequireAndVerifyClientCert means the handshake fails if the client + // presents no cert or a cert not signed by the CA. + ClientAuth: tls.RequireAndVerifyClientCert, + ClientCAs: caPool, + + // Minimum TLS 1.3 doesn't allow lower versions to work + MinVersion: tls.VersionTLS13, + } + + return credentials.NewTLS(tlsCfg), nil +} + +// NewClientCredentials builds gRPC transport credentials for the validator (client) side. +// The validator presents its client certificate to the sidecar for authentication. +func NewClientCredentials(caCertPath, clientCertPath, clientKeyPath, serverName string) (credentials.TransportCredentials, error) { + // Load the validator's client certificate and key. + clientCert, err := tls.LoadX509KeyPair(clientCertPath, clientKeyPath) + if err != nil { + return nil, fmt.Errorf("failed to load client cert/key pair: %w", err) + } + + // Load the CA certificate to verify the sidecar's server certificate. + caPool, err := loadCACert(caCertPath) + if err != nil { + return nil, fmt.Errorf("failed to load CA cert: %w", err) + } + + if serverName == "" { + return nil, errors.New("serverName must not be empty and must match CN in sidecar's server cert") + } + + tlsCfg := &tls.Config{ + // Share the client certificate to the sidecar. + Certificates: []tls.Certificate{clientCert}, + + // Verify the sidecar's certificate against the CA. + RootCAs: caPool, + ServerName: serverName, + MinVersion: tls.VersionTLS13, + } + + return credentials.NewTLS(tlsCfg), nil +} + +// loadCACert reads a PEM-encoded CA certificate file and returns a cert pool. +func loadCACert(path string) (*x509.CertPool, error) { + caPEM, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("cannot read CA cert file %q: %w", path, err) + } + + pool := x509.NewCertPool() + if !pool.AppendCertsFromPEM(caPEM) { + return nil, fmt.Errorf("no valid certificates found in %q", path) + } + + return pool, nil +} diff --git a/x/bridge/keeper/golden_vector_attestation_test.go b/x/bridge/keeper/golden_vector_attestation_test.go new file mode 100644 index 000000000..bf4ab201c --- /dev/null +++ b/x/bridge/keeper/golden_vector_attestation_test.go @@ -0,0 +1,142 @@ +package keeper_test + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "fmt" + "testing" + + cosmossecp256k1 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" +) + +// TestGoldenVector_OracleAttestation produces a byte-exact golden vector for the +// Tellor oracle-attestation snapshot encoding using the node's REAL +// Keeper.EncodeOracleAttestationData method. This is the oracle the bridge-signer +// port must match byte-for-byte. +// +// It also proves the two signing paths are equivalent: +// - node/checkpoint path: cosmos secp256k1 keyring Sign(snapshot), which +// INTERNALLY does sha256(snapshot) then returns 64-byte R||S (lower-S), +// stripping the leading compact-recovery byte. +// - signer port path: geth crypto.Sign(sha256(snapshot), priv)[:64]. +// +// Both must yield the IDENTICAL 64-byte R||S. +func TestGoldenVector_OracleAttestation(t *testing.T) { + k, _, _, _, _, _, _, ctx := setupKeeper(t) + _ = ctx + + // ---- FIXED, HARDCODED INPUTS ---------------------------------------- + // queryId: 32 bytes. This is the SpotPrice(trb,usd) queryId used widely in + // Tellor; documented as a literal 32-byte hex below so the signer test can + // hardcode the exact same bytes. + const queryIdHex = "83245f6a6a2f6458558a706270fbcc35ac3a81917602c1313d3bfa998dcc2d4b" + queryId, err := hex.DecodeString(queryIdHex) + require.NoError(t, err) + require.Len(t, queryId, 32) + + // value: an ABI-encoded uint256 price (18 decimals). 0x...0de0b6b3a7640000 + // == 1e18 == "1.0". Passed WITH a 0x prefix to exercise Remove0xPrefix. + const value = "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000" + + // 6 uint256 scalars (timestamps are UNIX MILLISECONDS; power is a count). + const timestamp uint64 = 1700000000000 // report aggregate timestamp (ms) + const aggregatePower uint64 = 175 // total reporter power + const previousTimestamp uint64 = 1699999000000 // ms + const nextTimestamp uint64 = 1700001000000 // ms + const attestationTimestamp uint64 = 1700000500000 // ms + const lastConsensusTimestamp uint64 = 1699998000000 // ms + + // valsetCheckpoint: 32 bytes. Fixed literal so signer can reuse verbatim. + const valsetCheckpointHex = "5c3d8e1f0a9b7c6d4e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d" + valsetCheckpoint, err := hex.DecodeString(valsetCheckpointHex) + require.NoError(t, err) + require.Len(t, valsetCheckpoint, 32) + + // domain separator is FIXED inside the encoder: + // "tellorCurrentAttestation" ascii, copied into [32]byte (right zero-pad). + domainSep := make([]byte, 32) + copy(domainSep, []byte("tellorCurrentAttestation")) + + fmt.Println("=================== GOLDEN VECTOR INPUTS ===================") + fmt.Printf("domainSeparator(ascii)=%q\n", "tellorCurrentAttestation") + fmt.Printf("domainSeparator(bytes32 hex)=%s\n", hex.EncodeToString(domainSep)) + fmt.Printf("queryId(bytes32 hex)=%s\n", queryIdHex) + fmt.Printf("value(string, 0x-prefixed)=%s\n", value) + fmt.Printf("timestamp=%d\n", timestamp) + fmt.Printf("aggregatePower=%d\n", aggregatePower) + fmt.Printf("previousTimestamp=%d\n", previousTimestamp) + fmt.Printf("nextTimestamp=%d\n", nextTimestamp) + fmt.Printf("valsetCheckpoint(bytes32 hex)=%s\n", valsetCheckpointHex) + fmt.Printf("attestationTimestamp=%d\n", attestationTimestamp) + fmt.Printf("lastConsensusTimestamp=%d\n", lastConsensusTimestamp) + + // ---- 1. EncodeOracleAttestationData (REAL node method) -------------- + snapshot, err := k.EncodeOracleAttestationData( + queryId, + value, + timestamp, + aggregatePower, + previousTimestamp, + nextTimestamp, + valsetCheckpoint, + attestationTimestamp, + lastConsensusTimestamp, + ) + require.NoError(t, err) + require.Len(t, snapshot, 32, "snapshot is keccak256(abi.Pack(...)) = 32 bytes") + + fmt.Println("=================== SNAPSHOT (keccak256 of ABI pack) =======") + fmt.Printf("snapshotHash(hex)=%s\n", hex.EncodeToString(snapshot)) + + // ---- 2. Signing digest -- what is actually signed ------------------- + // The keyring Sign() internally computes sha256(snapshot). Surface it so + // the signer's sha256->SignRaw path can target the exact same 32 bytes. + digest32 := sha256.Sum256(snapshot) + signingDigest := digest32[:] + fmt.Println("=================== SIGNING DIGEST (sha256 of snapshot) ====") + fmt.Printf("signingDigest_sha256(hex)=%s\n", hex.EncodeToString(signingDigest)) + + // ---- 3. FIXED private key: 32 bytes of 0x11 ------------------------- + priv := bytes.Repeat([]byte{0x11}, 32) + fmt.Printf("privKey(hex)=%s\n", hex.EncodeToString(priv)) + + // ---- 3a. SIGNER PORT PATH: geth crypto.Sign(sha256(snapshot)) ------- + gethPriv, err := crypto.ToECDSA(priv) + require.NoError(t, err) + gethSig65, err := crypto.Sign(signingDigest, gethPriv) // 65 bytes: R||S||V + require.NoError(t, err) + require.Len(t, gethSig65, 65) + gethSig64 := gethSig65[:64] // R||S + + // ---- 3b. NODE/CHECKPOINT PATH: cosmos keyring Sign(snapshot) -------- + // PrivKey.Sign(msg) = ecdsa.SignCompact(priv, sha256(msg), false)[1:] + // i.e. it sha256-hashes the message itself, then strips the compact + // recovery byte, returning 64-byte R||S in lower-S form. + cosmosPriv := &cosmossecp256k1.PrivKey{Key: priv} + cosmosSig, err := cosmosPriv.Sign(snapshot) // pass UNHASHED snapshot + require.NoError(t, err) + require.Len(t, cosmosSig, 64) + + fmt.Println("=================== SIGNATURES (64-byte R||S) =============") + fmt.Printf("sig64_geth(hex) =%s\n", hex.EncodeToString(gethSig64)) + fmt.Printf("sig64_cosmosKeyring(hex)=%s\n", hex.EncodeToString(cosmosSig)) + + // ---- 4. PARITY ASSERTION -------------------------------------------- + // Prove the signer's geth sha256->SignRaw[:64] path == node's keyring path. + require.Equal(t, gethSig64, cosmosSig, + "geth crypto.Sign(sha256(snapshot))[:64] must equal cosmos keyring Sign(snapshot)") + + // ---- 5. Sanity: verify the signature against the derived pubkey ----- + cosmosPub := cosmosPriv.PubKey() + require.True(t, cosmosPub.VerifySignature(snapshot, cosmosSig), + "cosmos pubkey must verify the 64-byte signature over the snapshot") + + fmt.Println("=================== GOLDEN VECTOR (COPY VERBATIM) =========") + fmt.Printf("SNAPSHOT_HASH = %s\n", hex.EncodeToString(snapshot)) + fmt.Printf("SIGNING_DIGEST_SHA = %s\n", hex.EncodeToString(signingDigest)) + fmt.Printf("SIG64_RS = %s\n", hex.EncodeToString(gethSig64)) + fmt.Println("===========================================================") +} diff --git a/x/bridge/keeper/golden_vector_test.go b/x/bridge/keeper/golden_vector_test.go new file mode 100644 index 000000000..8ea81f480 --- /dev/null +++ b/x/bridge/keeper/golden_vector_test.go @@ -0,0 +1,114 @@ +package keeper_test + +import ( + "crypto/sha256" + "encoding/hex" + "fmt" + "testing" + + "github.com/tellor-io/layer/x/bridge/types" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +// TestGoldenVector_BridgeCheckpoint produces a byte-exact golden vector for the +// bridge checkpoint encoding using the node's REAL EncodeAndHashValidatorSet and +// EncodeValsetCheckpoint methods. This is the oracle the signer port must match. +func TestGoldenVector_BridgeCheckpoint(t *testing.T) { + k, _, _, _, _, _, _, ctx := setupKeeper(t) + + // ---- FIXED, HARDCODED INPUTS ---------------------------------------- + // Three validators with explicit 20-byte ethereum addresses + powers. + // NOTE: these are provided ALREADY in the node's canonical sort order + // (power descending; ties broken by ascending address byte compare). + addr1 := common.HexToAddress("0x1111111111111111111111111111111111111111") + addr2 := common.HexToAddress("0x2222222222222222222222222222222222222222") + addr3 := common.HexToAddress("0x3333333333333333333333333333333333333333") + + vs := &types.BridgeValidatorSet{ + BridgeValidatorSet: []*types.BridgeValidator{ + {EthereumAddress: addr1.Bytes(), Power: 100}, + {EthereumAddress: addr2.Bytes(), Power: 50}, + {EthereumAddress: addr3.Bytes(), Power: 25}, + }, + } + + const powerThreshold uint64 = 116 // (100+50+25)*2/3 = 116 + const validatorTimestamp uint64 = 1700000000000 // UNIX MILLISECONDS + + fmt.Println("=================== GOLDEN VECTOR INPUTS ===================") + for i, v := range vs.BridgeValidatorSet { + fmt.Printf("validator[%d] addr=0x%s power=%d\n", i, hex.EncodeToString(v.EthereumAddress), v.Power) + } + fmt.Printf("powerThreshold=%d\n", powerThreshold) + fmt.Printf("validatorTimestamp=%d (UNIX MILLISECONDS)\n", validatorTimestamp) + + // ---- 1. EncodeAndHashValidatorSet (REAL node method) ---------------- + encodedValset, valsetHash, err := k.EncodeAndHashValidatorSet(ctx, vs) + if err != nil { + t.Fatalf("EncodeAndHashValidatorSet: %v", err) + } + fmt.Println("=================== VALIDATOR SET ENCODING =================") + fmt.Printf("encodedValidatorSet(hex)=%s\n", hex.EncodeToString(encodedValset)) + fmt.Printf("validatorSetHash(hex)=%s\n", hex.EncodeToString(valsetHash)) + + // ---- 2a. MAINNET domain separator ----------------------------------- + // Mainnet fixed constant: "checkpoint" ascii, right-padded to 32 bytes. + domainSepMainnet := make([]byte, 32) + copy(domainSepMainnet, []byte("checkpoint")) + if err := k.ValsetCheckpointDomainSeparator.Set(ctx, domainSepMainnet); err != nil { + t.Fatalf("set mainnet domsep: %v", err) + } + checkpointMainnet, err := k.EncodeValsetCheckpoint(ctx, powerThreshold, validatorTimestamp, valsetHash) + if err != nil { + t.Fatalf("EncodeValsetCheckpoint mainnet: %v", err) + } + + // ---- 2b. NON-MAINNET domain separator ------------------------------- + // keccak256(abi.encode("checkpoint", chainID)) with chainID = "layertest-4" + const nonMainnetChainID = "layertest-4" + stringType, err := abi.NewType("string", "", nil) + if err != nil { + t.Fatalf("abi string type: %v", err) + } + dsArgs := abi.Arguments{{Type: stringType}, {Type: stringType}} + dsEncoded, err := dsArgs.Pack("checkpoint", nonMainnetChainID) + if err != nil { + t.Fatalf("pack domsep: %v", err) + } + domainSepNonMainnet := crypto.Keccak256(dsEncoded) + if err := k.ValsetCheckpointDomainSeparator.Set(ctx, domainSepNonMainnet); err != nil { + t.Fatalf("set non-mainnet domsep: %v", err) + } + checkpointNonMainnet, err := k.EncodeValsetCheckpoint(ctx, powerThreshold, validatorTimestamp, valsetHash) + if err != nil { + t.Fatalf("EncodeValsetCheckpoint non-mainnet: %v", err) + } + + fmt.Println("=================== DOMAIN SEPARATORS ======================") + fmt.Printf("domainSeparator_MAINNET(hex)=%s\n", hex.EncodeToString(domainSepMainnet)) + fmt.Printf("nonMainnetChainID=%q\n", nonMainnetChainID) + fmt.Printf("domainSeparator_nonMainnet_encoded(hex)=%s\n", hex.EncodeToString(dsEncoded)) + fmt.Printf("domainSeparator_nonMainnet(hex)=%s\n", hex.EncodeToString(domainSepNonMainnet)) + + fmt.Println("=================== CHECKPOINTS ============================") + fmt.Printf("checkpoint_MAINNET(hex)=%s\n", hex.EncodeToString(checkpointMainnet)) + fmt.Printf("checkpoint_nonMainnet(hex)=%s\n", hex.EncodeToString(checkpointNonMainnet)) + + // ---- 3. Signing digest -- what gets signed (sha256 of checkpoint) --- + // The node signs via kr.Sign(checkpoint) which sha256-hashes the message + // internally then produces 64-byte r||s. Surface sha256(checkpoint). + digestMainnet := sha256sum(checkpointMainnet) + digestNonMainnet := sha256sum(checkpointNonMainnet) + fmt.Println("=================== SIGNING DIGESTS (sha256 of checkpoint) =") + fmt.Printf("sha256(checkpoint_MAINNET)(hex)=%s\n", hex.EncodeToString(digestMainnet)) + fmt.Printf("sha256(checkpoint_nonMainnet)(hex)=%s\n", hex.EncodeToString(digestNonMainnet)) + fmt.Println("===========================================================") +} + +func sha256sum(b []byte) []byte { + h := sha256.Sum256(b) + return h[:] +} diff --git a/x/bridge/keeper/keeper.go b/x/bridge/keeper/keeper.go index 711f065b9..c4f4067a8 100644 --- a/x/bridge/keeper/keeper.go +++ b/x/bridge/keeper/keeper.go @@ -1302,3 +1302,17 @@ func (k Keeper) GetCheckpointParamsByCheckpoint(ctx context.Context, checkpoint return params, nil } + +// GetValsetCheckpointDomainSeparator returns the stored valset-checkpoint domain +// separator. Used by the vote-extension handler to build the structured +// SignBridgeCheckpoint request for the remote signer. +func (k Keeper) GetValsetCheckpointDomainSeparator(ctx context.Context) ([]byte, error) { + return k.ValsetCheckpointDomainSeparator.Get(ctx) +} + +// GetAttestationSnapshotDataBySnapshot returns the stored attestation snapshot +// data for the given snapshot. Used by the vote-extension handler to build the +// structured SignOracleAttestation request for the remote signer. +func (k Keeper) GetAttestationSnapshotDataBySnapshot(ctx context.Context, snapshot []byte) (types.AttestationSnapshotData, error) { + return k.AttestSnapshotDataMap.Get(ctx, snapshot) +} diff --git a/x/bridge/keeper/sigcheck_test.go b/x/bridge/keeper/sigcheck_test.go new file mode 100644 index 000000000..d8737c335 --- /dev/null +++ b/x/bridge/keeper/sigcheck_test.go @@ -0,0 +1,35 @@ +package keeper_test + +import ( + "crypto/sha256" + "encoding/hex" + "testing" + + cosmossecp "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + gethcrypto "github.com/ethereum/go-ethereum/crypto" +) + +func TestSigCheck_CosmosVsGeth(t *testing.T) { + keyBytes, _ := hex.DecodeString("1111111111111111111111111111111111111111111111111111111111111111") + checkpoint, _ := hex.DecodeString("ab090e41f0bc98246cce8eb74603375dcc3721bc212a6704f2e26980d04ee0f1") + + cosmosPriv := &cosmossecp.PrivKey{Key: keyBytes} + cosmosSig, err := cosmosPriv.Sign(checkpoint) + if err != nil { t.Fatal(err) } + + digest := sha256.Sum256(checkpoint) + gethPriv, err := gethcrypto.ToECDSA(keyBytes) + if err != nil { t.Fatal(err) } + gethSig, err := gethcrypto.Sign(digest[:], gethPriv) + if err != nil { t.Fatal(err) } + gethRS := gethSig[:64] + + t.Logf("digest sha256(checkpoint) = %s", hex.EncodeToString(digest[:])) + t.Logf("cosmos kr.Sign (R||S) = %s len=%d", hex.EncodeToString(cosmosSig), len(cosmosSig)) + t.Logf("geth Sign(digest)[:64] = %s len=%d", hex.EncodeToString(gethRS), len(gethRS)) + t.Logf("geth recovery V byte = %02x", gethSig[64]) + if hex.EncodeToString(cosmosSig) != hex.EncodeToString(gethRS) { + t.Fatalf("MISMATCH: cosmos and geth produced different R||S") + } + t.Logf("MATCH byte-for-byte = true") +} From 5bfa05bfaff6e21d4486b8bf30c47d14e226b719 Mon Sep 17 00:00:00 2001 From: diorwave Date: Wed, 1 Jul 2026 07:13:25 +0000 Subject: [PATCH 4/4] layer: import bridge-remote-signer/api directly instead of vendoring (drop vendor-api) --- Dockerfile | 3 - go.mod | 6 +- go.sum | 2 + vendor-api/gen/signer/v1/signer.pb.go | 1209 -------------------- vendor-api/gen/signer/v1/signer_grpc.pb.go | 461 -------- vendor-api/go.mod | 15 - vendor-api/go.sum | 38 - vendor-api/proto/signer/v1/signer.proto | 262 ----- vendor-api/tls/tls.go | 91 -- 9 files changed, 3 insertions(+), 2084 deletions(-) delete mode 100644 vendor-api/gen/signer/v1/signer.pb.go delete mode 100644 vendor-api/gen/signer/v1/signer_grpc.pb.go delete mode 100644 vendor-api/go.mod delete mode 100644 vendor-api/go.sum delete mode 100644 vendor-api/proto/signer/v1/signer.proto delete mode 100644 vendor-api/tls/tls.go diff --git a/Dockerfile b/Dockerfile index 6298965c4..3ffd962df 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,9 +29,6 @@ RUN apk update && apk add --no-cache \ WORKDIR /layer COPY go.mod go.sum ./ -# Local replace target for the vendored bridge-remote-signer api — must be present -# before `go mod download` so the relative replace resolves. -COPY vendor-api ./vendor-api RUN --mount=type=cache,target=/go/pkg/mod \ go mod download diff --git a/go.mod b/go.mod index 1152bbbd6..b4874430e 100644 --- a/go.mod +++ b/go.mod @@ -42,6 +42,7 @@ require ( github.com/spf13/viper v1.20.1 github.com/strangelove-ventures/globalfee v0.50.1 github.com/stretchr/testify v1.11.1 + github.com/tellor-io/bridge-remote-signer/api v0.0.0-20260625110956-a0eb13ebf52a github.com/vektra/mockery/v2 v2.23.1 go.uber.org/mock v0.5.2 golang.org/x/text v0.32.0 @@ -289,11 +290,6 @@ replace ( github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) -// Vendored bridge-remote-signer api (gRPC client + mTLS) for remote vote-extension signing. -require github.com/tellor-io/bridge-remote-signer/api v0.0.0 - -replace github.com/tellor-io/bridge-remote-signer/api => ./vendor-api - // Pin grpc/protobuf to the versions this module already uses, so the vendored // api dependency cannot pull them up to incompatible versions. replace google.golang.org/grpc => google.golang.org/grpc v1.72.2 diff --git a/go.sum b/go.sum index 68c566b48..dcf265c72 100644 --- a/go.sum +++ b/go.sum @@ -1788,6 +1788,8 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tellor-io/bridge-remote-signer/api v0.0.0-20260625110956-a0eb13ebf52a h1:nHVLvV46wW7YTQXD8T4J7JdrgRgIKZVni9x5V6Ly65A= +github.com/tellor-io/bridge-remote-signer/api v0.0.0-20260625110956-a0eb13ebf52a/go.mod h1:ydgNfQx2Xj6kNW57SuZafRPjWH47jL0Z+F2lCl8quDY= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= diff --git a/vendor-api/gen/signer/v1/signer.pb.go b/vendor-api/gen/signer/v1/signer.pb.go deleted file mode 100644 index 5c7f8c263..000000000 --- a/vendor-api/gen/signer/v1/signer.pb.go +++ /dev/null @@ -1,1209 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.36.11 -// protoc v3.21.12 -// source: signer/v1/signer.proto - -package signerv1 - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - 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) -) - -// SignRequest is the signing request sent by the validator. -type SignRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // msg is the raw bytes to sign. Must be exactly 32 bytes. - Msg []byte `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - // request_id is an optional caller-assigned identifier for logs. - RequestId string `protobuf:"bytes,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SignRequest) Reset() { - *x = SignRequest{} - mi := &file_signer_v1_signer_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SignRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignRequest) ProtoMessage() {} - -func (x *SignRequest) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 SignRequest.ProtoReflect.Descriptor instead. -func (*SignRequest) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{0} -} - -func (x *SignRequest) GetMsg() []byte { - if x != nil { - return x.Msg - } - return nil -} - -func (x *SignRequest) GetRequestId() string { - if x != nil { - return x.RequestId - } - return "" -} - -// SignResponse contains the resulting signature. -type SignResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // signature is the 65-byte secp256k1 ECDSA signature (r || s || v). - // Compatible with Ethereum's ecrecover, v is 27 or 28. - Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SignResponse) Reset() { - *x = SignResponse{} - mi := &file_signer_v1_signer_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SignResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignResponse) ProtoMessage() {} - -func (x *SignResponse) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 SignResponse.ProtoReflect.Descriptor instead. -func (*SignResponse) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{1} -} - -func (x *SignResponse) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -// GetPublicKeyRequest -type GetPublicKeyRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetPublicKeyRequest) Reset() { - *x = GetPublicKeyRequest{} - mi := &file_signer_v1_signer_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetPublicKeyRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetPublicKeyRequest) ProtoMessage() {} - -func (x *GetPublicKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 GetPublicKeyRequest.ProtoReflect.Descriptor instead. -func (*GetPublicKeyRequest) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{2} -} - -// GetPublicKeyResponse contains the public key. -type GetPublicKeyResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // public_key is the compressed 33-byte secp256k1 public key. - // The validator uses this to derive the bech32 operator address - // and the Ethereum address for bridge contract verification. - PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetPublicKeyResponse) Reset() { - *x = GetPublicKeyResponse{} - mi := &file_signer_v1_signer_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetPublicKeyResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetPublicKeyResponse) ProtoMessage() {} - -func (x *GetPublicKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 GetPublicKeyResponse.ProtoReflect.Descriptor instead. -func (*GetPublicKeyResponse) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{3} -} - -func (x *GetPublicKeyResponse) GetPublicKey() []byte { - if x != nil { - return x.PublicKey - } - return nil -} - -// SignRawRequest is the request for raw cosmos-compatible signing. -type SignRawRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // msg is the 32-byte hash to sign directly (no additional hashing). - Msg []byte `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - // request_id is an optional caller-assigned identifier for logs. - RequestId string `protobuf:"bytes,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SignRawRequest) Reset() { - *x = SignRawRequest{} - mi := &file_signer_v1_signer_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SignRawRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignRawRequest) ProtoMessage() {} - -func (x *SignRawRequest) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 SignRawRequest.ProtoReflect.Descriptor instead. -func (*SignRawRequest) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{4} -} - -func (x *SignRawRequest) GetMsg() []byte { - if x != nil { - return x.Msg - } - return nil -} - -func (x *SignRawRequest) GetRequestId() string { - if x != nil { - return x.RequestId - } - return "" -} - -// SignRawResponse contains the resulting cosmos-format signature. -type SignRawResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // signature is the 64-byte secp256k1 ECDSA signature (r || s). - // Compatible with Cosmos SDK tx signing (no v byte). - Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SignRawResponse) Reset() { - *x = SignRawResponse{} - mi := &file_signer_v1_signer_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SignRawResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignRawResponse) ProtoMessage() {} - -func (x *SignRawResponse) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 SignRawResponse.ProtoReflect.Descriptor instead. -func (*SignRawResponse) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{5} -} - -func (x *SignRawResponse) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -// GetAddressRequest specifies the bech32 prefix to use. -type GetAddressRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // prefix is the bech32 human-readable part (e.g. "tellor"). - Prefix string `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetAddressRequest) Reset() { - *x = GetAddressRequest{} - mi := &file_signer_v1_signer_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetAddressRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetAddressRequest) ProtoMessage() {} - -func (x *GetAddressRequest) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 GetAddressRequest.ProtoReflect.Descriptor instead. -func (*GetAddressRequest) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{6} -} - -func (x *GetAddressRequest) GetPrefix() string { - if x != nil { - return x.Prefix - } - return "" -} - -// GetAddressResponse contains the derived bech32 address. -type GetAddressResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // address is the bech32-encoded account address (e.g. "tellor1..."). - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetAddressResponse) Reset() { - *x = GetAddressResponse{} - mi := &file_signer_v1_signer_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetAddressResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetAddressResponse) ProtoMessage() {} - -func (x *GetAddressResponse) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 GetAddressResponse.ProtoReflect.Descriptor instead. -func (*GetAddressResponse) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{7} -} - -func (x *GetAddressResponse) GetAddress() string { - if x != nil { - return x.Address - } - return "" -} - -// SignTxRequest carries raw Cosmos SignDoc bytes for scope-checked signing. -type SignTxRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // sign_doc is the raw protobuf-encoded cosmos.tx.v1beta1.SignDoc bytes - // (the exact bytes that will be sha256-hashed and signed). - SignDoc []byte `protobuf:"bytes,1,opt,name=sign_doc,json=signDoc,proto3" json:"sign_doc,omitempty"` - // request_id is an optional caller-assigned identifier for logs. - RequestId string `protobuf:"bytes,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SignTxRequest) Reset() { - *x = SignTxRequest{} - mi := &file_signer_v1_signer_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SignTxRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignTxRequest) ProtoMessage() {} - -func (x *SignTxRequest) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 SignTxRequest.ProtoReflect.Descriptor instead. -func (*SignTxRequest) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{8} -} - -func (x *SignTxRequest) GetSignDoc() []byte { - if x != nil { - return x.SignDoc - } - return nil -} - -func (x *SignTxRequest) GetRequestId() string { - if x != nil { - return x.RequestId - } - return "" -} - -// SignTxResponse contains the resulting cosmos-format signature. -type SignTxResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // signature is the 64-byte secp256k1 ECDSA signature (r || s). - Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SignTxResponse) Reset() { - *x = SignTxResponse{} - mi := &file_signer_v1_signer_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SignTxResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignTxResponse) ProtoMessage() {} - -func (x *SignTxResponse) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 SignTxResponse.ProtoReflect.Descriptor instead. -func (*SignTxResponse) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{9} -} - -func (x *SignTxResponse) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -// GetChainIDRequest -type GetChainIDRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetChainIDRequest) Reset() { - *x = GetChainIDRequest{} - mi := &file_signer_v1_signer_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetChainIDRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetChainIDRequest) ProtoMessage() {} - -func (x *GetChainIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 GetChainIDRequest.ProtoReflect.Descriptor instead. -func (*GetChainIDRequest) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{10} -} - -// GetChainIDResponse contains the configured chain ID. -type GetChainIDResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // chain_id is the cosmos chain ID (e.g. "layertest-5"). - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetChainIDResponse) Reset() { - *x = GetChainIDResponse{} - mi := &file_signer_v1_signer_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetChainIDResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetChainIDResponse) ProtoMessage() {} - -func (x *GetChainIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 GetChainIDResponse.ProtoReflect.Descriptor instead. -func (*GetChainIDResponse) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{11} -} - -func (x *GetChainIDResponse) GetChainId() string { - if x != nil { - return x.ChainId - } - return "" -} - -// BridgeValidator is a single entry of the bridge validator set, mirroring the -// node's x/bridge types.BridgeValidator. The signer re-sorts and re-encodes the -// set itself; caller ordering is not trusted. -type BridgeValidator struct { - state protoimpl.MessageState `protogen:"open.v1"` - // ethereum_address is the raw 20-byte EVM address of the validator. - EthereumAddress []byte `protobuf:"bytes,1,opt,name=ethereum_address,json=ethereumAddress,proto3" json:"ethereum_address,omitempty"` - // power is the validator's bridge voting power. - Power uint64 `protobuf:"varint,2,opt,name=power,proto3" json:"power,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *BridgeValidator) Reset() { - *x = BridgeValidator{} - mi := &file_signer_v1_signer_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *BridgeValidator) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BridgeValidator) ProtoMessage() {} - -func (x *BridgeValidator) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_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 BridgeValidator.ProtoReflect.Descriptor instead. -func (*BridgeValidator) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{12} -} - -func (x *BridgeValidator) GetEthereumAddress() []byte { - if x != nil { - return x.EthereumAddress - } - return nil -} - -func (x *BridgeValidator) GetPower() uint64 { - if x != nil { - return x.Power - } - return 0 -} - -// SignBridgeCheckpointRequest carries the STRUCTURED inputs the signer needs to -// recompute the valset checkpoint locally (never a blind hash). The signer -// recomputes the checkpoint and must match expected_checkpoint or fail closed. -type SignBridgeCheckpointRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // domain_separator is the 32-byte checkpoint domain separator the node - // computed. The signer independently recomputes it from chain_id and asserts - // equality. - DomainSeparator []byte `protobuf:"bytes,1,opt,name=domain_separator,json=domainSeparator,proto3" json:"domain_separator,omitempty"` - // power_threshold is sum(powers)*2/3 (node integer math). Re-derived + checked. - PowerThreshold uint64 `protobuf:"varint,2,opt,name=power_threshold,json=powerThreshold,proto3" json:"power_threshold,omitempty"` - // validator_timestamp is the valset timestamp in UNIX MILLISECONDS. - ValidatorTimestamp uint64 `protobuf:"varint,3,opt,name=validator_timestamp,json=validatorTimestamp,proto3" json:"validator_timestamp,omitempty"` - // validator_set_hash is the node-computed keccak256 hash of the encoded - // validator set. The signer recomputes it and asserts equality. - ValidatorSetHash []byte `protobuf:"bytes,4,opt,name=validator_set_hash,json=validatorSetHash,proto3" json:"validator_set_hash,omitempty"` - // validator_set is the structured validator set. The signer applies the - // node's canonical sort before encoding (caller ordering is not trusted). - ValidatorSet []*BridgeValidator `protobuf:"bytes,5,rep,name=validator_set,json=validatorSet,proto3" json:"validator_set,omitempty"` - // block_height is the consensus block height (audit/context only). - BlockHeight uint64 `protobuf:"varint,6,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` - // checkpoint_index is the valset checkpoint index (audit/context only). - CheckpointIndex uint64 `protobuf:"varint,7,opt,name=checkpoint_index,json=checkpointIndex,proto3" json:"checkpoint_index,omitempty"` - // chain_id is the cosmos chain ID used to recompute the domain separator - // (mainnet => fixed "checkpoint" constant; else keccak256(abi.encode(...))). - ChainId string `protobuf:"bytes,8,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - // expected_checkpoint is the 32-byte checkpoint the node computed. The signer - // recomputes the checkpoint from the structured inputs and MUST match this, - // else it returns an error and signs nothing. - ExpectedCheckpoint []byte `protobuf:"bytes,9,opt,name=expected_checkpoint,json=expectedCheckpoint,proto3" json:"expected_checkpoint,omitempty"` - // request_id is an optional caller-assigned identifier for logs. - RequestId string `protobuf:"bytes,10,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SignBridgeCheckpointRequest) Reset() { - *x = SignBridgeCheckpointRequest{} - mi := &file_signer_v1_signer_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SignBridgeCheckpointRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignBridgeCheckpointRequest) ProtoMessage() {} - -func (x *SignBridgeCheckpointRequest) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_proto_msgTypes[13] - 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 SignBridgeCheckpointRequest.ProtoReflect.Descriptor instead. -func (*SignBridgeCheckpointRequest) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{13} -} - -func (x *SignBridgeCheckpointRequest) GetDomainSeparator() []byte { - if x != nil { - return x.DomainSeparator - } - return nil -} - -func (x *SignBridgeCheckpointRequest) GetPowerThreshold() uint64 { - if x != nil { - return x.PowerThreshold - } - return 0 -} - -func (x *SignBridgeCheckpointRequest) GetValidatorTimestamp() uint64 { - if x != nil { - return x.ValidatorTimestamp - } - return 0 -} - -func (x *SignBridgeCheckpointRequest) GetValidatorSetHash() []byte { - if x != nil { - return x.ValidatorSetHash - } - return nil -} - -func (x *SignBridgeCheckpointRequest) GetValidatorSet() []*BridgeValidator { - if x != nil { - return x.ValidatorSet - } - return nil -} - -func (x *SignBridgeCheckpointRequest) GetBlockHeight() uint64 { - if x != nil { - return x.BlockHeight - } - return 0 -} - -func (x *SignBridgeCheckpointRequest) GetCheckpointIndex() uint64 { - if x != nil { - return x.CheckpointIndex - } - return 0 -} - -func (x *SignBridgeCheckpointRequest) GetChainId() string { - if x != nil { - return x.ChainId - } - return "" -} - -func (x *SignBridgeCheckpointRequest) GetExpectedCheckpoint() []byte { - if x != nil { - return x.ExpectedCheckpoint - } - return nil -} - -func (x *SignBridgeCheckpointRequest) GetRequestId() string { - if x != nil { - return x.RequestId - } - return "" -} - -// SignBridgeCheckpointResponse contains the signature over the recomputed -// checkpoint and the checkpoint itself (for caller verification). -type SignBridgeCheckpointResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // signature is the 64-byte secp256k1 ECDSA signature (r || s) over - // sha256(checkpoint). No v byte — the chain brute-forces the recovery id. - Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` - // checkpoint is the 32-byte keccak256 checkpoint the signer recomputed and - // signed (equals expected_checkpoint on success). - Checkpoint []byte `protobuf:"bytes,2,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SignBridgeCheckpointResponse) Reset() { - *x = SignBridgeCheckpointResponse{} - mi := &file_signer_v1_signer_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SignBridgeCheckpointResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignBridgeCheckpointResponse) ProtoMessage() {} - -func (x *SignBridgeCheckpointResponse) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_proto_msgTypes[14] - 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 SignBridgeCheckpointResponse.ProtoReflect.Descriptor instead. -func (*SignBridgeCheckpointResponse) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{14} -} - -func (x *SignBridgeCheckpointResponse) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -func (x *SignBridgeCheckpointResponse) GetCheckpoint() []byte { - if x != nil { - return x.Checkpoint - } - return nil -} - -// SignOracleAttestationRequest carries the STRUCTURED inputs the signer needs to -// recompute the oracle-attestation snapshot locally (never a blind hash). The -// signer recomputes the snapshot via the byte-exact node encoder -// (EncodeOracleAttestationData) and MUST match expected_snapshot or fail closed. -type SignOracleAttestationRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // query_id is the attestation query id. Front-aligned into a bytes32 by the - // encoder (right zero-padded if < 32 bytes); must be <= 32 bytes. - QueryId []byte `protobuf:"bytes,1,opt,name=query_id,json=queryId,proto3" json:"query_id,omitempty"` - // value is the ALREADY-HEX-DECODED report value bytes. The node computes these - // as hex.DecodeString(Remove0xPrefix(valueString)); the request carries the - // resulting raw bytes directly. The signer ABI-packs them as the dynamic - // `bytes` argument (no further decoding) — do NOT send the 0x-prefixed string. - Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - // timestamp is the report aggregate timestamp (UNIX MILLISECONDS). ABI uint256. - Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // aggregate_power is the total reporter power for the aggregate. ABI uint256. - AggregatePower uint64 `protobuf:"varint,4,opt,name=aggregate_power,json=aggregatePower,proto3" json:"aggregate_power,omitempty"` - // previous_timestamp is the previous report timestamp (ms). ABI uint256. - PreviousTimestamp uint64 `protobuf:"varint,5,opt,name=previous_timestamp,json=previousTimestamp,proto3" json:"previous_timestamp,omitempty"` - // next_timestamp is the next report timestamp (ms). ABI uint256. - NextTimestamp uint64 `protobuf:"varint,6,opt,name=next_timestamp,json=nextTimestamp,proto3" json:"next_timestamp,omitempty"` - // valset_checkpoint is the 32-byte valset checkpoint. Front-aligned into a - // bytes32 by the encoder (right zero-padded if < 32 bytes); must be <= 32 bytes. - ValsetCheckpoint []byte `protobuf:"bytes,7,opt,name=valset_checkpoint,json=valsetCheckpoint,proto3" json:"valset_checkpoint,omitempty"` - // attestation_timestamp is the attestation timestamp (ms). ABI uint256. - AttestationTimestamp uint64 `protobuf:"varint,8,opt,name=attestation_timestamp,json=attestationTimestamp,proto3" json:"attestation_timestamp,omitempty"` - // last_consensus_timestamp is the last consensus timestamp (ms). ABI uint256. - LastConsensusTimestamp uint64 `protobuf:"varint,9,opt,name=last_consensus_timestamp,json=lastConsensusTimestamp,proto3" json:"last_consensus_timestamp,omitempty"` - // expected_snapshot is the 32-byte snapshot (keccak256 of the ABI-packed - // attestation data) the node computed. The signer recomputes the snapshot from - // the structured inputs and MUST match this, else it returns an error and signs - // nothing. - ExpectedSnapshot []byte `protobuf:"bytes,10,opt,name=expected_snapshot,json=expectedSnapshot,proto3" json:"expected_snapshot,omitempty"` - // request_id is an optional caller-assigned identifier for logs. - RequestId string `protobuf:"bytes,11,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SignOracleAttestationRequest) Reset() { - *x = SignOracleAttestationRequest{} - mi := &file_signer_v1_signer_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SignOracleAttestationRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignOracleAttestationRequest) ProtoMessage() {} - -func (x *SignOracleAttestationRequest) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_proto_msgTypes[15] - 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 SignOracleAttestationRequest.ProtoReflect.Descriptor instead. -func (*SignOracleAttestationRequest) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{15} -} - -func (x *SignOracleAttestationRequest) GetQueryId() []byte { - if x != nil { - return x.QueryId - } - return nil -} - -func (x *SignOracleAttestationRequest) GetValue() []byte { - if x != nil { - return x.Value - } - return nil -} - -func (x *SignOracleAttestationRequest) GetTimestamp() uint64 { - if x != nil { - return x.Timestamp - } - return 0 -} - -func (x *SignOracleAttestationRequest) GetAggregatePower() uint64 { - if x != nil { - return x.AggregatePower - } - return 0 -} - -func (x *SignOracleAttestationRequest) GetPreviousTimestamp() uint64 { - if x != nil { - return x.PreviousTimestamp - } - return 0 -} - -func (x *SignOracleAttestationRequest) GetNextTimestamp() uint64 { - if x != nil { - return x.NextTimestamp - } - return 0 -} - -func (x *SignOracleAttestationRequest) GetValsetCheckpoint() []byte { - if x != nil { - return x.ValsetCheckpoint - } - return nil -} - -func (x *SignOracleAttestationRequest) GetAttestationTimestamp() uint64 { - if x != nil { - return x.AttestationTimestamp - } - return 0 -} - -func (x *SignOracleAttestationRequest) GetLastConsensusTimestamp() uint64 { - if x != nil { - return x.LastConsensusTimestamp - } - return 0 -} - -func (x *SignOracleAttestationRequest) GetExpectedSnapshot() []byte { - if x != nil { - return x.ExpectedSnapshot - } - return nil -} - -func (x *SignOracleAttestationRequest) GetRequestId() string { - if x != nil { - return x.RequestId - } - return "" -} - -// SignOracleAttestationResponse contains the signature over the recomputed -// snapshot and the snapshot itself (for caller verification). -type SignOracleAttestationResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // signature is the 64-byte secp256k1 ECDSA signature (r || s) over - // sha256(snapshot). No v byte — the chain brute-forces the recovery id. - Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` - // snapshot is the 32-byte keccak256 attestation snapshot the signer recomputed - // and signed (equals expected_snapshot on success). - Snapshot []byte `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SignOracleAttestationResponse) Reset() { - *x = SignOracleAttestationResponse{} - mi := &file_signer_v1_signer_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SignOracleAttestationResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignOracleAttestationResponse) ProtoMessage() {} - -func (x *SignOracleAttestationResponse) ProtoReflect() protoreflect.Message { - mi := &file_signer_v1_signer_proto_msgTypes[16] - 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 SignOracleAttestationResponse.ProtoReflect.Descriptor instead. -func (*SignOracleAttestationResponse) Descriptor() ([]byte, []int) { - return file_signer_v1_signer_proto_rawDescGZIP(), []int{16} -} - -func (x *SignOracleAttestationResponse) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -func (x *SignOracleAttestationResponse) GetSnapshot() []byte { - if x != nil { - return x.Snapshot - } - return nil -} - -var File_signer_v1_signer_proto protoreflect.FileDescriptor - -const file_signer_v1_signer_proto_rawDesc = "" + - "\n" + - "\x16signer/v1/signer.proto\x12\tsigner.v1\">\n" + - "\vSignRequest\x12\x10\n" + - "\x03msg\x18\x01 \x01(\fR\x03msg\x12\x1d\n" + - "\n" + - "request_id\x18\x02 \x01(\tR\trequestId\",\n" + - "\fSignResponse\x12\x1c\n" + - "\tsignature\x18\x01 \x01(\fR\tsignature\"\x15\n" + - "\x13GetPublicKeyRequest\"5\n" + - "\x14GetPublicKeyResponse\x12\x1d\n" + - "\n" + - "public_key\x18\x01 \x01(\fR\tpublicKey\"A\n" + - "\x0eSignRawRequest\x12\x10\n" + - "\x03msg\x18\x01 \x01(\fR\x03msg\x12\x1d\n" + - "\n" + - "request_id\x18\x02 \x01(\tR\trequestId\"/\n" + - "\x0fSignRawResponse\x12\x1c\n" + - "\tsignature\x18\x01 \x01(\fR\tsignature\"+\n" + - "\x11GetAddressRequest\x12\x16\n" + - "\x06prefix\x18\x01 \x01(\tR\x06prefix\".\n" + - "\x12GetAddressResponse\x12\x18\n" + - "\aaddress\x18\x01 \x01(\tR\aaddress\"I\n" + - "\rSignTxRequest\x12\x19\n" + - "\bsign_doc\x18\x01 \x01(\fR\asignDoc\x12\x1d\n" + - "\n" + - "request_id\x18\x02 \x01(\tR\trequestId\".\n" + - "\x0eSignTxResponse\x12\x1c\n" + - "\tsignature\x18\x01 \x01(\fR\tsignature\"\x13\n" + - "\x11GetChainIDRequest\"/\n" + - "\x12GetChainIDResponse\x12\x19\n" + - "\bchain_id\x18\x01 \x01(\tR\achainId\"R\n" + - "\x0fBridgeValidator\x12)\n" + - "\x10ethereum_address\x18\x01 \x01(\fR\x0fethereumAddress\x12\x14\n" + - "\x05power\x18\x02 \x01(\x04R\x05power\"\xca\x03\n" + - "\x1bSignBridgeCheckpointRequest\x12)\n" + - "\x10domain_separator\x18\x01 \x01(\fR\x0fdomainSeparator\x12'\n" + - "\x0fpower_threshold\x18\x02 \x01(\x04R\x0epowerThreshold\x12/\n" + - "\x13validator_timestamp\x18\x03 \x01(\x04R\x12validatorTimestamp\x12,\n" + - "\x12validator_set_hash\x18\x04 \x01(\fR\x10validatorSetHash\x12?\n" + - "\rvalidator_set\x18\x05 \x03(\v2\x1a.signer.v1.BridgeValidatorR\fvalidatorSet\x12!\n" + - "\fblock_height\x18\x06 \x01(\x04R\vblockHeight\x12)\n" + - "\x10checkpoint_index\x18\a \x01(\x04R\x0fcheckpointIndex\x12\x19\n" + - "\bchain_id\x18\b \x01(\tR\achainId\x12/\n" + - "\x13expected_checkpoint\x18\t \x01(\fR\x12expectedCheckpoint\x12\x1d\n" + - "\n" + - "request_id\x18\n" + - " \x01(\tR\trequestId\"\\\n" + - "\x1cSignBridgeCheckpointResponse\x12\x1c\n" + - "\tsignature\x18\x01 \x01(\fR\tsignature\x12\x1e\n" + - "\n" + - "checkpoint\x18\x02 \x01(\fR\n" + - "checkpoint\"\xd4\x03\n" + - "\x1cSignOracleAttestationRequest\x12\x19\n" + - "\bquery_id\x18\x01 \x01(\fR\aqueryId\x12\x14\n" + - "\x05value\x18\x02 \x01(\fR\x05value\x12\x1c\n" + - "\ttimestamp\x18\x03 \x01(\x04R\ttimestamp\x12'\n" + - "\x0faggregate_power\x18\x04 \x01(\x04R\x0eaggregatePower\x12-\n" + - "\x12previous_timestamp\x18\x05 \x01(\x04R\x11previousTimestamp\x12%\n" + - "\x0enext_timestamp\x18\x06 \x01(\x04R\rnextTimestamp\x12+\n" + - "\x11valset_checkpoint\x18\a \x01(\fR\x10valsetCheckpoint\x123\n" + - "\x15attestation_timestamp\x18\b \x01(\x04R\x14attestationTimestamp\x128\n" + - "\x18last_consensus_timestamp\x18\t \x01(\x04R\x16lastConsensusTimestamp\x12+\n" + - "\x11expected_snapshot\x18\n" + - " \x01(\fR\x10expectedSnapshot\x12\x1d\n" + - "\n" + - "request_id\x18\v \x01(\tR\trequestId\"Y\n" + - "\x1dSignOracleAttestationResponse\x12\x1c\n" + - "\tsignature\x18\x01 \x01(\fR\tsignature\x12\x1a\n" + - "\bsnapshot\x18\x02 \x01(\fR\bsnapshot2\x84\x05\n" + - "\fBridgeSigner\x127\n" + - "\x04Sign\x12\x16.signer.v1.SignRequest\x1a\x17.signer.v1.SignResponse\x12O\n" + - "\fGetPublicKey\x12\x1e.signer.v1.GetPublicKeyRequest\x1a\x1f.signer.v1.GetPublicKeyResponse\x12@\n" + - "\aSignRaw\x12\x19.signer.v1.SignRawRequest\x1a\x1a.signer.v1.SignRawResponse\x12I\n" + - "\n" + - "GetAddress\x12\x1c.signer.v1.GetAddressRequest\x1a\x1d.signer.v1.GetAddressResponse\x12=\n" + - "\x06SignTx\x12\x18.signer.v1.SignTxRequest\x1a\x19.signer.v1.SignTxResponse\x12I\n" + - "\n" + - "GetChainID\x12\x1c.signer.v1.GetChainIDRequest\x1a\x1d.signer.v1.GetChainIDResponse\x12g\n" + - "\x14SignBridgeCheckpoint\x12&.signer.v1.SignBridgeCheckpointRequest\x1a'.signer.v1.SignBridgeCheckpointResponse\x12j\n" + - "\x15SignOracleAttestation\x12'.signer.v1.SignOracleAttestationRequest\x1a(.signer.v1.SignOracleAttestationResponseB?Z=github.com/tellor-io/bridge-signer/api/gen/signer/v1;signerv1b\x06proto3" - -var ( - file_signer_v1_signer_proto_rawDescOnce sync.Once - file_signer_v1_signer_proto_rawDescData []byte -) - -func file_signer_v1_signer_proto_rawDescGZIP() []byte { - file_signer_v1_signer_proto_rawDescOnce.Do(func() { - file_signer_v1_signer_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_signer_v1_signer_proto_rawDesc), len(file_signer_v1_signer_proto_rawDesc))) - }) - return file_signer_v1_signer_proto_rawDescData -} - -var file_signer_v1_signer_proto_msgTypes = make([]protoimpl.MessageInfo, 17) -var file_signer_v1_signer_proto_goTypes = []any{ - (*SignRequest)(nil), // 0: signer.v1.SignRequest - (*SignResponse)(nil), // 1: signer.v1.SignResponse - (*GetPublicKeyRequest)(nil), // 2: signer.v1.GetPublicKeyRequest - (*GetPublicKeyResponse)(nil), // 3: signer.v1.GetPublicKeyResponse - (*SignRawRequest)(nil), // 4: signer.v1.SignRawRequest - (*SignRawResponse)(nil), // 5: signer.v1.SignRawResponse - (*GetAddressRequest)(nil), // 6: signer.v1.GetAddressRequest - (*GetAddressResponse)(nil), // 7: signer.v1.GetAddressResponse - (*SignTxRequest)(nil), // 8: signer.v1.SignTxRequest - (*SignTxResponse)(nil), // 9: signer.v1.SignTxResponse - (*GetChainIDRequest)(nil), // 10: signer.v1.GetChainIDRequest - (*GetChainIDResponse)(nil), // 11: signer.v1.GetChainIDResponse - (*BridgeValidator)(nil), // 12: signer.v1.BridgeValidator - (*SignBridgeCheckpointRequest)(nil), // 13: signer.v1.SignBridgeCheckpointRequest - (*SignBridgeCheckpointResponse)(nil), // 14: signer.v1.SignBridgeCheckpointResponse - (*SignOracleAttestationRequest)(nil), // 15: signer.v1.SignOracleAttestationRequest - (*SignOracleAttestationResponse)(nil), // 16: signer.v1.SignOracleAttestationResponse -} -var file_signer_v1_signer_proto_depIdxs = []int32{ - 12, // 0: signer.v1.SignBridgeCheckpointRequest.validator_set:type_name -> signer.v1.BridgeValidator - 0, // 1: signer.v1.BridgeSigner.Sign:input_type -> signer.v1.SignRequest - 2, // 2: signer.v1.BridgeSigner.GetPublicKey:input_type -> signer.v1.GetPublicKeyRequest - 4, // 3: signer.v1.BridgeSigner.SignRaw:input_type -> signer.v1.SignRawRequest - 6, // 4: signer.v1.BridgeSigner.GetAddress:input_type -> signer.v1.GetAddressRequest - 8, // 5: signer.v1.BridgeSigner.SignTx:input_type -> signer.v1.SignTxRequest - 10, // 6: signer.v1.BridgeSigner.GetChainID:input_type -> signer.v1.GetChainIDRequest - 13, // 7: signer.v1.BridgeSigner.SignBridgeCheckpoint:input_type -> signer.v1.SignBridgeCheckpointRequest - 15, // 8: signer.v1.BridgeSigner.SignOracleAttestation:input_type -> signer.v1.SignOracleAttestationRequest - 1, // 9: signer.v1.BridgeSigner.Sign:output_type -> signer.v1.SignResponse - 3, // 10: signer.v1.BridgeSigner.GetPublicKey:output_type -> signer.v1.GetPublicKeyResponse - 5, // 11: signer.v1.BridgeSigner.SignRaw:output_type -> signer.v1.SignRawResponse - 7, // 12: signer.v1.BridgeSigner.GetAddress:output_type -> signer.v1.GetAddressResponse - 9, // 13: signer.v1.BridgeSigner.SignTx:output_type -> signer.v1.SignTxResponse - 11, // 14: signer.v1.BridgeSigner.GetChainID:output_type -> signer.v1.GetChainIDResponse - 14, // 15: signer.v1.BridgeSigner.SignBridgeCheckpoint:output_type -> signer.v1.SignBridgeCheckpointResponse - 16, // 16: signer.v1.BridgeSigner.SignOracleAttestation:output_type -> signer.v1.SignOracleAttestationResponse - 9, // [9:17] is the sub-list for method output_type - 1, // [1:9] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name -} - -func init() { file_signer_v1_signer_proto_init() } -func file_signer_v1_signer_proto_init() { - if File_signer_v1_signer_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: unsafe.Slice(unsafe.StringData(file_signer_v1_signer_proto_rawDesc), len(file_signer_v1_signer_proto_rawDesc)), - NumEnums: 0, - NumMessages: 17, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_signer_v1_signer_proto_goTypes, - DependencyIndexes: file_signer_v1_signer_proto_depIdxs, - MessageInfos: file_signer_v1_signer_proto_msgTypes, - }.Build() - File_signer_v1_signer_proto = out.File - file_signer_v1_signer_proto_goTypes = nil - file_signer_v1_signer_proto_depIdxs = nil -} diff --git a/vendor-api/gen/signer/v1/signer_grpc.pb.go b/vendor-api/gen/signer/v1/signer_grpc.pb.go deleted file mode 100644 index 122af69da..000000000 --- a/vendor-api/gen/signer/v1/signer_grpc.pb.go +++ /dev/null @@ -1,461 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.6.2 -// - protoc v3.21.12 -// source: signer/v1/signer.proto - -package signerv1 - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.64.0 or later. -const _ = grpc.SupportPackageIsVersion9 - -const ( - BridgeSigner_Sign_FullMethodName = "/signer.v1.BridgeSigner/Sign" - BridgeSigner_GetPublicKey_FullMethodName = "/signer.v1.BridgeSigner/GetPublicKey" - BridgeSigner_SignRaw_FullMethodName = "/signer.v1.BridgeSigner/SignRaw" - BridgeSigner_GetAddress_FullMethodName = "/signer.v1.BridgeSigner/GetAddress" - BridgeSigner_SignTx_FullMethodName = "/signer.v1.BridgeSigner/SignTx" - BridgeSigner_GetChainID_FullMethodName = "/signer.v1.BridgeSigner/GetChainID" - BridgeSigner_SignBridgeCheckpoint_FullMethodName = "/signer.v1.BridgeSigner/SignBridgeCheckpoint" - BridgeSigner_SignOracleAttestation_FullMethodName = "/signer.v1.BridgeSigner/SignOracleAttestation" -) - -// BridgeSignerClient is the client API for BridgeSigner service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -// -// BridgeSigner is the signing service exposed by the sidecar. -// The validator calls this during ExtendVoteHandler to sign -// oracle attestations and valset checkpoints. -type BridgeSignerClient interface { - // Sign signs the given message bytes with the secp256k1 bridge key - // and returns a 65-byte ECDSA signature (r || s || v). - // msg must be exactly 32 bytes (a hash). - // v is 27 or 28, compatible with Ethereum ecrecover. - Sign(ctx context.Context, in *SignRequest, opts ...grpc.CallOption) (*SignResponse, error) - // GetPublicKey returns the compressed 33-byte secp256k1 public key. - // Helps the node to derive the operator address. - GetPublicKey(ctx context.Context, in *GetPublicKeyRequest, opts ...grpc.CallOption) (*GetPublicKeyResponse, error) - // SignRaw signs the given 32-byte hash directly (no extra hashing). - // Returns a 64-byte secp256k1 signature (r || s), compatible with - // Cosmos SDK transaction signing. Used by the reporter to sign txs - // without a local keyring. - SignRaw(ctx context.Context, in *SignRawRequest, opts ...grpc.CallOption) (*SignRawResponse, error) - // GetAddress derives the bech32 address from the signer's public key - // using the given prefix (e.g. "tellor"). Allows the reporter to - // discover its own address without hard-coding it in config. - GetAddress(ctx context.Context, in *GetAddressRequest, opts ...grpc.CallOption) (*GetAddressResponse, error) - // SignTx accepts raw Cosmos SignDoc bytes, validates that every message - // type_url is on the server's allowlist, then signs with the secp256k1 - // key. Returns a 64-byte r||s signature (no v byte). - // Rejects with PERMISSION_DENIED if any message type is not allowed. - SignTx(ctx context.Context, in *SignTxRequest, opts ...grpc.CallOption) (*SignTxResponse, error) - // GetChainID returns the cosmos chain ID the signer is configured for, - // so callers (e.g. the monitor) can discover it without a local env var. - GetChainID(ctx context.Context, in *GetChainIDRequest, opts ...grpc.CallOption) (*GetChainIDResponse, error) - // SignBridgeCheckpoint accepts the STRUCTURED valset-checkpoint inputs - // (not a blind hash), recomputes the checkpoint itself using the byte-exact - // node encoder, validates it against the caller-supplied expected_checkpoint, - // enforces self-membership + a monotonic replay guard, then signs - // sha256(checkpoint) with the secp256k1 key. Returns a 64-byte r||s signature - // (no v byte) — the chain consumer brute-forces the recovery id itself. - // FAILS CLOSED (signs nothing) on any mismatch. - SignBridgeCheckpoint(ctx context.Context, in *SignBridgeCheckpointRequest, opts ...grpc.CallOption) (*SignBridgeCheckpointResponse, error) - // SignOracleAttestation accepts the STRUCTURED oracle-attestation inputs (not a - // blind hash), recomputes the attestation snapshot itself using the byte-exact - // node encoder (EncodeOracleAttestationData), validates it against the - // caller-supplied expected_snapshot, then signs sha256(snapshot) with the - // secp256k1 key. Returns a 64-byte r||s signature (no v byte) — the chain - // consumer brute-forces the recovery id itself. FAILS CLOSED (signs nothing) - // on any mismatch. - SignOracleAttestation(ctx context.Context, in *SignOracleAttestationRequest, opts ...grpc.CallOption) (*SignOracleAttestationResponse, error) -} - -type bridgeSignerClient struct { - cc grpc.ClientConnInterface -} - -func NewBridgeSignerClient(cc grpc.ClientConnInterface) BridgeSignerClient { - return &bridgeSignerClient{cc} -} - -func (c *bridgeSignerClient) Sign(ctx context.Context, in *SignRequest, opts ...grpc.CallOption) (*SignResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(SignResponse) - err := c.cc.Invoke(ctx, BridgeSigner_Sign_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bridgeSignerClient) GetPublicKey(ctx context.Context, in *GetPublicKeyRequest, opts ...grpc.CallOption) (*GetPublicKeyResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(GetPublicKeyResponse) - err := c.cc.Invoke(ctx, BridgeSigner_GetPublicKey_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bridgeSignerClient) SignRaw(ctx context.Context, in *SignRawRequest, opts ...grpc.CallOption) (*SignRawResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(SignRawResponse) - err := c.cc.Invoke(ctx, BridgeSigner_SignRaw_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bridgeSignerClient) GetAddress(ctx context.Context, in *GetAddressRequest, opts ...grpc.CallOption) (*GetAddressResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(GetAddressResponse) - err := c.cc.Invoke(ctx, BridgeSigner_GetAddress_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bridgeSignerClient) SignTx(ctx context.Context, in *SignTxRequest, opts ...grpc.CallOption) (*SignTxResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(SignTxResponse) - err := c.cc.Invoke(ctx, BridgeSigner_SignTx_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bridgeSignerClient) GetChainID(ctx context.Context, in *GetChainIDRequest, opts ...grpc.CallOption) (*GetChainIDResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(GetChainIDResponse) - err := c.cc.Invoke(ctx, BridgeSigner_GetChainID_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bridgeSignerClient) SignBridgeCheckpoint(ctx context.Context, in *SignBridgeCheckpointRequest, opts ...grpc.CallOption) (*SignBridgeCheckpointResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(SignBridgeCheckpointResponse) - err := c.cc.Invoke(ctx, BridgeSigner_SignBridgeCheckpoint_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bridgeSignerClient) SignOracleAttestation(ctx context.Context, in *SignOracleAttestationRequest, opts ...grpc.CallOption) (*SignOracleAttestationResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(SignOracleAttestationResponse) - err := c.cc.Invoke(ctx, BridgeSigner_SignOracleAttestation_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - -// BridgeSignerServer is the server API for BridgeSigner service. -// All implementations must embed UnimplementedBridgeSignerServer -// for forward compatibility. -// -// BridgeSigner is the signing service exposed by the sidecar. -// The validator calls this during ExtendVoteHandler to sign -// oracle attestations and valset checkpoints. -type BridgeSignerServer interface { - // Sign signs the given message bytes with the secp256k1 bridge key - // and returns a 65-byte ECDSA signature (r || s || v). - // msg must be exactly 32 bytes (a hash). - // v is 27 or 28, compatible with Ethereum ecrecover. - Sign(context.Context, *SignRequest) (*SignResponse, error) - // GetPublicKey returns the compressed 33-byte secp256k1 public key. - // Helps the node to derive the operator address. - GetPublicKey(context.Context, *GetPublicKeyRequest) (*GetPublicKeyResponse, error) - // SignRaw signs the given 32-byte hash directly (no extra hashing). - // Returns a 64-byte secp256k1 signature (r || s), compatible with - // Cosmos SDK transaction signing. Used by the reporter to sign txs - // without a local keyring. - SignRaw(context.Context, *SignRawRequest) (*SignRawResponse, error) - // GetAddress derives the bech32 address from the signer's public key - // using the given prefix (e.g. "tellor"). Allows the reporter to - // discover its own address without hard-coding it in config. - GetAddress(context.Context, *GetAddressRequest) (*GetAddressResponse, error) - // SignTx accepts raw Cosmos SignDoc bytes, validates that every message - // type_url is on the server's allowlist, then signs with the secp256k1 - // key. Returns a 64-byte r||s signature (no v byte). - // Rejects with PERMISSION_DENIED if any message type is not allowed. - SignTx(context.Context, *SignTxRequest) (*SignTxResponse, error) - // GetChainID returns the cosmos chain ID the signer is configured for, - // so callers (e.g. the monitor) can discover it without a local env var. - GetChainID(context.Context, *GetChainIDRequest) (*GetChainIDResponse, error) - // SignBridgeCheckpoint accepts the STRUCTURED valset-checkpoint inputs - // (not a blind hash), recomputes the checkpoint itself using the byte-exact - // node encoder, validates it against the caller-supplied expected_checkpoint, - // enforces self-membership + a monotonic replay guard, then signs - // sha256(checkpoint) with the secp256k1 key. Returns a 64-byte r||s signature - // (no v byte) — the chain consumer brute-forces the recovery id itself. - // FAILS CLOSED (signs nothing) on any mismatch. - SignBridgeCheckpoint(context.Context, *SignBridgeCheckpointRequest) (*SignBridgeCheckpointResponse, error) - // SignOracleAttestation accepts the STRUCTURED oracle-attestation inputs (not a - // blind hash), recomputes the attestation snapshot itself using the byte-exact - // node encoder (EncodeOracleAttestationData), validates it against the - // caller-supplied expected_snapshot, then signs sha256(snapshot) with the - // secp256k1 key. Returns a 64-byte r||s signature (no v byte) — the chain - // consumer brute-forces the recovery id itself. FAILS CLOSED (signs nothing) - // on any mismatch. - SignOracleAttestation(context.Context, *SignOracleAttestationRequest) (*SignOracleAttestationResponse, error) - mustEmbedUnimplementedBridgeSignerServer() -} - -// UnimplementedBridgeSignerServer must be embedded to have -// forward compatible implementations. -// -// NOTE: this should be embedded by value instead of pointer to avoid a nil -// pointer dereference when methods are called. -type UnimplementedBridgeSignerServer struct{} - -func (UnimplementedBridgeSignerServer) Sign(context.Context, *SignRequest) (*SignResponse, error) { - return nil, status.Error(codes.Unimplemented, "method Sign not implemented") -} -func (UnimplementedBridgeSignerServer) GetPublicKey(context.Context, *GetPublicKeyRequest) (*GetPublicKeyResponse, error) { - return nil, status.Error(codes.Unimplemented, "method GetPublicKey not implemented") -} -func (UnimplementedBridgeSignerServer) SignRaw(context.Context, *SignRawRequest) (*SignRawResponse, error) { - return nil, status.Error(codes.Unimplemented, "method SignRaw not implemented") -} -func (UnimplementedBridgeSignerServer) GetAddress(context.Context, *GetAddressRequest) (*GetAddressResponse, error) { - return nil, status.Error(codes.Unimplemented, "method GetAddress not implemented") -} -func (UnimplementedBridgeSignerServer) SignTx(context.Context, *SignTxRequest) (*SignTxResponse, error) { - return nil, status.Error(codes.Unimplemented, "method SignTx not implemented") -} -func (UnimplementedBridgeSignerServer) GetChainID(context.Context, *GetChainIDRequest) (*GetChainIDResponse, error) { - return nil, status.Error(codes.Unimplemented, "method GetChainID not implemented") -} -func (UnimplementedBridgeSignerServer) SignBridgeCheckpoint(context.Context, *SignBridgeCheckpointRequest) (*SignBridgeCheckpointResponse, error) { - return nil, status.Error(codes.Unimplemented, "method SignBridgeCheckpoint not implemented") -} -func (UnimplementedBridgeSignerServer) SignOracleAttestation(context.Context, *SignOracleAttestationRequest) (*SignOracleAttestationResponse, error) { - return nil, status.Error(codes.Unimplemented, "method SignOracleAttestation not implemented") -} -func (UnimplementedBridgeSignerServer) mustEmbedUnimplementedBridgeSignerServer() {} -func (UnimplementedBridgeSignerServer) testEmbeddedByValue() {} - -// UnsafeBridgeSignerServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to BridgeSignerServer will -// result in compilation errors. -type UnsafeBridgeSignerServer interface { - mustEmbedUnimplementedBridgeSignerServer() -} - -func RegisterBridgeSignerServer(s grpc.ServiceRegistrar, srv BridgeSignerServer) { - // If the following call panics, it indicates UnimplementedBridgeSignerServer was - // embedded by pointer and is nil. This will cause panics if an - // unimplemented method is ever invoked, so we test this at initialization - // time to prevent it from happening at runtime later due to I/O. - if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { - t.testEmbeddedByValue() - } - s.RegisterService(&BridgeSigner_ServiceDesc, srv) -} - -func _BridgeSigner_Sign_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SignRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BridgeSignerServer).Sign(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: BridgeSigner_Sign_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BridgeSignerServer).Sign(ctx, req.(*SignRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BridgeSigner_GetPublicKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetPublicKeyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BridgeSignerServer).GetPublicKey(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: BridgeSigner_GetPublicKey_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BridgeSignerServer).GetPublicKey(ctx, req.(*GetPublicKeyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BridgeSigner_SignRaw_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SignRawRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BridgeSignerServer).SignRaw(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: BridgeSigner_SignRaw_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BridgeSignerServer).SignRaw(ctx, req.(*SignRawRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BridgeSigner_GetAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetAddressRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BridgeSignerServer).GetAddress(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: BridgeSigner_GetAddress_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BridgeSignerServer).GetAddress(ctx, req.(*GetAddressRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BridgeSigner_SignTx_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SignTxRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BridgeSignerServer).SignTx(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: BridgeSigner_SignTx_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BridgeSignerServer).SignTx(ctx, req.(*SignTxRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BridgeSigner_GetChainID_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetChainIDRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BridgeSignerServer).GetChainID(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: BridgeSigner_GetChainID_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BridgeSignerServer).GetChainID(ctx, req.(*GetChainIDRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BridgeSigner_SignBridgeCheckpoint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SignBridgeCheckpointRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BridgeSignerServer).SignBridgeCheckpoint(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: BridgeSigner_SignBridgeCheckpoint_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BridgeSignerServer).SignBridgeCheckpoint(ctx, req.(*SignBridgeCheckpointRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BridgeSigner_SignOracleAttestation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SignOracleAttestationRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BridgeSignerServer).SignOracleAttestation(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: BridgeSigner_SignOracleAttestation_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BridgeSignerServer).SignOracleAttestation(ctx, req.(*SignOracleAttestationRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// BridgeSigner_ServiceDesc is the grpc.ServiceDesc for BridgeSigner service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var BridgeSigner_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "signer.v1.BridgeSigner", - HandlerType: (*BridgeSignerServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Sign", - Handler: _BridgeSigner_Sign_Handler, - }, - { - MethodName: "GetPublicKey", - Handler: _BridgeSigner_GetPublicKey_Handler, - }, - { - MethodName: "SignRaw", - Handler: _BridgeSigner_SignRaw_Handler, - }, - { - MethodName: "GetAddress", - Handler: _BridgeSigner_GetAddress_Handler, - }, - { - MethodName: "SignTx", - Handler: _BridgeSigner_SignTx_Handler, - }, - { - MethodName: "GetChainID", - Handler: _BridgeSigner_GetChainID_Handler, - }, - { - MethodName: "SignBridgeCheckpoint", - Handler: _BridgeSigner_SignBridgeCheckpoint_Handler, - }, - { - MethodName: "SignOracleAttestation", - Handler: _BridgeSigner_SignOracleAttestation_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "signer/v1/signer.proto", -} diff --git a/vendor-api/go.mod b/vendor-api/go.mod deleted file mode 100644 index 432d91140..000000000 --- a/vendor-api/go.mod +++ /dev/null @@ -1,15 +0,0 @@ -module github.com/tellor-io/bridge-remote-signer/api - -go 1.23.2 - -require ( - google.golang.org/grpc v1.79.3 - google.golang.org/protobuf v1.36.11 -) - -require ( - golang.org/x/net v0.48.0 // indirect - golang.org/x/sys v0.39.0 // indirect - golang.org/x/text v0.32.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect -) diff --git a/vendor-api/go.sum b/vendor-api/go.sum deleted file mode 100644 index d705bc9b7..000000000 --- a/vendor-api/go.sum +++ /dev/null @@ -1,38 +0,0 @@ -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/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/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -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= -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.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= -go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= -go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= -go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= -go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= -go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= -go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= -go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= -go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= -go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= -golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= -golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= -golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= -golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= -golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= -google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= -google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= diff --git a/vendor-api/proto/signer/v1/signer.proto b/vendor-api/proto/signer/v1/signer.proto deleted file mode 100644 index 28fdc0646..000000000 --- a/vendor-api/proto/signer/v1/signer.proto +++ /dev/null @@ -1,262 +0,0 @@ -syntax = "proto3"; - -package signer.v1; - -option go_package = "github.com/tellor-io/bridge-signer/api/gen/signer/v1;signerv1"; - -// BridgeSigner is the signing service exposed by the sidecar. -// The validator calls this during ExtendVoteHandler to sign -// oracle attestations and valset checkpoints. -service BridgeSigner { - // Sign signs the given message bytes with the secp256k1 bridge key - // and returns a 65-byte ECDSA signature (r || s || v). - // msg must be exactly 32 bytes (a hash). - // v is 27 or 28, compatible with Ethereum ecrecover. - rpc Sign(SignRequest) returns (SignResponse); - - // GetPublicKey returns the compressed 33-byte secp256k1 public key. - // Helps the node to derive the operator address. - rpc GetPublicKey(GetPublicKeyRequest) returns (GetPublicKeyResponse); - - // SignRaw signs the given 32-byte hash directly (no extra hashing). - // Returns a 64-byte secp256k1 signature (r || s), compatible with - // Cosmos SDK transaction signing. Used by the reporter to sign txs - // without a local keyring. - rpc SignRaw(SignRawRequest) returns (SignRawResponse); - - // GetAddress derives the bech32 address from the signer's public key - // using the given prefix (e.g. "tellor"). Allows the reporter to - // discover its own address without hard-coding it in config. - rpc GetAddress(GetAddressRequest) returns (GetAddressResponse); - - // SignTx accepts raw Cosmos SignDoc bytes, validates that every message - // type_url is on the server's allowlist, then signs with the secp256k1 - // key. Returns a 64-byte r||s signature (no v byte). - // Rejects with PERMISSION_DENIED if any message type is not allowed. - rpc SignTx(SignTxRequest) returns (SignTxResponse); - - // GetChainID returns the cosmos chain ID the signer is configured for, - // so callers (e.g. the monitor) can discover it without a local env var. - rpc GetChainID(GetChainIDRequest) returns (GetChainIDResponse); - - // SignBridgeCheckpoint accepts the STRUCTURED valset-checkpoint inputs - // (not a blind hash), recomputes the checkpoint itself using the byte-exact - // node encoder, validates it against the caller-supplied expected_checkpoint, - // enforces self-membership + a monotonic replay guard, then signs - // sha256(checkpoint) with the secp256k1 key. Returns a 64-byte r||s signature - // (no v byte) — the chain consumer brute-forces the recovery id itself. - // FAILS CLOSED (signs nothing) on any mismatch. - rpc SignBridgeCheckpoint(SignBridgeCheckpointRequest) returns (SignBridgeCheckpointResponse); - - // SignOracleAttestation accepts the STRUCTURED oracle-attestation inputs (not a - // blind hash), recomputes the attestation snapshot itself using the byte-exact - // node encoder (EncodeOracleAttestationData), validates it against the - // caller-supplied expected_snapshot, then signs sha256(snapshot) with the - // secp256k1 key. Returns a 64-byte r||s signature (no v byte) — the chain - // consumer brute-forces the recovery id itself. FAILS CLOSED (signs nothing) - // on any mismatch. - rpc SignOracleAttestation(SignOracleAttestationRequest) returns (SignOracleAttestationResponse); -} - -// SignRequest is the signing request sent by the validator. -message SignRequest { - // msg is the raw bytes to sign. Must be exactly 32 bytes. - bytes msg = 1; - - // request_id is an optional caller-assigned identifier for logs. - string request_id = 2; -} - -// SignResponse contains the resulting signature. -message SignResponse { - // signature is the 65-byte secp256k1 ECDSA signature (r || s || v). - // Compatible with Ethereum's ecrecover, v is 27 or 28. - bytes signature = 1; -} - -// GetPublicKeyRequest -message GetPublicKeyRequest {} - -// GetPublicKeyResponse contains the public key. -message GetPublicKeyResponse { - // public_key is the compressed 33-byte secp256k1 public key. - // The validator uses this to derive the bech32 operator address - // and the Ethereum address for bridge contract verification. - bytes public_key = 1; -} -// SignRawRequest is the request for raw cosmos-compatible signing. -message SignRawRequest { - // msg is the 32-byte hash to sign directly (no additional hashing). - bytes msg = 1; - - // request_id is an optional caller-assigned identifier for logs. - string request_id = 2; -} - -// SignRawResponse contains the resulting cosmos-format signature. -message SignRawResponse { - // signature is the 64-byte secp256k1 ECDSA signature (r || s). - // Compatible with Cosmos SDK tx signing (no v byte). - bytes signature = 1; -} - -// GetAddressRequest specifies the bech32 prefix to use. -message GetAddressRequest { - // prefix is the bech32 human-readable part (e.g. "tellor"). - string prefix = 1; -} - -// GetAddressResponse contains the derived bech32 address. -message GetAddressResponse { - // address is the bech32-encoded account address (e.g. "tellor1..."). - string address = 1; -} - -// SignTxRequest carries raw Cosmos SignDoc bytes for scope-checked signing. -message SignTxRequest { - // sign_doc is the raw protobuf-encoded cosmos.tx.v1beta1.SignDoc bytes - // (the exact bytes that will be sha256-hashed and signed). - bytes sign_doc = 1; - - // request_id is an optional caller-assigned identifier for logs. - string request_id = 2; -} - -// SignTxResponse contains the resulting cosmos-format signature. -message SignTxResponse { - // signature is the 64-byte secp256k1 ECDSA signature (r || s). - bytes signature = 1; -} - -// GetChainIDRequest -message GetChainIDRequest {} - -// GetChainIDResponse contains the configured chain ID. -message GetChainIDResponse { - // chain_id is the cosmos chain ID (e.g. "layertest-5"). - string chain_id = 1; -} - -// BridgeValidator is a single entry of the bridge validator set, mirroring the -// node's x/bridge types.BridgeValidator. The signer re-sorts and re-encodes the -// set itself; caller ordering is not trusted. -message BridgeValidator { - // ethereum_address is the raw 20-byte EVM address of the validator. - bytes ethereum_address = 1; - - // power is the validator's bridge voting power. - uint64 power = 2; -} - -// SignBridgeCheckpointRequest carries the STRUCTURED inputs the signer needs to -// recompute the valset checkpoint locally (never a blind hash). The signer -// recomputes the checkpoint and must match expected_checkpoint or fail closed. -message SignBridgeCheckpointRequest { - // domain_separator is the 32-byte checkpoint domain separator the node - // computed. The signer independently recomputes it from chain_id and asserts - // equality. - bytes domain_separator = 1; - - // power_threshold is sum(powers)*2/3 (node integer math). Re-derived + checked. - uint64 power_threshold = 2; - - // validator_timestamp is the valset timestamp in UNIX MILLISECONDS. - uint64 validator_timestamp = 3; - - // validator_set_hash is the node-computed keccak256 hash of the encoded - // validator set. The signer recomputes it and asserts equality. - bytes validator_set_hash = 4; - - // validator_set is the structured validator set. The signer applies the - // node's canonical sort before encoding (caller ordering is not trusted). - repeated BridgeValidator validator_set = 5; - - // block_height is the consensus block height (audit/context only). - uint64 block_height = 6; - - // checkpoint_index is the valset checkpoint index (audit/context only). - uint64 checkpoint_index = 7; - - // chain_id is the cosmos chain ID used to recompute the domain separator - // (mainnet => fixed "checkpoint" constant; else keccak256(abi.encode(...))). - string chain_id = 8; - - // expected_checkpoint is the 32-byte checkpoint the node computed. The signer - // recomputes the checkpoint from the structured inputs and MUST match this, - // else it returns an error and signs nothing. - bytes expected_checkpoint = 9; - - // request_id is an optional caller-assigned identifier for logs. - string request_id = 10; -} - -// SignBridgeCheckpointResponse contains the signature over the recomputed -// checkpoint and the checkpoint itself (for caller verification). -message SignBridgeCheckpointResponse { - // signature is the 64-byte secp256k1 ECDSA signature (r || s) over - // sha256(checkpoint). No v byte — the chain brute-forces the recovery id. - bytes signature = 1; - - // checkpoint is the 32-byte keccak256 checkpoint the signer recomputed and - // signed (equals expected_checkpoint on success). - bytes checkpoint = 2; -} - -// SignOracleAttestationRequest carries the STRUCTURED inputs the signer needs to -// recompute the oracle-attestation snapshot locally (never a blind hash). The -// signer recomputes the snapshot via the byte-exact node encoder -// (EncodeOracleAttestationData) and MUST match expected_snapshot or fail closed. -message SignOracleAttestationRequest { - // query_id is the attestation query id. Front-aligned into a bytes32 by the - // encoder (right zero-padded if < 32 bytes); must be <= 32 bytes. - bytes query_id = 1; - - // value is the ALREADY-HEX-DECODED report value bytes. The node computes these - // as hex.DecodeString(Remove0xPrefix(valueString)); the request carries the - // resulting raw bytes directly. The signer ABI-packs them as the dynamic - // `bytes` argument (no further decoding) — do NOT send the 0x-prefixed string. - bytes value = 2; - - // timestamp is the report aggregate timestamp (UNIX MILLISECONDS). ABI uint256. - uint64 timestamp = 3; - - // aggregate_power is the total reporter power for the aggregate. ABI uint256. - uint64 aggregate_power = 4; - - // previous_timestamp is the previous report timestamp (ms). ABI uint256. - uint64 previous_timestamp = 5; - - // next_timestamp is the next report timestamp (ms). ABI uint256. - uint64 next_timestamp = 6; - - // valset_checkpoint is the 32-byte valset checkpoint. Front-aligned into a - // bytes32 by the encoder (right zero-padded if < 32 bytes); must be <= 32 bytes. - bytes valset_checkpoint = 7; - - // attestation_timestamp is the attestation timestamp (ms). ABI uint256. - uint64 attestation_timestamp = 8; - - // last_consensus_timestamp is the last consensus timestamp (ms). ABI uint256. - uint64 last_consensus_timestamp = 9; - - // expected_snapshot is the 32-byte snapshot (keccak256 of the ABI-packed - // attestation data) the node computed. The signer recomputes the snapshot from - // the structured inputs and MUST match this, else it returns an error and signs - // nothing. - bytes expected_snapshot = 10; - - // request_id is an optional caller-assigned identifier for logs. - string request_id = 11; -} - -// SignOracleAttestationResponse contains the signature over the recomputed -// snapshot and the snapshot itself (for caller verification). -message SignOracleAttestationResponse { - // signature is the 64-byte secp256k1 ECDSA signature (r || s) over - // sha256(snapshot). No v byte — the chain brute-forces the recovery id. - bytes signature = 1; - - // snapshot is the 32-byte keccak256 attestation snapshot the signer recomputed - // and signed (equals expected_snapshot on success). - bytes snapshot = 2; -} diff --git a/vendor-api/tls/tls.go b/vendor-api/tls/tls.go deleted file mode 100644 index df95064fd..000000000 --- a/vendor-api/tls/tls.go +++ /dev/null @@ -1,91 +0,0 @@ -package tls - -import ( - "crypto/tls" - "crypto/x509" - "errors" - "fmt" - "os" - - "google.golang.org/grpc/credentials" -) - -// NewServerCredentials builds gRPC transport credentials for the sidecar server. -// Enforces mutual TLS — any client that cannot present a certificate signed by -// the CA is rejected at the TLS handshake before any RPC is processed. -func NewServerCredentials(caCertPath, serverCertPath, serverKeyPath string) (credentials.TransportCredentials, error) { - // Load the sidecar's own certificate and key. - serverCert, err := tls.LoadX509KeyPair(serverCertPath, serverKeyPath) - if err != nil { - return nil, fmt.Errorf("failed to load server cert/key pair: %w", err) - } - - // Load the CA certificate to verify client certificates. - caPool, err := loadCACert(caCertPath) - if err != nil { - return nil, fmt.Errorf("failed to load CA cert: %w", err) - } - - tlsCfg := &tls.Config{ - // Present sidecar certificate to the client. - Certificates: []tls.Certificate{serverCert}, - - // Require and verify the client's certificate. - // RequireAndVerifyClientCert means the handshake fails if the client - // presents no cert or a cert not signed by the CA. - ClientAuth: tls.RequireAndVerifyClientCert, - ClientCAs: caPool, - - // Minimum TLS 1.3 doesn't allow lower versions to work - MinVersion: tls.VersionTLS13, - } - - return credentials.NewTLS(tlsCfg), nil -} - -// NewClientCredentials builds gRPC transport credentials for the validator (client) side. -// The validator presents its client certificate to the sidecar for authentication. -func NewClientCredentials(caCertPath, clientCertPath, clientKeyPath, serverName string) (credentials.TransportCredentials, error) { - // Load the validator's client certificate and key. - clientCert, err := tls.LoadX509KeyPair(clientCertPath, clientKeyPath) - if err != nil { - return nil, fmt.Errorf("failed to load client cert/key pair: %w", err) - } - - // Load the CA certificate to verify the sidecar's server certificate. - caPool, err := loadCACert(caCertPath) - if err != nil { - return nil, fmt.Errorf("failed to load CA cert: %w", err) - } - - if serverName == "" { - return nil, errors.New("serverName must not be empty and must match CN in sidecar's server cert") - } - - tlsCfg := &tls.Config{ - // Share the client certificate to the sidecar. - Certificates: []tls.Certificate{clientCert}, - - // Verify the sidecar's certificate against the CA. - RootCAs: caPool, - ServerName: serverName, - MinVersion: tls.VersionTLS13, - } - - return credentials.NewTLS(tlsCfg), nil -} - -// loadCACert reads a PEM-encoded CA certificate file and returns a cert pool. -func loadCACert(path string) (*x509.CertPool, error) { - caPEM, err := os.ReadFile(path) - if err != nil { - return nil, fmt.Errorf("cannot read CA cert file %q: %w", path, err) - } - - pool := x509.NewCertPool() - if !pool.AppendCertsFromPEM(caPEM) { - return nil, fmt.Errorf("no valid certificates found in %q", path) - } - - return pool, nil -}