diff --git a/cmd/attester/inclusion/process.go b/cmd/attester/inclusion/process.go index 3b20b65..a86efa1 100644 --- a/cmd/attester/inclusion/process.go +++ b/cmd/attester/inclusion/process.go @@ -21,7 +21,7 @@ import ( eth2client "github.com/attestantio/go-eth2-client" api "github.com/attestantio/go-eth2-client/api/v1" - spec "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/pkg/errors" "github.com/wealdtech/ethdo/util" e2wtypes "github.com/wealdtech/go-eth2-wallet-types/v2" @@ -53,7 +53,7 @@ func process(ctx context.Context, data *dataIn) (*dataOut, error) { } // Fetch validator - pubKeys := make([]spec.BLSPubKey, 1) + pubKeys := make([]phase0.BLSPubKey, 1) pubKey, err := util.BestPublicKey(account) if err != nil { return nil, errors.Wrap(err, "failed to obtain public key for account") @@ -92,13 +92,21 @@ func process(ctx context.Context, data *dataIn) (*dataOut, error) { if signedBlock == nil { continue } - if signedBlock.Message.Slot != slot { + blockSlot, err := signedBlock.Slot() + if err != nil { + return nil, errors.Wrap(err, "failed to obtain block slot") + } + if blockSlot != slot { continue } if data.debug { fmt.Printf("Fetched block for slot %d\n", slot) } - for i, attestation := range signedBlock.Message.Body.Attestations { + attestations, err := signedBlock.Attestations() + if err != nil { + return nil, errors.Wrap(err, "failed to obtain block attestations") + } + for i, attestation := range attestations { if attestation.Data.Slot == duty.Slot && attestation.Data.Index == duty.CommitteeIndex && attestation.AggregationBits.BitAt(duty.ValidatorCommitteeIndex) { @@ -113,9 +121,9 @@ func process(ctx context.Context, data *dataIn) (*dataOut, error) { return results, nil } -func duty(ctx context.Context, eth2Client eth2client.Service, validator *api.Validator, epoch spec.Epoch, slotsPerEpoch uint64) (*api.AttesterDuty, error) { +func duty(ctx context.Context, eth2Client eth2client.Service, validator *api.Validator, epoch phase0.Epoch, slotsPerEpoch uint64) (*api.AttesterDuty, error) { // Find the attesting slot for the given epoch. - duties, err := eth2Client.(eth2client.AttesterDutiesProvider).AttesterDuties(ctx, epoch, []spec.ValidatorIndex{validator.Index}) + duties, err := eth2Client.(eth2client.AttesterDutiesProvider).AttesterDuties(ctx, epoch, []phase0.ValidatorIndex{validator.Index}) if err != nil { return nil, errors.Wrap(err, "failed to obtain attester duties") } diff --git a/cmd/block/info/output.go b/cmd/block/info/output.go index 102fed6..13248ac 100644 --- a/cmd/block/info/output.go +++ b/cmd/block/info/output.go @@ -1,4 +1,4 @@ -// Copyright © 2019, 2020 Weald Technology Trading +// Copyright © 2019, 2020, 2021 Weald Technology Trading // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -24,7 +24,8 @@ import ( "unicode/utf8" eth2client "github.com/attestantio/go-eth2-client" - spec "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/attestantio/go-eth2-client/spec/altair" + "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/pkg/errors" "github.com/prysmaticlabs/go-bitfield" "github.com/wealdtech/go-string2eth" @@ -47,34 +48,42 @@ func output(ctx context.Context, data *dataOut) (string, error) { return "", nil } -func outputBlockGeneral(ctx context.Context, verbose bool, block *spec.BeaconBlock, genesisTime time.Time, slotDuration time.Duration, slotsPerEpoch uint64) (string, error) { - bodyRoot, err := block.Body.HashTreeRoot() - if err != nil { - return "", errors.Wrap(err, "failed to generate block root") - } - +func outputBlockGeneral(ctx context.Context, + verbose bool, + slot phase0.Slot, + bodyRoot phase0.Root, + parentRoot phase0.Root, + stateRoot phase0.Root, + graffiti []byte, + genesisTime time.Time, + slotDuration time.Duration, + slotsPerEpoch uint64, +) ( + string, + error, +) { res := strings.Builder{} - res.WriteString(fmt.Sprintf("Slot: %d\n", block.Slot)) - res.WriteString(fmt.Sprintf("Epoch: %d\n", spec.Epoch(uint64(block.Slot)/slotsPerEpoch))) - res.WriteString(fmt.Sprintf("Timestamp: %v\n", time.Unix(genesisTime.Unix()+int64(block.Slot)*int64(slotDuration.Seconds()), 0))) + res.WriteString(fmt.Sprintf("Slot: %d\n", slot)) + res.WriteString(fmt.Sprintf("Epoch: %d\n", phase0.Epoch(uint64(slot)/slotsPerEpoch))) + res.WriteString(fmt.Sprintf("Timestamp: %v\n", time.Unix(genesisTime.Unix()+int64(slot)*int64(slotDuration.Seconds()), 0))) res.WriteString(fmt.Sprintf("Block root: %#x\n", bodyRoot)) if verbose { - res.WriteString(fmt.Sprintf("Parent root: %#x\n", block.ParentRoot)) - res.WriteString(fmt.Sprintf("State root: %#x\n", block.StateRoot)) + res.WriteString(fmt.Sprintf("Parent root: %#x\n", parentRoot)) + res.WriteString(fmt.Sprintf("State root: %#x\n", stateRoot)) } - if len(block.Body.Graffiti) > 0 && hex.EncodeToString(block.Body.Graffiti) != "0000000000000000000000000000000000000000000000000000000000000000" { - if utf8.Valid(block.Body.Graffiti) { - res.WriteString(fmt.Sprintf("Graffiti: %s\n", string(block.Body.Graffiti))) + if len(graffiti) > 0 && hex.EncodeToString(graffiti) != "0000000000000000000000000000000000000000000000000000000000000000" { + if utf8.Valid(graffiti) { + res.WriteString(fmt.Sprintf("Graffiti: %s\n", string(graffiti))) } else { - res.WriteString(fmt.Sprintf("Graffiti: %#x\n", block.Body.Graffiti)) + res.WriteString(fmt.Sprintf("Graffiti: %#x\n", graffiti)) } } return res.String(), nil } -func outputBlockETH1Data(ctx context.Context, eth1Data *spec.ETH1Data) (string, error) { +func outputBlockETH1Data(ctx context.Context, eth1Data *phase0.ETH1Data) (string, error) { res := strings.Builder{} res.WriteString(fmt.Sprintf("Ethereum 1 deposit count: %d\n", eth1Data.DepositCount)) @@ -84,10 +93,10 @@ func outputBlockETH1Data(ctx context.Context, eth1Data *spec.ETH1Data) (string, return res.String(), nil } -func outputBlockAttestations(ctx context.Context, eth2Client eth2client.Service, verbose bool, attestations []*spec.Attestation) (string, error) { +func outputBlockAttestations(ctx context.Context, eth2Client eth2client.Service, verbose bool, attestations []*phase0.Attestation) (string, error) { res := strings.Builder{} - validatorCommittees := make(map[spec.Slot]map[spec.CommitteeIndex][]spec.ValidatorIndex) + validatorCommittees := make(map[phase0.Slot]map[phase0.CommitteeIndex][]phase0.ValidatorIndex) res.WriteString(fmt.Sprintf("Attestations: %d\n", len(attestations))) if verbose { beaconCommitteesProvider, isProvider := eth2Client.(eth2client.BeaconCommitteesProvider) @@ -104,7 +113,7 @@ func outputBlockAttestations(ctx context.Context, eth2Client eth2client.Service, } for _, beaconCommittee := range beaconCommittees { if _, exists := validatorCommittees[beaconCommittee.Slot]; !exists { - validatorCommittees[beaconCommittee.Slot] = make(map[spec.CommitteeIndex][]spec.ValidatorIndex) + validatorCommittees[beaconCommittee.Slot] = make(map[phase0.CommitteeIndex][]phase0.ValidatorIndex) } validatorCommittees[beaconCommittee.Slot][beaconCommittee.Index] = beaconCommittee.Validators } @@ -113,7 +122,7 @@ func outputBlockAttestations(ctx context.Context, eth2Client eth2client.Service, res.WriteString(fmt.Sprintf(" Committee index: %d\n", att.Data.Index)) res.WriteString(fmt.Sprintf(" Attesters: %d/%d\n", att.AggregationBits.Count(), att.AggregationBits.Len())) - res.WriteString(fmt.Sprintf(" Aggregation bits: %s\n", bitsToString(att.AggregationBits))) + res.WriteString(fmt.Sprintf(" Aggregation bits: %s\n", bitlistToString(att.AggregationBits))) res.WriteString(fmt.Sprintf(" Attesting indices: %s\n", attestingIndices(att.AggregationBits, committees[att.Data.Index]))) res.WriteString(fmt.Sprintf(" Slot: %d\n", att.Data.Slot)) res.WriteString(fmt.Sprintf(" Beacon block root: %#x\n", att.Data.BeaconBlockRoot)) @@ -128,7 +137,7 @@ func outputBlockAttestations(ctx context.Context, eth2Client eth2client.Service, return res.String(), nil } -func outputBlockAttesterSlashings(ctx context.Context, eth2Client eth2client.Service, verbose bool, attesterSlashings []*spec.AttesterSlashing) (string, error) { +func outputBlockAttesterSlashings(ctx context.Context, eth2Client eth2client.Service, verbose bool, attesterSlashings []*phase0.AttesterSlashing) (string, error) { res := strings.Builder{} res.WriteString(fmt.Sprintf("Attester slashings: %d\n", len(attesterSlashings))) @@ -175,7 +184,7 @@ func outputBlockAttesterSlashings(ctx context.Context, eth2Client eth2client.Ser return res.String(), nil } -func outputBlockDeposits(ctx context.Context, verbose bool, deposits []*spec.Deposit) (string, error) { +func outputBlockDeposits(ctx context.Context, verbose bool, deposits []*phase0.Deposit) (string, error) { res := strings.Builder{} // Deposits. @@ -194,14 +203,14 @@ func outputBlockDeposits(ctx context.Context, verbose bool, deposits []*spec.Dep return res.String(), nil } -func outputBlockVoluntaryExits(ctx context.Context, eth2Client eth2client.Service, verbose bool, voluntaryExits []*spec.SignedVoluntaryExit) (string, error) { +func outputBlockVoluntaryExits(ctx context.Context, eth2Client eth2client.Service, verbose bool, voluntaryExits []*phase0.SignedVoluntaryExit) (string, error) { res := strings.Builder{} res.WriteString(fmt.Sprintf("Voluntary exits: %d\n", len(voluntaryExits))) if verbose { for i, voluntaryExit := range voluntaryExits { res.WriteString(fmt.Sprintf(" %d:\n", i)) - validators, err := eth2Client.(eth2client.ValidatorsProvider).Validators(ctx, "head", []spec.ValidatorIndex{voluntaryExit.Message.ValidatorIndex}) + validators, err := eth2Client.(eth2client.ValidatorsProvider).Validators(ctx, "head", []phase0.ValidatorIndex{voluntaryExit.Message.ValidatorIndex}) if err != nil { res.WriteString(fmt.Sprintf(" Error: failed to obtain validators: %v\n", err)) } else { @@ -214,7 +223,37 @@ func outputBlockVoluntaryExits(ctx context.Context, eth2Client eth2client.Servic return res.String(), nil } -func outputBlockText(ctx context.Context, data *dataOut, signedBlock *spec.SignedBeaconBlock) (string, error) { +func outputBlockSyncAggregate(ctx context.Context, eth2Client eth2client.Service, verbose bool, syncAggregate *altair.SyncAggregate, epoch phase0.Epoch) (string, error) { + res := strings.Builder{} + + res.WriteString("Sync aggregate: ") + res.WriteString(fmt.Sprintf("%d/%d\n", syncAggregate.SyncCommitteeBits.Count(), syncAggregate.SyncCommitteeBits.Len())) + if verbose { + res.WriteString(" Contributions: ") + res.WriteString(bitvectorToString(syncAggregate.SyncCommitteeBits)) + res.WriteString("\n") + + syncCommitteesProvider, isProvider := eth2Client.(eth2client.SyncCommitteesProvider) + if isProvider { + syncCommittee, err := syncCommitteesProvider.SyncCommittee(ctx, fmt.Sprintf("%d", epoch)) + if err != nil { + res.WriteString(fmt.Sprintf(" Error: failed to obtain sync committee: %v\n", err)) + } else { + res.WriteString(" Contributing validators:") + for i := uint64(0); i < syncAggregate.SyncCommitteeBits.Len(); i++ { + if syncAggregate.SyncCommitteeBits.BitAt(i) { + res.WriteString(fmt.Sprintf(" %d", syncCommittee.Validators[i])) + } + } + res.WriteString("\n") + } + } + } + + return res.String(), nil +} + +func outputAltairBlockText(ctx context.Context, data *dataOut, signedBlock *altair.SignedBeaconBlock) (string, error) { if signedBlock == nil { return "", errors.New("no block supplied") } @@ -224,7 +263,98 @@ func outputBlockText(ctx context.Context, data *dataOut, signedBlock *spec.Signe res := strings.Builder{} // General info. - tmp, err := outputBlockGeneral(ctx, data.verbose, signedBlock.Message, data.genesisTime, data.slotDuration, data.slotsPerEpoch) + bodyRoot, err := signedBlock.Message.Body.HashTreeRoot() + if err != nil { + return "", errors.Wrap(err, "failed to generate block root") + } + tmp, err := outputBlockGeneral(ctx, + data.verbose, + signedBlock.Message.Slot, + bodyRoot, + signedBlock.Message.ParentRoot, + signedBlock.Message.StateRoot, + signedBlock.Message.Body.Graffiti, + data.genesisTime, + data.slotDuration, + data.slotsPerEpoch) + if err != nil { + return "", err + } + res.WriteString(tmp) + + // Eth1 data. + if data.verbose { + tmp, err := outputBlockETH1Data(ctx, body.ETH1Data) + if err != nil { + return "", err + } + res.WriteString(tmp) + } + + // Sync aggregate. + tmp, err = outputBlockSyncAggregate(ctx, data.eth2Client, data.verbose, signedBlock.Message.Body.SyncAggregate, phase0.Epoch(uint64(signedBlock.Message.Slot)/data.slotsPerEpoch)) + if err != nil { + return "", err + } + res.WriteString(tmp) + + // Attestations. + tmp, err = outputBlockAttestations(ctx, data.eth2Client, data.verbose, signedBlock.Message.Body.Attestations) + if err != nil { + return "", err + } + res.WriteString(tmp) + + // Attester slashings. + tmp, err = outputBlockAttesterSlashings(ctx, data.eth2Client, data.verbose, signedBlock.Message.Body.AttesterSlashings) + if err != nil { + return "", err + } + res.WriteString(tmp) + + res.WriteString(fmt.Sprintf("Proposer slashings: %d\n", len(body.ProposerSlashings))) + // Add verbose proposer slashings. + + tmp, err = outputBlockDeposits(ctx, data.verbose, signedBlock.Message.Body.Deposits) + if err != nil { + return "", err + } + res.WriteString(tmp) + + // Voluntary exits. + tmp, err = outputBlockVoluntaryExits(ctx, data.eth2Client, data.verbose, signedBlock.Message.Body.VoluntaryExits) + if err != nil { + return "", err + } + res.WriteString(tmp) + + return res.String(), nil +} + +func outputPhase0BlockText(ctx context.Context, data *dataOut, signedBlock *phase0.SignedBeaconBlock) (string, error) { + if signedBlock == nil { + return "", errors.New("no block supplied") + } + + body := signedBlock.Message.Body + + res := strings.Builder{} + + // General info. + bodyRoot, err := signedBlock.Message.Body.HashTreeRoot() + if err != nil { + return "", errors.Wrap(err, "failed to generate block root") + } + tmp, err := outputBlockGeneral(ctx, + data.verbose, + signedBlock.Message.Slot, + bodyRoot, + signedBlock.Message.ParentRoot, + signedBlock.Message.StateRoot, + signedBlock.Message.Body.Graffiti, + data.genesisTime, + data.slotDuration, + data.slotsPerEpoch) if err != nil { return "", err } @@ -273,10 +403,10 @@ func outputBlockText(ctx context.Context, data *dataOut, signedBlock *spec.Signe } // intersection returns a list of items common between the two sets. -func intersection(set1 []uint64, set2 []uint64) []spec.ValidatorIndex { +func intersection(set1 []uint64, set2 []uint64) []phase0.ValidatorIndex { sort.Slice(set1, func(i, j int) bool { return set1[i] < set1[j] }) sort.Slice(set2, func(i, j int) bool { return set2[i] < set2[j] }) - res := make([]spec.ValidatorIndex, 0) + res := make([]phase0.ValidatorIndex, 0) set1Pos := 0 set2Pos := 0 @@ -287,7 +417,7 @@ func intersection(set1 []uint64, set2 []uint64) []spec.ValidatorIndex { case set2[set2Pos] < set1[set1Pos]: set2Pos++ default: - res = append(res, spec.ValidatorIndex(set1[set1Pos])) + res = append(res, phase0.ValidatorIndex(set1[set1Pos])) set1Pos++ set2Pos++ } @@ -296,7 +426,7 @@ func intersection(set1 []uint64, set2 []uint64) []spec.ValidatorIndex { return res } -func bitsToString(input bitfield.Bitlist) string { +func bitlistToString(input bitfield.Bitlist) string { bits := int(input.Len()) res := "" @@ -313,7 +443,24 @@ func bitsToString(input bitfield.Bitlist) string { return strings.TrimSpace(res) } -func attestingIndices(input bitfield.Bitlist, indices []spec.ValidatorIndex) string { +func bitvectorToString(input bitfield.Bitvector512) string { + bits := int(input.Len()) + + res := strings.Builder{} + for i := 0; i < bits; i++ { + if input.BitAt(uint64(i)) { + res.WriteString("✓") + } else { + res.WriteString("✕") + } + if i%8 == 7 && i != bits-1 { + res.WriteString(" ") + } + } + return res.String() +} + +func attestingIndices(input bitfield.Bitlist, indices []phase0.ValidatorIndex) string { bits := int(input.Len()) res := "" for i := 0; i < bits; i++ { diff --git a/cmd/block/info/process.go b/cmd/block/info/process.go index 7d3bb04..7bcbf90 100644 --- a/cmd/block/info/process.go +++ b/cmd/block/info/process.go @@ -21,7 +21,9 @@ import ( eth2client "github.com/attestantio/go-eth2-client" api "github.com/attestantio/go-eth2-client/api/v1" - spec "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/attestantio/go-eth2-client/spec" + "github.com/attestantio/go-eth2-client/spec/altair" + "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/pkg/errors" ) @@ -55,9 +57,20 @@ func process(ctx context.Context, data *dataIn) (*dataOut, error) { if err != nil { return nil, errors.Wrap(err, "failed to obtain beacon block") } - - if err := outputBlock(ctx, data.jsonOutput, signedBlock); err != nil { - return nil, errors.Wrap(err, "failed to output block") + if signedBlock == nil { + return nil, errors.New("empty beacon block") + } + switch signedBlock.Version { + case spec.DataVersionPhase0: + if err := outputPhase0Block(ctx, data.jsonOutput, signedBlock.Phase0); err != nil { + return nil, errors.Wrap(err, "failed to output block") + } + case spec.DataVersionAltair: + if err := outputAltairBlock(ctx, data.jsonOutput, signedBlock.Altair); err != nil { + return nil, errors.Wrap(err, "failed to output block") + } + default: + return nil, errors.New("unknown block version") } if data.stream { @@ -82,13 +95,30 @@ func headEventHandler(event *api.Event) { signedBlock, err := results.eth2Client.(eth2client.SignedBeaconBlockProvider).SignedBeaconBlock(context.Background(), blockID) if err != nil { fmt.Printf("Failed to obtain block: %v\n", err) + return } - if err := outputBlock(context.Background(), jsonOutput, signedBlock); err != nil { - fmt.Printf("Failed to display block: %v\n", err) + if signedBlock == nil { + fmt.Println("Empty beacon block") + return + } + switch signedBlock.Version { + case spec.DataVersionPhase0: + if err := outputPhase0Block(context.Background(), jsonOutput, signedBlock.Phase0); err != nil { + fmt.Printf("Failed to output block: %v\n", err) + return + } + case spec.DataVersionAltair: + if err := outputAltairBlock(context.Background(), jsonOutput, signedBlock.Altair); err != nil { + fmt.Printf("Failed to output block: %v\n", err) + return + } + default: + fmt.Printf("Unknown block version: %v\n", signedBlock.Version) + return } } -func outputBlock(ctx context.Context, jsonOutput bool, signedBlock *spec.SignedBeaconBlock) error { +func outputPhase0Block(ctx context.Context, jsonOutput bool, signedBlock *phase0.SignedBeaconBlock) error { switch { case jsonOutput: data, err := json.Marshal(signedBlock) @@ -97,7 +127,25 @@ func outputBlock(ctx context.Context, jsonOutput bool, signedBlock *spec.SignedB } fmt.Printf("%s\n", string(data)) default: - data, err := outputBlockText(ctx, results, signedBlock) + data, err := outputPhase0BlockText(ctx, results, signedBlock) + if err != nil { + return errors.Wrap(err, "failed to generate text") + } + fmt.Printf("%s\n", data) + } + return nil +} + +func outputAltairBlock(ctx context.Context, jsonOutput bool, signedBlock *altair.SignedBeaconBlock) error { + switch { + case jsonOutput: + data, err := json.Marshal(signedBlock) + if err != nil { + return errors.Wrap(err, "failed to generate JSON") + } + fmt.Printf("%s\n", string(data)) + default: + data, err := outputAltairBlockText(ctx, results, signedBlock) if err != nil { return errors.Wrap(err, "failed to generate text") } diff --git a/go.mod b/go.mod index 9bf89e4..2c05dd0 100644 --- a/go.mod +++ b/go.mod @@ -65,3 +65,5 @@ require ( google.golang.org/grpc v1.39.0 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect ) + +replace github.com/attestantio/go-eth2-client => ../../attestantio/go-eth2-client diff --git a/go.sum b/go.sum index 5327e28..878de11 100644 --- a/go.sum +++ b/go.sum @@ -68,9 +68,6 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/attestantio/dirk v1.0.2 h1:CYIRgQIbPqshwvgNJt98vV/ljhZmnAqfhQujoIpvGKg= github.com/attestantio/dirk v1.0.2/go.mod h1:QHXxAnKD9cpuPC7STamSW2nPXEn7YTypcNFPAKfWTFQ= -github.com/attestantio/go-eth2-client v0.6.15/go.mod h1:Hya4fp1ZLWAFI64qMhNbQgfY4StWiHulW4CFwu+vP3s= -github.com/attestantio/go-eth2-client v0.6.30 h1:dzf6Q19ubLAAzgzK8djljA2BhfJGA18nz5CCzfmuiDE= -github.com/attestantio/go-eth2-client v0.6.30/go.mod h1:OlJziQa8y46JEBzjOsvmA+n72yHqui+xNLAHOUbg/VU= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.33.17/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= @@ -155,9 +152,9 @@ github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/ferranbt/fastssz v0.0.0-20200728110133-0b6e349af87a/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= -github.com/ferranbt/fastssz v0.0.0-20201030134205-9b9624098321/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/ferranbt/fastssz v0.0.0-20210316165225-412ceaa5950e/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= +github.com/ferranbt/fastssz v0.0.0-20210526181520-7df50c8568f8 h1:zhTRgKvm7CQxlGwJ7KfqT1AYDr2Q/caS6qrC7fwEtxU= github.com/ferranbt/fastssz v0.0.0-20210526181520-7df50c8568f8/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/ferranbt/fastssz v0.0.0-20210719200358-90640294cb9c h1:R8HHtp9wrae6trZA2lgJtOhghKl16lWY4cG0l7hH8CM= github.com/ferranbt/fastssz v0.0.0-20210719200358-90640294cb9c/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= @@ -517,6 +514,8 @@ github.com/prysmaticlabs/go-bitfield v0.0.0-20200618145306-2ae0807bef65/go.mod h github.com/prysmaticlabs/go-bitfield v0.0.0-20210202205921-7fcea7c45dc8/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= github.com/prysmaticlabs/go-bitfield v0.0.0-20210706153858-5cb5ce8bdbfe h1:9rrmgQval2GOmtMAgGLdqcCEZLraNaN3k2mY+07cx64= github.com/prysmaticlabs/go-bitfield v0.0.0-20210706153858-5cb5ce8bdbfe/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= +github.com/prysmaticlabs/go-bitfield v0.0.0-20210607200045-4da71aaf6c2d h1:46gKr69IlRpv/ENdlzG0SWo5nMLKJxS3tI5NOSdZndQ= +github.com/prysmaticlabs/go-bitfield v0.0.0-20210607200045-4da71aaf6c2d/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388 h1:4bD+ujqGfY4zoDUF3q9MhdmpPXzdp03DYUIlXeQ72kk= github.com/prysmaticlabs/go-ssz v0.0.0-20210121151755-f6208871c388/go.mod h1:VecIJZrewdAuhVckySLFt2wAAHRME934bSDurP8ftkc= github.com/r3labs/sse/v2 v2.3.0 h1:R/UMa0ML6AYKQ8irQNHhY+204lz1LytDIdKhCxSVAd8= @@ -780,6 +779,9 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985 h1:4CSI6oo7cOjJKajidEljs9h+uP0rRZBPPPhcCbj5mw8= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1028,10 +1030,13 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210406143921-e86de6bf7a46/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= google.golang.org/genproto v0.0.0-20210803142424-70bd63adacf2 h1:0XmXV/Hi77Rbsx0ADebP/Epagwtf9/OP4FKpu6yZcjU= google.golang.org/genproto v0.0.0-20210803142424-70bd63adacf2/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1090,6 +1095,10 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v9 v9.30.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -1108,7 +1117,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=