diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e6f33a..3e39926 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +dev: + - initial support for deneb + 1.30.0: - add "chain spec" command - add "validator withdrawal" command diff --git a/beacon/chaininfo.go b/beacon/chaininfo.go index f98b537..7f96179 100644 --- a/beacon/chaininfo.go +++ b/beacon/chaininfo.go @@ -269,7 +269,7 @@ func ObtainChainInfoFromNode(ctx context.Context, } tmp, exists := spec["GENESIS_FORK_VERSION"] if !exists { - return nil, errors.New("capella fork version not known by chain") + return nil, errors.New("genesis fork version not known by chain") } var isForkVersion bool res.GenesisForkVersion, isForkVersion = tmp.(phase0.Version) diff --git a/cmd/block/analyze/process.go b/cmd/block/analyze/process.go index 9003ac0..00af8a0 100644 --- a/cmd/block/analyze/process.go +++ b/cmd/block/analyze/process.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Weald Technology Trading. +// Copyright © 2022, 2023 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 @@ -439,6 +439,13 @@ func (c *command) analyzeSyncCommittees(_ context.Context, block *spec.Versioned c.analysis.SyncCommitee.Value = c.analysis.SyncCommitee.Score * float64(c.analysis.SyncCommitee.Contributions) c.analysis.Value += c.analysis.SyncCommitee.Value return nil + case spec.DataVersionDeneb: + c.analysis.SyncCommitee.Contributions = int(block.Deneb.Message.Body.SyncAggregate.SyncCommitteeBits.Count()) + c.analysis.SyncCommitee.PossibleContributions = int(block.Deneb.Message.Body.SyncAggregate.SyncCommitteeBits.Len()) + c.analysis.SyncCommitee.Score = float64(c.syncRewardWeight) / float64(c.weightDenominator) + c.analysis.SyncCommitee.Value = c.analysis.SyncCommitee.Score * float64(c.analysis.SyncCommitee.Contributions) + c.analysis.Value += c.analysis.SyncCommitee.Value + return nil default: return fmt.Errorf("unsupported block version %d", block.Version) } diff --git a/cmd/block/info/output.go b/cmd/block/info/output.go index c7f170e..227d119 100644 --- a/cmd/block/info/output.go +++ b/cmd/block/info/output.go @@ -1,4 +1,4 @@ -// Copyright © 2019, 2020, 2021 Weald Technology Trading +// Copyright © 2019 - 2023 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 @@ -28,6 +28,7 @@ import ( "github.com/attestantio/go-eth2-client/spec/altair" "github.com/attestantio/go-eth2-client/spec/bellatrix" "github.com/attestantio/go-eth2-client/spec/capella" + "github.com/attestantio/go-eth2-client/spec/deneb" "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/pkg/errors" "github.com/prysmaticlabs/go-bitfield" @@ -388,6 +389,108 @@ func outputCapellaBlockText(ctx context.Context, data *dataOut, signedBlock *cap return res.String(), nil } +func outputDenebBlockText(ctx context.Context, data *dataOut, signedBlock *deneb.SignedBeaconBlock) (string, error) { + if signedBlock == nil { + return "", errors.New("no block supplied") + } + + body := signedBlock.Message.Body + + res := strings.Builder{} + + // General info. + blockRoot, err := signedBlock.Message.HashTreeRoot() + if err != nil { + return "", errors.Wrap(err, "failed to obtain block root") + } + bodyRoot, err := signedBlock.Message.Body.HashTreeRoot() + if err != nil { + return "", errors.Wrap(err, "failed to generate body root") + } + + tmp, err := outputBlockGeneral(ctx, + data.verbose, + signedBlock.Message.Slot, + blockRoot, + 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) + + tmp, err = outputBlockBLSToExecutionChanges(ctx, data.eth2Client, data.verbose, signedBlock.Message.Body.BLSToExecutionChanges) + if err != nil { + return "", err + } + res.WriteString(tmp) + + tmp, err = outputDenebBlockExecutionPayload(ctx, data.verbose, signedBlock.Message.Body.ExecutionPayload) + if err != nil { + return "", err + } + res.WriteString(tmp) + + tmp, err = outputDenebBlobInfo(ctx, data.verbose, signedBlock.Message.Body) + if err != nil { + return "", err + } + res.WriteString(tmp) + + return res.String(), nil +} + func outputBellatrixBlockText(ctx context.Context, data *dataOut, signedBlock *bellatrix.SignedBeaconBlock) (string, error) { if signedBlock == nil { return "", errors.New("no block supplied") @@ -706,6 +809,97 @@ func outputCapellaBlockExecutionPayload(_ context.Context, return res.String(), nil } +func outputDenebBlockExecutionPayload(_ context.Context, + verbose bool, + payload *deneb.ExecutionPayload, +) ( + string, + error, +) { + if payload == nil { + return "", nil + } + + // If the block number is 0 then we're before the merge. + if payload.BlockNumber == 0 { + return "", nil + } + + res := strings.Builder{} + if !verbose { + res.WriteString("Execution block number: ") + res.WriteString(fmt.Sprintf("%d\n", payload.BlockNumber)) + res.WriteString("Transactions: ") + res.WriteString(fmt.Sprintf("%d\n", len(payload.Transactions))) + } else { + res.WriteString("Execution payload:\n") + res.WriteString(" Execution block number: ") + res.WriteString(fmt.Sprintf("%d\n", payload.BlockNumber)) + res.WriteString(" Base fee per gas: ") + res.WriteString(string2eth.WeiToString(payload.BaseFeePerGas.ToBig(), true)) + res.WriteString("\n Block hash: ") + res.WriteString(fmt.Sprintf("%#x\n", payload.BlockHash)) + res.WriteString(" Parent hash: ") + res.WriteString(fmt.Sprintf("%#x\n", payload.ParentHash)) + res.WriteString(" Fee recipient: ") + res.WriteString(fmt.Sprintf("%#x\n", payload.FeeRecipient)) + res.WriteString(" Gas limit: ") + res.WriteString(fmt.Sprintf("%d\n", payload.GasLimit)) + res.WriteString(" Gas used: ") + res.WriteString(fmt.Sprintf("%d\n", payload.GasUsed)) + res.WriteString(" Timestamp: ") + res.WriteString(fmt.Sprintf("%s (%d)\n", time.Unix(int64(payload.Timestamp), 0).String(), payload.Timestamp)) + res.WriteString(" Prev RANDAO: ") + res.WriteString(fmt.Sprintf("%#x\n", payload.PrevRandao)) + res.WriteString(" Receipts root: ") + res.WriteString(fmt.Sprintf("%#x\n", payload.ReceiptsRoot)) + res.WriteString(" State root: ") + res.WriteString(fmt.Sprintf("%#x\n", payload.StateRoot)) + res.WriteString(" Extra data: ") + if utf8.Valid(payload.ExtraData) { + res.WriteString(fmt.Sprintf("%s\n", string(payload.ExtraData))) + } else { + res.WriteString(fmt.Sprintf("%#x\n", payload.ExtraData)) + } + res.WriteString(" Logs bloom: ") + res.WriteString(fmt.Sprintf("%#x\n", payload.LogsBloom)) + res.WriteString(" Transactions: ") + res.WriteString(fmt.Sprintf("%d\n", len(payload.Transactions))) + res.WriteString(" Withdrawals: ") + res.WriteString(fmt.Sprintf("%d\n", len(payload.Withdrawals))) + res.WriteString(" Excess data gas: ") + res.WriteString(payload.ExcessDataGas.Dec()) + res.WriteString("\n") + } + + return res.String(), nil +} + +func outputDenebBlobInfo(_ context.Context, + verbose bool, + body *deneb.BeaconBlockBody, +) ( + string, + error, +) { + if body == nil { + return "", nil + } + + res := strings.Builder{} + + if !verbose { + res.WriteString(fmt.Sprintf("Blob KZG commitments: %d\n", len(body.BlobKzgCommitments))) + } else if len(body.BlobKzgCommitments) > 0 { + res.WriteString("Blob KZG commitments:\n") + for i := range body.BlobKzgCommitments { + res.WriteString(fmt.Sprintf(" %s\n", body.BlobKzgCommitments[i].String())) + } + } + + return res.String(), nil +} + func outputBellatrixBlockExecutionPayload(_ context.Context, verbose bool, payload *bellatrix.ExecutionPayload, diff --git a/cmd/block/info/process.go b/cmd/block/info/process.go index 0e0a802..23eb3fc 100644 --- a/cmd/block/info/process.go +++ b/cmd/block/info/process.go @@ -25,6 +25,7 @@ import ( "github.com/attestantio/go-eth2-client/spec/altair" "github.com/attestantio/go-eth2-client/spec/bellatrix" "github.com/attestantio/go-eth2-client/spec/capella" + "github.com/attestantio/go-eth2-client/spec/deneb" "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/pkg/errors" ) @@ -85,6 +86,10 @@ func process(ctx context.Context, data *dataIn) (*dataOut, error) { if err := outputCapellaBlock(ctx, data.jsonOutput, data.sszOutput, signedBlock.Capella); err != nil { return nil, errors.Wrap(err, "failed to output block") } + case spec.DataVersionDeneb: + if err := outputDenebBlock(ctx, data.jsonOutput, data.sszOutput, signedBlock.Deneb); err != nil { + return nil, errors.Wrap(err, "failed to output block") + } default: return nil, errors.New("unknown block version") } @@ -125,41 +130,26 @@ func headEventHandler(event *api.Event) { } return } + switch signedBlock.Version { case spec.DataVersionPhase0: - if err := outputPhase0Block(context.Background(), jsonOutput, signedBlock.Phase0); err != nil { - if !jsonOutput && !sszOutput { - fmt.Printf("Failed to output block: %v\n", err) - } - return - } + err = outputPhase0Block(context.Background(), jsonOutput, signedBlock.Phase0) case spec.DataVersionAltair: - if err := outputAltairBlock(context.Background(), jsonOutput, sszOutput, signedBlock.Altair); err != nil { - if !jsonOutput && !sszOutput { - fmt.Printf("Failed to output block: %v\n", err) - } - return - } + err = outputAltairBlock(context.Background(), jsonOutput, sszOutput, signedBlock.Altair) case spec.DataVersionBellatrix: - if err := outputBellatrixBlock(context.Background(), jsonOutput, sszOutput, signedBlock.Bellatrix); err != nil { - if !jsonOutput && !sszOutput { - fmt.Printf("Failed to output block: %v\n", err) - } - return - } + err = outputBellatrixBlock(context.Background(), jsonOutput, sszOutput, signedBlock.Bellatrix) case spec.DataVersionCapella: - if err := outputCapellaBlock(context.Background(), jsonOutput, sszOutput, signedBlock.Capella); err != nil { - if !jsonOutput && !sszOutput { - fmt.Printf("Failed to output block: %v\n", err) - } - return - } + err = outputCapellaBlock(context.Background(), jsonOutput, sszOutput, signedBlock.Capella) + case spec.DataVersionDeneb: + err = outputDenebBlock(context.Background(), jsonOutput, sszOutput, signedBlock.Deneb) default: - if !jsonOutput && !sszOutput { - fmt.Printf("Unknown block version: %v\n", signedBlock.Version) - } + err = errors.New("unknown block version") + } + if err != nil && !jsonOutput && !sszOutput { + fmt.Printf("Failed to output block: %v\n", err) return } + if !jsonOutput && !sszOutput { fmt.Println("") } @@ -254,3 +244,27 @@ func outputCapellaBlock(ctx context.Context, jsonOutput bool, sszOutput bool, si } return nil } + +func outputDenebBlock(ctx context.Context, jsonOutput bool, sszOutput bool, signedBlock *deneb.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)) + case sszOutput: + data, err := signedBlock.MarshalSSZ() + if err != nil { + return errors.Wrap(err, "failed to generate SSZ") + } + fmt.Printf("%x\n", data) + default: + data, err := outputDenebBlockText(ctx, results, signedBlock) + if err != nil { + return errors.Wrap(err, "failed to generate text") + } + fmt.Print(data) + } + return nil +} diff --git a/cmd/chain/eth1votes/process.go b/cmd/chain/eth1votes/process.go index 5400d05..88882a4 100644 --- a/cmd/chain/eth1votes/process.go +++ b/cmd/chain/eth1votes/process.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Weald Technology Trading. +// Copyright © 2022, 2023 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 @@ -90,6 +90,10 @@ func (c *command) process(ctx context.Context) error { c.slot = state.Capella.Slot c.incumbent = state.Capella.ETH1Data c.eth1DataVotes = state.Capella.ETH1DataVotes + case spec.DataVersionDeneb: + c.slot = state.Deneb.Slot + c.incumbent = state.Deneb.ETH1Data + c.eth1DataVotes = state.Deneb.ETH1DataVotes default: return fmt.Errorf("unhandled beacon state version %v", state.Version) } diff --git a/cmd/epoch/summary/process.go b/cmd/epoch/summary/process.go index c488dee..d2dfaa4 100644 --- a/cmd/epoch/summary/process.go +++ b/cmd/epoch/summary/process.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Weald Technology Trading. +// Copyright © 2022, 2023 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 @@ -287,6 +287,8 @@ func (c *command) processSyncCommitteeDuties(ctx context.Context) error { aggregate = block.Bellatrix.Message.Body.SyncAggregate case spec.DataVersionCapella: aggregate = block.Capella.Message.Body.SyncAggregate + case spec.DataVersionDeneb: + aggregate = block.Deneb.Message.Body.SyncAggregate default: return fmt.Errorf("unhandled block version %v", block.Version) } diff --git a/cmd/synccommittee/inclusion/process.go b/cmd/synccommittee/inclusion/process.go index a63b93d..eebe541 100644 --- a/cmd/synccommittee/inclusion/process.go +++ b/cmd/synccommittee/inclusion/process.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Weald Technology Trading. +// Copyright © 2022, 2023 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 @@ -98,6 +98,13 @@ func (c *command) process(ctx context.Context) error { } else { c.inclusions = append(c.inclusions, 2) } + case spec.DataVersionDeneb: + aggregate = block.Deneb.Message.Body.SyncAggregate + if aggregate.SyncCommitteeBits.BitAt(c.committeeIndex) { + c.inclusions = append(c.inclusions, 1) + } else { + c.inclusions = append(c.inclusions, 2) + } default: return fmt.Errorf("unhandled block version %v", block.Version) } diff --git a/cmd/validator/withdrawal/process.go b/cmd/validator/withdrawal/process.go index 1e7066c..6b8e3ea 100644 --- a/cmd/validator/withdrawal/process.go +++ b/cmd/validator/withdrawal/process.go @@ -78,6 +78,12 @@ func (c *command) process(ctx context.Context) error { return errors.New("block without withdrawals; cannot obtain next withdrawal validator index") } nextWithdrawalValidatorIndex = phase0.ValidatorIndex((int(withdrawals[len(withdrawals)-1].ValidatorIndex) + 1) % len(validators)) + case spec.DataVersionDeneb: + withdrawals := block.Deneb.Message.Body.ExecutionPayload.Withdrawals + if len(withdrawals) == 0 { + return errors.New("block without withdrawals; cannot obtain next withdrawal validator index") + } + nextWithdrawalValidatorIndex = phase0.ValidatorIndex((int(withdrawals[len(withdrawals)-1].ValidatorIndex) + 1) % len(validators)) default: return fmt.Errorf("unhandled block version %v", block.Version) } diff --git a/cmd/validatorexit.go b/cmd/validatorexit.go index b6748c1..2dce770 100644 --- a/cmd/validatorexit.go +++ b/cmd/validatorexit.go @@ -54,7 +54,7 @@ In quiet mode this will return 0 if the exit operation has been generated (and s func init() { validatorCmd.AddCommand(validatorExitCmd) validatorFlags(validatorExitCmd) - validatorExitCmd.Flags().Int64("epoch", -1, "Epoch at which to exit (defaults to current epoch)") + validatorExitCmd.Flags().String("epoch", "", "Epoch at which to exit (defaults to current epoch)") validatorExitCmd.Flags().Bool("prepare-offline", false, "Create files for offline use") validatorExitCmd.Flags().String("validator", "", "Validator to exit") validatorExitCmd.Flags().String("signed-operation", "", "Use pre-defined JSON signed operation as created by --json to transmit the exit operation (reads from exit-operation.json if not present)") diff --git a/go.mod b/go.mod index 480cea3..02e91c5 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/wealdtech/ethdo go 1.20 require ( - github.com/attestantio/go-eth2-client v0.15.8 + github.com/attestantio/go-eth2-client v0.16.0 github.com/ferranbt/fastssz v0.1.3 github.com/gofrs/uuid v4.4.0+incompatible github.com/google/uuid v1.3.0 @@ -54,6 +54,7 @@ require ( github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect + github.com/holiman/uint256 v1.2.2 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/puddle v1.3.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect diff --git a/go.sum b/go.sum index 221989a..abf42ad 100644 --- a/go.sum +++ b/go.sum @@ -48,8 +48,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/attestantio/go-eth2-client v0.15.8 h1:ndeqKacjT3vDD8yJVGe7CGmyrhVbQleBCYIPsULzGMM= -github.com/attestantio/go-eth2-client v0.15.8/go.mod h1:PLRKnILnr63V3yl2VagBqnhVRFBWc0V+JhQSsXQaSwQ= +github.com/attestantio/go-eth2-client v0.16.0 h1:PdO+Z9il00oDSkURsR8miT4VV/11Y/aBC6y3R3jQDus= +github.com/attestantio/go-eth2-client v0.16.0/go.mod h1:ES/aAi5Pog4l8ZCXRvAGnbLdSuoa0I9kZ6aet/aRC8g= github.com/aws/aws-sdk-go v1.44.213 h1:WahquyWs7cQdz0vpDVWyWETEemgSoORx0PbWL9oz2WA= github.com/aws/aws-sdk-go v1.44.213/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -70,7 +70,6 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= 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/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -93,7 +92,6 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= github.com/ferranbt/fastssz v0.1.3 h1:ZI+z3JH05h4kgmFXdHuR1aWYsgrg7o+Fw7/NCzM16Mo= github.com/ferranbt/fastssz v0.1.3/go.mod h1:0Y9TEd/9XuFlh7mskMPfXiI2Dkw4Ddg9EyXt1W7MRvE= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= @@ -159,9 +157,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.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -205,6 +201,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v1.29.1 h1:XcNSHYTyNjEUVfWDCE2gtG5r95biTwd7MJUJF09LtSE= github.com/herumi/bls-eth-go-binary v1.29.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/holiman/uint256 v1.2.2 h1:TXKcSGc2WaxPD2+bmzAsVthL4+pEN0YwXcL5qED83vk= +github.com/holiman/uint256 v1.2.2/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -226,8 +224,6 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.2/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -235,7 +231,6 @@ 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.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -261,7 +256,6 @@ github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -315,15 +309,12 @@ github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4 github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= 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/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= github.com/r3labs/sse/v2 v2.7.4 h1:pvCMswPDlXd/ZUFx1dry0LbXJNHXwWPulLcUGYwClc0= github.com/r3labs/sse/v2 v2.7.4/go.mod h1:hUrYMKfu9WquG9MyI0r6TKiNH+6Sw/QPKm2YbNbU5g8= 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 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= -github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w= github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -406,7 +397,6 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -432,7 +422,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh 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-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -468,7 +457,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -506,7 +494,6 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -536,7 +523,6 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -588,7 +574,6 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -600,7 +585,6 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -668,7 +652,6 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/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.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -800,11 +783,9 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/services/chaintime/service.go b/services/chaintime/service.go index 1b2399d..bb24919 100644 --- a/services/chaintime/service.go +++ b/services/chaintime/service.go @@ -1,4 +1,4 @@ -// Copyright © 2021 Weald Technology Trading. +// Copyright © 2021 - 2023 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 @@ -60,4 +60,6 @@ type Service interface { AltairInitialSyncCommitteePeriod() uint64 // CapellaInitialEpoch provides the epoch at which the Capella hard fork takes place. CapellaInitialEpoch() phase0.Epoch + // DenebInitialEpoch provides the epoch at which the Deneb hard fork takes place. + DenebInitialEpoch() phase0.Epoch } diff --git a/services/chaintime/standard/service.go b/services/chaintime/standard/service.go index d1e93aa..8ef6dde 100644 --- a/services/chaintime/standard/service.go +++ b/services/chaintime/standard/service.go @@ -1,4 +1,4 @@ -// Copyright © 2021 Weald Technology Trading. +// Copyright © 2021 - 2023 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 @@ -33,6 +33,7 @@ type Service struct { altairForkEpoch phase0.Epoch bellatrixForkEpoch phase0.Epoch capellaForkEpoch phase0.Epoch + denebForkEpoch phase0.Epoch } // module-wide log. @@ -107,6 +108,13 @@ func New(ctx context.Context, params ...Parameter) (*Service, error) { } log.Trace().Uint64("epoch", uint64(capellaForkEpoch)).Msg("Obtained Capella fork epoch") + denebForkEpoch, err := fetchDenebForkEpoch(ctx, parameters.specProvider) + if err != nil { + // Set to far future epoch. + denebForkEpoch = 0xffffffffffffffff + } + log.Trace().Uint64("epoch", uint64(denebForkEpoch)).Msg("Obtained Deneb fork epoch") + s := &Service{ genesisTime: genesisTime, slotDuration: slotDuration, @@ -115,6 +123,7 @@ func New(ctx context.Context, params ...Parameter) (*Service, error) { altairForkEpoch: altairForkEpoch, bellatrixForkEpoch: bellatrixForkEpoch, capellaForkEpoch: capellaForkEpoch, + denebForkEpoch: denebForkEpoch, } return s, nil @@ -302,3 +311,32 @@ func fetchCapellaForkEpoch(ctx context.Context, return phase0.Epoch(epoch), nil } + +// DenebInitialEpoch provides the epoch at which the Deneb hard fork takes place. +func (s *Service) DenebInitialEpoch() phase0.Epoch { + return s.denebForkEpoch +} + +func fetchDenebForkEpoch(ctx context.Context, + specProvider eth2client.SpecProvider, +) ( + phase0.Epoch, + error, +) { + // Fetch the fork version. + spec, err := specProvider.Spec(ctx) + if err != nil { + return 0, errors.Wrap(err, "failed to obtain spec") + } + tmp, exists := spec["DENEB_FORK_EPOCH"] + if !exists { + return 0, errors.New("deneb fork version not known by chain") + } + epoch, isEpoch := tmp.(uint64) + if !isEpoch { + //nolint:revive + return 0, errors.New("DENEB_FORK_EPOCH is not a uint64!") + } + + return phase0.Epoch(epoch), nil +}