Skip to content

Commit

Permalink
draft
Browse files Browse the repository at this point in the history
  • Loading branch information
olegshmuelov committed Jul 29, 2024
1 parent 791cf27 commit 37752f6
Show file tree
Hide file tree
Showing 26 changed files with 116 additions and 281 deletions.
2 changes: 0 additions & 2 deletions beacon/goclient/goclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,6 @@ type Client interface {
eth2client.NodeSyncingProvider
eth2client.ProposalProvider
eth2client.ProposalSubmitter
eth2client.BlindedProposalProvider
eth2client.V3ProposalProvider
eth2client.BlindedProposalSubmitter
eth2client.DomainProvider
eth2client.SyncCommitteeMessagesSubmitter
Expand Down
165 changes: 12 additions & 153 deletions beacon/goclient/proposer.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,157 +102,8 @@ func (gc *goClient) GetBeaconBlock(slot phase0.Slot, graffitiBytes, randao []byt
}
}

func (gc *goClient) GetBlindedBeaconBlock(slot phase0.Slot, graffitiBytes, randao []byte) (ssz.Marshaler, spec.DataVersion, error) {
if gc.nodeClient == NodePrysm {
gc.log.Debug("using V3 endpoint for prysm blinded block")
return gc.V3Proposal(slot, graffitiBytes, randao)
}
return gc.DefaultGetBlindedBeaconBlock(slot, graffitiBytes, randao)
}

// GetBlindedBeaconBlock returns blinded beacon block by the given slot, graffiti, and randao.
func (gc *goClient) DefaultGetBlindedBeaconBlock(slot phase0.Slot, graffitiBytes, randao []byte) (ssz.Marshaler, spec.DataVersion, error) {
sig := phase0.BLSSignature{}
copy(sig[:], randao[:])

graffiti := [32]byte{}
copy(graffiti[:], graffitiBytes[:])

reqStart := time.Now()
blindedProposalResp, err := gc.client.BlindedProposal(gc.ctx, &api.BlindedProposalOpts{
Slot: slot,
RandaoReveal: sig,
Graffiti: graffiti,
SkipRandaoVerification: false,
})
if err != nil {
return nil, DataVersionNil, fmt.Errorf("failed to get blinded proposal: %w", err)
}
if blindedProposalResp == nil {
return nil, DataVersionNil, fmt.Errorf("blinded proposal response is nil")
}
if blindedProposalResp.Data == nil {
return nil, DataVersionNil, fmt.Errorf("blinded proposal data is nil")
}

metricsProposerDataRequest.Observe(time.Since(reqStart).Seconds())
beaconBlock := blindedProposalResp.Data

switch beaconBlock.Version {
case spec.DataVersionCapella:
if beaconBlock.Capella == nil {
return nil, DataVersionNil, fmt.Errorf("capella block is nil")
}
if beaconBlock.Capella.Body == nil {
return nil, DataVersionNil, fmt.Errorf("capella block body is nil")
}
if beaconBlock.Capella.Body.ExecutionPayloadHeader == nil {
return nil, DataVersionNil, fmt.Errorf("capella block execution payload header is nil")
}
return beaconBlock.Capella, beaconBlock.Version, nil
case spec.DataVersionDeneb:
if beaconBlock.Deneb == nil {
return nil, DataVersionNil, fmt.Errorf("deneb block contents is nil")
}
if beaconBlock.Deneb.Body == nil {
return nil, DataVersionNil, fmt.Errorf("deneb block body is nil")
}
if beaconBlock.Deneb.Body.ExecutionPayloadHeader == nil {
return nil, DataVersionNil, fmt.Errorf("deneb block execution payload header is nil")
}
return beaconBlock.Deneb, beaconBlock.Version, nil
default:
return nil, DataVersionNil, fmt.Errorf("beacon block version %s not supported", beaconBlock.Version)
}
}

func (gc *goClient) V3Proposal(slot phase0.Slot, graffitiBytes, randao []byte) (ssz.Marshaler, spec.DataVersion, error) {
sig := phase0.BLSSignature{}
copy(sig[:], randao[:])

graffiti := [32]byte{}
copy(graffiti[:], graffitiBytes[:])

reqStart := time.Now()
v3ProposalResp, err := gc.client.V3Proposal(gc.ctx, &api.V3ProposalOpts{
Slot: slot,
RandaoReveal: sig,
Graffiti: graffiti,
SkipRandaoVerification: false,
})
if err != nil {
return nil, DataVersionNil, fmt.Errorf("failed to get v3 proposal: %w", err)
}
if v3ProposalResp == nil {
return nil, DataVersionNil, fmt.Errorf("v3 proposal response is nil")
}
if v3ProposalResp.Data == nil {
return nil, DataVersionNil, fmt.Errorf("v3 proposal data is nil")
}

metricsProposerDataRequest.Observe(time.Since(reqStart).Seconds())
beaconBlock := v3ProposalResp.Data

if beaconBlock.ExecutionPayloadBlinded {
switch beaconBlock.Version {
case spec.DataVersionCapella:
if beaconBlock.BlindedCapella == nil {
return nil, DataVersionNil, fmt.Errorf("capella blinded block is nil")
}
if beaconBlock.BlindedCapella.Body == nil {
return nil, DataVersionNil, fmt.Errorf("capella blinded block body is nil")
}
if beaconBlock.BlindedCapella.Body.ExecutionPayloadHeader == nil {
return nil, DataVersionNil, fmt.Errorf("capella blinded block execution payload header is nil")
}
return beaconBlock.BlindedCapella, beaconBlock.Version, nil
case spec.DataVersionDeneb:
if beaconBlock.BlindedDeneb == nil {
return nil, DataVersionNil, fmt.Errorf("deneb blinded block contents is nil")
}
if beaconBlock.BlindedDeneb.Body == nil {
return nil, DataVersionNil, fmt.Errorf("deneb blinded block body is nil")
}
if beaconBlock.BlindedDeneb.Body.ExecutionPayloadHeader == nil {
return nil, DataVersionNil, fmt.Errorf("deneb blinded block execution payload header is nil")
}
return beaconBlock.BlindedDeneb, beaconBlock.Version, nil
default:
return nil, DataVersionNil, fmt.Errorf("beacon blinded block version %s not supported", beaconBlock.Version)
}
}

switch beaconBlock.Version {
case spec.DataVersionCapella:
if beaconBlock.Capella == nil {
return nil, DataVersionNil, fmt.Errorf("capella block is nil")
}
if beaconBlock.Capella.Body == nil {
return nil, DataVersionNil, fmt.Errorf("capella block body is nil")
}
if beaconBlock.Capella.Body.ExecutionPayload == nil {
return nil, DataVersionNil, fmt.Errorf("capella block execution payload is nil")
}
return beaconBlock.Capella, beaconBlock.Version, nil
case spec.DataVersionDeneb:
if beaconBlock.Deneb == nil {
return nil, DataVersionNil, fmt.Errorf("deneb block contents is nil")
}
if beaconBlock.Deneb.Block == nil {
return nil, DataVersionNil, fmt.Errorf("deneb block is nil")
}
if beaconBlock.Deneb.Block.Body == nil {
return nil, DataVersionNil, fmt.Errorf("deneb block body is nil")
}
if beaconBlock.Deneb.Block.Body.ExecutionPayload == nil {
return nil, DataVersionNil, fmt.Errorf("deneb block execution payload is nil")
}
return beaconBlock.Deneb, beaconBlock.Version, nil

default:
return nil, DataVersionNil, fmt.Errorf("beacon block version %s not supported", beaconBlock.Version)
}

func (gc *goClient) GetBlindedBeaconBlock(slot phase0.Slot, graffiti, randao []byte) (ssz.Marshaler, spec.DataVersion, error) {
return gc.GetBeaconBlock(slot, graffiti, randao)
}

func (gc *goClient) SubmitBlindedBeaconBlock(block *api.VersionedBlindedProposal, sig phase0.BLSSignature) error {
Expand Down Expand Up @@ -286,7 +137,11 @@ func (gc *goClient) SubmitBlindedBeaconBlock(block *api.VersionedBlindedProposal
return fmt.Errorf("unknown block version")
}

return gc.client.SubmitBlindedProposal(gc.ctx, signedBlock)
opts := &api.SubmitBlindedProposalOpts{
Proposal: signedBlock,
}

return gc.client.SubmitBlindedProposal(gc.ctx, opts)
}

// SubmitBeaconBlock submit the block to the node
Expand Down Expand Up @@ -328,7 +183,11 @@ func (gc *goClient) SubmitBeaconBlock(block *api.VersionedProposal, sig phase0.B
return fmt.Errorf("unknown block version")
}

return gc.client.SubmitProposal(gc.ctx, signedBlock)
opts := &api.SubmitProposalOpts{
Proposal: signedBlock,
}

return gc.client.SubmitProposal(gc.ctx, opts)
}

func (gc *goClient) SubmitValidatorRegistration(pubkey []byte, feeRecipient bellatrix.ExecutionAddress, sig phase0.BLSSignature) error {
Expand Down
7 changes: 3 additions & 4 deletions beacon/goclient/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,9 @@ import (
// GetValidatorData returns metadata (balance, index, status, more) for each pubkey from the node
func (gc *goClient) GetValidatorData(validatorPubKeys []phase0.BLSPubKey) (map[phase0.ValidatorIndex]*eth2apiv1.Validator, error) {
resp, err := gc.client.Validators(gc.ctx, &api.ValidatorsOpts{
State: "head", // TODO maybe need to get the chainId (head) as var
PubKeys: validatorPubKeys,
WithoutBeaconState: true,
Common: api.CommonOpts{Timeout: gc.longTimeout},
State: "head", // TODO maybe need to get the chainId (head) as var
PubKeys: validatorPubKeys,
Common: api.CommonOpts{Timeout: gc.longTimeout},
})
if err != nil {
return nil, fmt.Errorf("failed to obtain validators: %w", err)
Expand Down
7 changes: 1 addition & 6 deletions cli/operator/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ var StartNodeCmd = &cobra.Command{
logger.Fatal("could not get operator private key hash", zap.Error(err))
}

keyManager, err := ekm.NewETHKeyManagerSigner(logger, db, networkConfig, cfg.SSVOptions.ValidatorOptions.BuilderProposals, ekmHashedKey)
keyManager, err := ekm.NewETHKeyManagerSigner(logger, db, networkConfig, ekmHashedKey)
if err != nil {
logger.Fatal("could not create new eth-key-manager signer", zap.Error(err))
}
Expand Down Expand Up @@ -564,16 +564,11 @@ func setupSSVNetwork(logger *zap.Logger) (networkconfig.NetworkConfig, error) {
if cfg.SSVOptions.ValidatorOptions.FullNode {
nodeType = "full"
}
builderProposals := "disabled"
if cfg.SSVOptions.ValidatorOptions.BuilderProposals {
builderProposals = "enabled"
}

logger.Info("setting ssv network",
fields.Network(networkConfig.Name),
fields.Domain(networkConfig.Domain),
zap.String("nodeType", nodeType),
zap.String("builderProposals(MEV)", builderProposals),
zap.Any("beaconNetwork", networkConfig.Beacon.GetNetwork().BeaconNetwork),
zap.Uint64("genesisEpoch", uint64(networkConfig.GenesisEpoch)),
zap.String("registryContract", networkConfig.RegistryContractAddr),
Expand Down
4 changes: 0 additions & 4 deletions config/config.example.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,6 @@ eth2:
# HTTP URL of the Beacon node to connect to.
BeaconNodeAddr: http://example.url:5052

ValidatorOptions:
# Whether to enable MEV block production. Requires the connected Beacon node to be MEV-enabled.
BuilderProposals: false

eth1:
# WebSocket URL of the Eth1 node to connect to.
ETH1Addr: ws://example.url:8546/ws
Expand Down
3 changes: 0 additions & 3 deletions docs/EXTERNAL_BUILDERS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@
1. Configure your beacon node to use an external builder
- Lighthouse: https://lighthouse-book.sigmaprime.io/builders.html
- Prysm: https://docs.prylabs.network/docs/prysm-usage/parameters
2. Enable builder proposals for SSV node by setting an according variable to `true`:
- YAML config: `BuilderProposals`
- environment variable: `BUILDER_PROPOSALS`

## How it works

Expand Down
2 changes: 0 additions & 2 deletions e2e/config/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ p2p:

ssv:
Network: holesky-e2e
ValidatorOptions:
BuilderProposals: false

#bootnode:
# PrivateKey: 3b503a31004ae799fe93e547a96a27630d74f2555892e6c5190135e50d8f3bf1
Expand Down
18 changes: 8 additions & 10 deletions e2e/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ module github.com/bloxapp/ssv/e2e
go 1.20

require (
github.com/attestantio/go-eth2-client v0.19.11-0.20240129201044-9d799aaab2bd
github.com/attestantio/go-eth2-client v0.21.9
github.com/bloxapp/ssv v1.2.1-0.20240204104853-e3a662984cac
github.com/go-chi/chi/v5 v5.0.10
github.com/pkg/errors v0.9.1
github.com/rs/zerolog v1.31.0
github.com/rs/zerolog v1.32.0
github.com/sourcegraph/conc v0.3.0
go.uber.org/zap v1.26.0
)
Expand All @@ -17,17 +17,17 @@ require (
github.com/ferranbt/fastssz v0.1.3 // indirect
github.com/goccy/go-yaml v1.11.0 // indirect
github.com/holiman/uint256 v1.2.4 // indirect
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/mattn/go-colorable v0.1.13
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect
github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e // indirect
github.com/r3labs/sse/v2 v2.10.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/crypto v0.18.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/sys v0.16.0 // indirect
golang.org/x/crypto v0.23.0 // indirect
golang.org/x/net v0.21.0 // indirect
golang.org/x/sys v0.20.0 // indirect
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
Expand Down Expand Up @@ -116,7 +116,7 @@ require (
go.opentelemetry.io/otel/metric v1.16.0 // indirect
go.opentelemetry.io/otel/trace v1.16.0 // indirect
golang.org/x/mod v0.11.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/text v0.15.0 // indirect
golang.org/x/time v0.5.0 // indirect
golang.org/x/tools v0.9.1 // indirect
google.golang.org/protobuf v1.30.0 // indirect
Expand All @@ -125,5 +125,3 @@ require (
gotest.tools/v3 v3.5.1 // indirect
lukechampine.com/blake3 v1.2.1 // indirect
)

replace github.com/attestantio/go-eth2-client => github.com/moshe-blox/go-eth2-client v0.7.2-0.20240204094454-17f5c145f39f
8 changes: 8 additions & 0 deletions e2e/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ github.com/alecthomas/assert/v2 v2.1.0 h1:tbredtNcQnoSd3QBhQWI7QZ3XHOVkw1Moklp2o
github.com/alecthomas/kong v0.8.1 h1:acZdn3m4lLRobeh3Zi2S2EpnXTd1mOL6U7xVml+vfkY=
github.com/alecthomas/kong v0.8.1/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U=
github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE=
github.com/attestantio/go-eth2-client v0.21.9/go.mod h1:d7ZPNrMX8jLfIgML5u7QZxFo2AukLM+5m08iMaLdqb8=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
Expand Down Expand Up @@ -189,6 +190,7 @@ github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/d
github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
Expand Down Expand Up @@ -293,6 +295,7 @@ github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+Pymzi
github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw=
github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4=
github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4=
github.com/prysmaticlabs/prysm/v4 v4.0.8 h1:F6Rt5gpaxbW50aP63jMmSXE16JW42HaEzUT55L9laaM=
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
github.com/quic-go/qtls-go1-19 v0.3.3 h1:wznEHvJwd+2X3PqftRha0SUKmGsnb6dfArMhy9PeJVE=
Expand All @@ -307,6 +310,7 @@ github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDN
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A=
github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
Expand Down Expand Up @@ -375,6 +379,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU=
golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
Expand Down Expand Up @@ -404,6 +409,7 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su
golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
Expand Down Expand Up @@ -444,6 +450,7 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
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=
Expand All @@ -454,6 +461,7 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
Expand Down
Loading

0 comments on commit 37752f6

Please sign in to comment.