diff --git a/cmd/test-cli/main.go b/cmd/test-cli/main.go index e249af91..e6f98550 100644 --- a/cmd/test-cli/main.go +++ b/cmd/test-cli/main.go @@ -10,7 +10,7 @@ import ( builderApi "github.com/attestantio/go-builder-client/api" builderSpec "github.com/attestantio/go-builder-client/spec" - eth2ApiV1Capella "github.com/attestantio/go-eth2-client/api/v1/capella" + eth2ApiV1Deneb "github.com/attestantio/go-eth2-client/api/v1/deneb" "github.com/attestantio/go-eth2-client/spec/altair" "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/ethereum/go-ethereum/common" @@ -75,12 +75,12 @@ func doGetHeader(v validatorPrivateData, boostEndpoint string, beaconNode Beacon log.WithError(err).WithField("currentBlockHash", currentBlockHash).Fatal("Could not get header") } - if getHeaderResp.Capella.Message == nil { + if getHeaderResp.Deneb.Message == nil { log.Fatal("Did not receive correct header") } - log.WithField("header", *getHeaderResp.Capella.Message).Info("Got header from boost") + log.WithField("header", *getHeaderResp.Deneb.Message).Info("Got header from boost") - ok, err := ssz.VerifySignature(getHeaderResp.Capella.Message, builderSigningDomain, getHeaderResp.Capella.Message.Pubkey[:], getHeaderResp.Capella.Signature[:]) + ok, err := ssz.VerifySignature(getHeaderResp.Deneb.Message, builderSigningDomain, getHeaderResp.Deneb.Message.Pubkey[:], getHeaderResp.Deneb.Signature[:]) if err != nil { log.WithError(err).Fatal("Could not verify builder bid signature") } @@ -94,12 +94,12 @@ func doGetHeader(v validatorPrivateData, boostEndpoint string, beaconNode Beacon func doGetPayload(v validatorPrivateData, boostEndpoint string, beaconNode Beacon, engineEndpoint string, builderSigningDomain, proposerSigningDomain phase0.Domain) { header := doGetHeader(v, boostEndpoint, beaconNode, engineEndpoint, builderSigningDomain) - blindedBeaconBlock := eth2ApiV1Capella.BlindedBeaconBlock{ + blindedBeaconBlock := eth2ApiV1Deneb.BlindedBeaconBlock{ Slot: 0, ProposerIndex: 0, ParentRoot: phase0.Root{}, StateRoot: phase0.Root{}, - Body: ð2ApiV1Capella.BlindedBeaconBlockBody{ + Body: ð2ApiV1Deneb.BlindedBeaconBlockBody{ RANDAOReveal: phase0.BLSSignature{}, ETH1Data: &phase0.ETH1Data{}, Graffiti: phase0.Hash32{}, @@ -109,7 +109,7 @@ func doGetPayload(v validatorPrivateData, boostEndpoint string, beaconNode Beaco Deposits: []*phase0.Deposit{}, VoluntaryExits: []*phase0.SignedVoluntaryExit{}, SyncAggregate: &altair.SyncAggregate{}, - ExecutionPayloadHeader: header.Capella.Message.Header, + ExecutionPayloadHeader: header.Deneb.Message.Header, }, } @@ -118,7 +118,7 @@ func doGetPayload(v validatorPrivateData, boostEndpoint string, beaconNode Beaco log.WithError(err).Fatal("could not sign blinded beacon block") } - payload := eth2ApiV1Capella.SignedBlindedBeaconBlock{ + payload := eth2ApiV1Deneb.SignedBlindedBeaconBlock{ Message: &blindedBeaconBlock, Signature: signature, } diff --git a/go.mod b/go.mod index c76bbf0e..33bce1ff 100644 --- a/go.mod +++ b/go.mod @@ -59,8 +59,8 @@ require ( require ( github.com/StackExchange/wmi v1.2.1 // indirect - github.com/attestantio/go-builder-client v0.4.2 - github.com/attestantio/go-eth2-client v0.19.10 + github.com/attestantio/go-builder-client v0.4.5 + github.com/attestantio/go-eth2-client v0.21.1 github.com/btcsuite/btcd v0.22.0-beta // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect @@ -69,7 +69,7 @@ require ( github.com/ferranbt/fastssz v0.1.3 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -82,8 +82,8 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.25.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/sys v0.18.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index a2363a82..bd641f6d 100644 --- a/go.sum +++ b/go.sum @@ -14,10 +14,10 @@ github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWk github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/attestantio/go-builder-client v0.4.2 h1:EycfAFqQV+ooc2z6hmTsbuH4TCLknr0aO0nHLHLMpJM= -github.com/attestantio/go-builder-client v0.4.2/go.mod h1:e02i/WO4fjs3/u9oIZEjiC8CK1Qyxy4cpiMMGKx4VqQ= -github.com/attestantio/go-eth2-client v0.19.10 h1:NLs9mcBvZpBTZ3du7Ey2NHQoj8d3UePY7pFBXX6C6qs= -github.com/attestantio/go-eth2-client v0.19.10/go.mod h1:TTz7YF6w4z6ahvxKiHuGPn6DbQn7gH6HPuWm/DEQeGE= +github.com/attestantio/go-builder-client v0.4.5 h1:L11DGcQbMMNNYLJyme2aLeruNK3lXZ7M9QzvpoMPNPs= +github.com/attestantio/go-builder-client v0.4.5/go.mod h1:ZMmatuguvfy/JRHF8eFUy9RQgkHzdslCCVMofiywRkE= +github.com/attestantio/go-eth2-client v0.21.1 h1:yvsMd/azPUbxiJzWZhgqfOJJRNF1zLvAJpcBXTHzyh8= +github.com/attestantio/go-eth2-client v0.21.1/go.mod h1:Tb412NpzhsC0sbtpXS4D51y5se6nDkWAi6amsJrqX9c= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -221,8 +221,8 @@ github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0 github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -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 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -396,8 +396,8 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -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.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= @@ -429,8 +429,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY 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-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +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= @@ -477,8 +477,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.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.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= diff --git a/server/mock/mock_relay.go b/server/mock/mock_relay.go index c74d2c87..abd04e28 100644 --- a/server/mock/mock_relay.go +++ b/server/mock/mock_relay.go @@ -11,7 +11,6 @@ import ( "time" builderApi "github.com/attestantio/go-builder-client/api" - builderApiCapella "github.com/attestantio/go-builder-client/api/capella" builderApiDeneb "github.com/attestantio/go-builder-client/api/deneb" builderApiV1 "github.com/attestantio/go-builder-client/api/v1" builderSpec "github.com/attestantio/go-builder-client/spec" @@ -172,29 +171,6 @@ func (m *Relay) defaultHandleRegisterValidator(w http.ResponseWriter, req *http. // method func (m *Relay) MakeGetHeaderResponse(value uint64, blockHash, parentHash, publicKey string, version spec.DataVersion) *builderSpec.VersionedSignedBuilderBid { switch version { - case spec.DataVersionCapella: - // Fill the payload with custom values. - message := &builderApiCapella.BuilderBid{ - Header: &capella.ExecutionPayloadHeader{ - BlockHash: HexToHash(blockHash), - ParentHash: HexToHash(parentHash), - WithdrawalsRoot: phase0.Root{}, - }, - Value: uint256.NewInt(value), - Pubkey: HexToPubkey(publicKey), - } - - // Sign the message. - signature, err := ssz.SignMessage(message, ssz.DomainBuilder, m.secretKey) - require.NoError(m.t, err) - - return &builderSpec.VersionedSignedBuilderBid{ - Version: spec.DataVersionCapella, - Capella: &builderApiCapella.SignedBuilderBid{ - Message: message, - Signature: signature, - }, - } case spec.DataVersionDeneb: message := &builderApiDeneb.BuilderBid{ Header: &deneb.ExecutionPayloadHeader{ @@ -219,7 +195,7 @@ func (m *Relay) MakeGetHeaderResponse(value uint64, blockHash, parentHash, publi Signature: signature, }, } - case spec.DataVersionUnknown, spec.DataVersionPhase0, spec.DataVersionAltair, spec.DataVersionBellatrix: + case spec.DataVersionUnknown, spec.DataVersionPhase0, spec.DataVersionAltair, spec.DataVersionBellatrix, spec.DataVersionCapella: return nil } return nil @@ -249,7 +225,7 @@ func (m *Relay) defaultHandleGetHeader(w http.ResponseWriter) { "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) if m.GetHeaderResponse != nil { response = m.GetHeaderResponse @@ -266,12 +242,20 @@ func (m *Relay) defaultHandleGetHeader(w http.ResponseWriter) { func (m *Relay) MakeGetPayloadResponse(parentHash, blockHash, feeRecipient string, blockNumber uint64, version spec.DataVersion) *builderApi.VersionedSubmitBlindedBlockResponse { return &builderApi.VersionedSubmitBlindedBlockResponse{ Version: version, - Capella: &capella.ExecutionPayload{ - ParentHash: HexToHash(parentHash), - BlockHash: HexToHash(blockHash), - BlockNumber: blockNumber, - FeeRecipient: HexToAddress(feeRecipient), - Withdrawals: make([]*capella.Withdrawal, 0), + Deneb: &builderApiDeneb.ExecutionPayloadAndBlobsBundle{ + ExecutionPayload: &deneb.ExecutionPayload{ + ParentHash: HexToHash(parentHash), + BlockHash: HexToHash(blockHash), + BlockNumber: blockNumber, + FeeRecipient: HexToAddress(feeRecipient), + BaseFeePerGas: uint256.NewInt(0), + Withdrawals: make([]*capella.Withdrawal, 0), + }, + BlobsBundle: &builderApiDeneb.BlobsBundle{ + Blobs: make([]deneb.Blob, 0), + Commitments: make([]deneb.KZGCommitment, 0), + Proofs: make([]deneb.KZGProof, 0), + }, }, } } @@ -300,7 +284,7 @@ func (m *Relay) DefaultHandleGetPayload(w http.ResponseWriter) { "0x534809bd2b6832edff8d8ce4cb0e50068804fd1ef432c8362ad708a74fdc0e46", "0xdb65fEd33dc262Fe09D9a2Ba8F80b329BA25f941", 12345, - spec.DataVersionCapella, + spec.DataVersionDeneb, ) if m.GetPayloadResponse != nil { diff --git a/server/mock/mock_types_test.go b/server/mock/mock_types_test.go index 462ae869..c0760bb1 100644 --- a/server/mock/mock_types_test.go +++ b/server/mock/mock_types_test.go @@ -3,9 +3,9 @@ package mock import ( "testing" - builderApiCapella "github.com/attestantio/go-builder-client/api/capella" + builderApiDeneb "github.com/attestantio/go-builder-client/api/deneb" "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/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -205,9 +205,10 @@ func TestHexToSignature(t *testing.T) { publicKey := hexutil.Encode(bls.PublicKeyToBytes(blsPublicKey)) - message := &builderApiCapella.BuilderBid{ - Header: &capella.ExecutionPayloadHeader{ - BlockHash: HexToHash("0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7"), + message := &builderApiDeneb.BuilderBid{ + Header: &deneb.ExecutionPayloadHeader{ + BlockHash: HexToHash("0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7"), + BaseFeePerGas: uint256.NewInt(0), }, Value: uint256.NewInt(12345), Pubkey: HexToPubkey(publicKey), diff --git a/server/service.go b/server/service.go index 46e37f94..493bd08f 100644 --- a/server/service.go +++ b/server/service.go @@ -18,11 +18,9 @@ import ( builderApi "github.com/attestantio/go-builder-client/api" builderApiV1 "github.com/attestantio/go-builder-client/api/v1" builderSpec "github.com/attestantio/go-builder-client/spec" - eth2ApiV1Capella "github.com/attestantio/go-eth2-client/api/v1/capella" eth2ApiV1Deneb "github.com/attestantio/go-eth2-client/api/v1/deneb" "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/flashbots/go-boost-utils/ssz" - "github.com/flashbots/go-boost-utils/utils" "github.com/flashbots/go-utils/httplogger" "github.com/flashbots/mev-boost/config" "github.com/flashbots/mev-boost/server/params" @@ -492,140 +490,6 @@ func (m *BoostService) handleGetHeader(w http.ResponseWriter, req *http.Request) m.respondOK(w, &result.response) } -func (m *BoostService) processCapellaPayload(w http.ResponseWriter, req *http.Request, log *logrus.Entry, payload *eth2ApiV1Capella.SignedBlindedBeaconBlock, body []byte) { - if payload.Message == nil || payload.Message.Body == nil || payload.Message.Body.ExecutionPayloadHeader == nil { - log.WithField("body", string(body)).Error("missing parts of the request payload from the beacon-node") - m.respondError(w, http.StatusBadRequest, "missing parts of the payload") - return - } - - // Get the slotUID for this slot - slotUID := "" - m.slotUIDLock.Lock() - if m.slotUID.slot == uint64(payload.Message.Slot) { - slotUID = m.slotUID.uid.String() - } else { - log.Warnf("latest slotUID is for slot %d rather than payload slot %d", m.slotUID.slot, payload.Message.Slot) - } - m.slotUIDLock.Unlock() - - // Prepare logger - ua := UserAgent(req.Header.Get("User-Agent")) - log = log.WithFields(logrus.Fields{ - "ua": ua, - "slot": payload.Message.Slot, - "blockHash": payload.Message.Body.ExecutionPayloadHeader.BlockHash.String(), - "parentHash": payload.Message.Body.ExecutionPayloadHeader.ParentHash.String(), - "slotUID": slotUID, - }) - - // Log how late into the slot the request starts - slotStartTimestamp := m.genesisTime + uint64(payload.Message.Slot)*config.SlotTimeSec - msIntoSlot := uint64(time.Now().UTC().UnixMilli()) - slotStartTimestamp*1000 - log.WithFields(logrus.Fields{ - "genesisTime": m.genesisTime, - "slotTimeSec": config.SlotTimeSec, - "msIntoSlot": msIntoSlot, - }).Infof("submitBlindedBlock request start - %d milliseconds into slot %d", msIntoSlot, payload.Message.Slot) - - // Get the bid! - bidKey := bidRespKey{slot: uint64(payload.Message.Slot), blockHash: payload.Message.Body.ExecutionPayloadHeader.BlockHash.String()} - m.bidsLock.Lock() - originalBid := m.bids[bidKey] - m.bidsLock.Unlock() - if originalBid.response.IsEmpty() { - log.Error("no bid for this getPayload payload found. was getHeader called before?") - } else if len(originalBid.relays) == 0 { - log.Warn("bid found but no associated relays") - } - - // Add request headers - headers := map[string]string{HeaderKeySlotUID: slotUID} - - // Prepare for requests - var wg sync.WaitGroup - var mu sync.Mutex - result := new(builderApi.VersionedSubmitBlindedBlockResponse) - - // Prepare the request context, which will be cancelled after the first successful response from a relay - requestCtx, requestCtxCancel := context.WithCancel(context.Background()) - defer requestCtxCancel() - - for _, relay := range m.relays { - wg.Add(1) - go func(relay types.RelayEntry) { - defer wg.Done() - url := relay.GetURI(params.PathGetPayload) - log := log.WithField("url", url) - log.Debug("calling getPayload") - - responsePayload := new(builderApi.VersionedSubmitBlindedBlockResponse) - _, err := SendHTTPRequestWithRetries(requestCtx, m.httpClientGetPayload, http.MethodPost, url, ua, headers, payload, responsePayload, m.requestMaxRetries, log) - if err != nil { - if errors.Is(requestCtx.Err(), context.Canceled) { - log.Info("request was cancelled") // this is expected, if payload has already been received by another relay - } else { - log.WithError(err).Error("error making request to relay") - } - return - } - - if getPayloadResponseIsEmpty(responsePayload) { - log.Error("response with empty data!") - return - } - - // Ensure the response blockhash matches the request - if payload.Message.Body.ExecutionPayloadHeader.BlockHash != responsePayload.Capella.BlockHash { - log.WithFields(logrus.Fields{ - "responseBlockHash": responsePayload.Capella.BlockHash.String(), - }).Error("requestBlockHash does not equal responseBlockHash") - return - } - - // Ensure the response blockhash matches the response block - calculatedBlockHash, err := utils.ComputeBlockHash(&builderApi.VersionedExecutionPayload{ - Version: responsePayload.Version, - Capella: responsePayload.Capella, - }, nil) - if err != nil { - log.WithError(err).Error("could not calculate block hash") - } else if responsePayload.Capella.BlockHash != calculatedBlockHash { - log.WithFields(logrus.Fields{ - "calculatedBlockHash": calculatedBlockHash.String(), - "responseBlockHash": responsePayload.Capella.BlockHash.String(), - }).Error("responseBlockHash does not equal hash calculated from response block") - } - - // Lock before accessing the shared payload - mu.Lock() - defer mu.Unlock() - - if requestCtx.Err() != nil { // request has been cancelled (or deadline exceeded) - return - } - - // Received successful response. Now cancel other requests and return immediately - requestCtxCancel() - *result = *responsePayload - log.Info("received payload from relay") - }(relay) - } - - // Wait for all requests to complete... - wg.Wait() - - // If no payload has been received from relay, log loudly about withholding! - if result.Capella == nil || result.Capella.BlockHash == nilHash { - originRelays := types.RelayEntriesToStrings(originalBid.relays) - log.WithField("relaysWithBid", strings.Join(originRelays, ", ")).Error("no payload received from relay!") - m.respondError(w, http.StatusBadGateway, errNoSuccessfulRelayResponse.Error()) - return - } - - m.respondOK(w, result) -} - func (m *BoostService) processDenebPayload(w http.ResponseWriter, req *http.Request, log *logrus.Entry, blindedBlock *eth2ApiV1Deneb.SignedBlindedBeaconBlock) { // Get the currentSlotUID for this slot currentSlotUID := "" @@ -781,14 +645,8 @@ func (m *BoostService) handleGetPayload(w http.ResponseWriter, req *http.Request // Decode the body now payload := new(eth2ApiV1Deneb.SignedBlindedBeaconBlock) if err := DecodeJSON(bytes.NewReader(body), payload); err != nil { - log.Debug("could not decode Deneb request payload, attempting to decode body into Capella payload") - payload := new(eth2ApiV1Capella.SignedBlindedBeaconBlock) - if err := DecodeJSON(bytes.NewReader(body), payload); err != nil { - log.WithError(err).WithField("body", string(body)).Error("could not decode request payload from the beacon-node (signed blinded beacon block)") - m.respondError(w, http.StatusBadRequest, err.Error()) - return - } - m.processCapellaPayload(w, req, log, payload, body) + log.WithError(err).WithField("body", string(body)).Error("could not decode request payload from the beacon-node (signed blinded beacon block)") + m.respondError(w, http.StatusBadRequest, err.Error()) return } m.processDenebPayload(w, req, log, payload) diff --git a/server/service_test.go b/server/service_test.go index 47d418aa..b91ccf91 100644 --- a/server/service_test.go +++ b/server/service_test.go @@ -18,7 +18,6 @@ import ( builderApiDeneb "github.com/attestantio/go-builder-client/api/deneb" builderApiV1 "github.com/attestantio/go-builder-client/api/v1" builderSpec "github.com/attestantio/go-builder-client/spec" - eth2ApiV1Capella "github.com/attestantio/go-eth2-client/api/v1/capella" eth2ApiV1Deneb "github.com/attestantio/go-eth2-client/api/v1/deneb" "github.com/attestantio/go-eth2-client/spec" "github.com/attestantio/go-eth2-client/spec/altair" @@ -91,27 +90,6 @@ func (be *testBackend) request(t *testing.T, method, path string, payload any) * return rr } -func blindedBlockToExecutionPayloadCapella(signedBlindedBeaconBlock *eth2ApiV1Capella.SignedBlindedBeaconBlock) *capella.ExecutionPayload { - header := signedBlindedBeaconBlock.Message.Body.ExecutionPayloadHeader - return &capella.ExecutionPayload{ - ParentHash: header.ParentHash, - FeeRecipient: header.FeeRecipient, - StateRoot: header.StateRoot, - ReceiptsRoot: header.ReceiptsRoot, - LogsBloom: header.LogsBloom, - PrevRandao: header.PrevRandao, - BlockNumber: header.BlockNumber, - GasLimit: header.GasLimit, - GasUsed: header.GasUsed, - Timestamp: header.Timestamp, - ExtraData: header.ExtraData, - BaseFeePerGas: header.BaseFeePerGas, - BlockHash: header.BlockHash, - Transactions: make([]bellatrix.Transaction, 0), - Withdrawals: make([]*capella.Withdrawal, 0), - } -} - func blindedBlockContentsToPayloadDeneb(signedBlindedBlockContents *eth2ApiV1Deneb.SignedBlindedBeaconBlock) *builderApiDeneb.ExecutionPayloadAndBlobsBundle { header := signedBlindedBlockContents.Message.Body.ExecutionPayloadHeader numBlobs := len(signedBlindedBlockContents.Message.Body.BlobKZGCommitments) @@ -208,7 +186,7 @@ func TestWebserverMaxHeaderSize(t *testing.T) { backend.boost.listenAddr = addr go func() { err := backend.boost.StartHTTPServer() - require.NoError(t, err) //nolint:testifylint + require.NoError(t, err) }() time.Sleep(time.Millisecond * 100) path := "http://" + addr + "?" + strings.Repeat("abc", 4000) // path with characters of size over 4kb @@ -349,9 +327,9 @@ func TestGetHeader(t *testing.T) { "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) - resp.Capella.Message.Header.BlockHash = nilHash + resp.Deneb.Message.Header.BlockHash = nilHash // 1/2 failing responses are okay backend.relays[0].GetHeaderResponse = resp @@ -376,7 +354,7 @@ func TestGetHeader(t *testing.T) { "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) // Simulate a different public key registered to mev-boost @@ -398,11 +376,11 @@ func TestGetHeader(t *testing.T) { "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) // Scramble the signature - backend.relays[0].GetHeaderResponse.Capella.Signature = phase0.BLSSignature{} + backend.relays[0].GetHeaderResponse.Deneb.Signature = phase0.BLSSignature{} rr := backend.request(t, http.MethodGet, path, nil) require.Equal(t, 1, backend.relays[0].GetRequestCount(path)) @@ -470,7 +448,7 @@ func TestGetHeaderBids(t *testing.T) { "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) // First relay will return signed response with value 12347. @@ -479,7 +457,7 @@ func TestGetHeaderBids(t *testing.T) { "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) // First relay will return signed response with value 12346. @@ -488,7 +466,7 @@ func TestGetHeaderBids(t *testing.T) { "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) // Run the request. @@ -519,7 +497,7 @@ func TestGetHeaderBids(t *testing.T) { "0xa38385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) backend.relays[1].GetHeaderResponse = backend.relays[1].MakeGetHeaderResponse( @@ -527,7 +505,7 @@ func TestGetHeaderBids(t *testing.T) { "0xa18385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) backend.relays[2].GetHeaderResponse = backend.relays[2].MakeGetHeaderResponse( @@ -535,7 +513,7 @@ func TestGetHeaderBids(t *testing.T) { "0xa28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) // Run the request. @@ -571,7 +549,7 @@ func TestGetHeaderBids(t *testing.T) { "0xa28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) // Run the request. @@ -594,7 +572,7 @@ func TestGetHeaderBids(t *testing.T) { "0xa28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) // Run the request. @@ -617,15 +595,15 @@ func TestGetPayload(t *testing.T) { path := "/eth/v1/builder/blinded_blocks" blockHash := mock.HexToHash("0x534809bd2b6832edff8d8ce4cb0e50068804fd1ef432c8362ad708a74fdc0e46") - payload := ð2ApiV1Capella.SignedBlindedBeaconBlock{ + payload := ð2ApiV1Deneb.SignedBlindedBeaconBlock{ Signature: mock.HexToSignature( "0x8c795f751f812eabbabdee85100a06730a9904a4b53eedaa7f546fe0e23cd75125e293c6b0d007aa68a9da4441929d16072668abb4323bb04ac81862907357e09271fe414147b3669509d91d8ffae2ec9c789a5fcd4519629b8f2c7de8d0cce9"), - Message: ð2ApiV1Capella.BlindedBeaconBlock{ + Message: ð2ApiV1Deneb.BlindedBeaconBlock{ Slot: 1, ProposerIndex: 1, ParentRoot: phase0.Root{0x01}, StateRoot: phase0.Root{0x02}, - Body: ð2ApiV1Capella.BlindedBeaconBlockBody{ + Body: ð2ApiV1Deneb.BlindedBeaconBlockBody{ RANDAOReveal: phase0.BLSSignature{0xa1}, ETH1Data: &phase0.ETH1Data{ BlockHash: blockHash[:], @@ -639,11 +617,12 @@ func TestGetPayload(t *testing.T) { Attestations: []*phase0.Attestation{}, Deposits: []*phase0.Deposit{}, VoluntaryExits: []*phase0.SignedVoluntaryExit{}, - ExecutionPayloadHeader: &capella.ExecutionPayloadHeader{ - ParentHash: mock.HexToHash("0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7"), - BlockHash: blockHash, - BlockNumber: 12345, - FeeRecipient: mock.HexToAddress("0xdb65fEd33dc262Fe09D9a2Ba8F80b329BA25f941"), + ExecutionPayloadHeader: &deneb.ExecutionPayloadHeader{ + ParentHash: mock.HexToHash("0xe28385e7bd68df656cd0042b74b69c3104b5356ed1f20eb69f1f925df47a3ab7"), + BlockHash: blockHash, + BlockNumber: 12345, + FeeRecipient: mock.HexToAddress("0xdb65fEd33dc262Fe09D9a2Ba8F80b329BA25f941"), + BaseFeePerGas: uint256.NewInt(100), }, }, }, @@ -658,14 +637,19 @@ func TestGetPayload(t *testing.T) { resp := new(builderApi.VersionedSubmitBlindedBlockResponse) err := json.Unmarshal(rr.Body.Bytes(), resp) require.NoError(t, err) - require.Equal(t, payload.Message.Body.ExecutionPayloadHeader.BlockHash, resp.Capella.BlockHash) + require.Equal(t, payload.Message.Body.ExecutionPayloadHeader.BlockHash, resp.Deneb.ExecutionPayload.BlockHash) }) t.Run("Bad response from relays", func(t *testing.T) { backend := newTestBackend(t, 2, time.Second) resp := &builderApi.VersionedSubmitBlindedBlockResponse{ - Version: spec.DataVersionCapella, - Capella: &capella.ExecutionPayload{Withdrawals: []*capella.Withdrawal{}}, + Version: spec.DataVersionDeneb, + Deneb: &builderApiDeneb.ExecutionPayloadAndBlobsBundle{ + ExecutionPayload: &deneb.ExecutionPayload{ + BaseFeePerGas: uint256.NewInt(0), + }, + BlobsBundle: &builderApiDeneb.BlobsBundle{}, + }, } // 1/2 failing responses are okay @@ -773,71 +757,6 @@ func TestEmptyTxRoot(t *testing.T) { require.Equal(t, "0x7ffe241ea60187fdb0187bfa22de35d1f9bed7ab061d9401fd47e34a54fbede1", txRootHex) } -func TestGetPayloadWithTestdata(t *testing.T) { - path := "/eth/v1/builder/blinded_blocks" - - testPayloadsFiles := []string{ - "../testdata/signed-blinded-beacon-block-capella.json", - } - - for _, fn := range testPayloadsFiles { - t.Run(fn, func(t *testing.T) { - jsonFile, err := os.Open(fn) - require.NoError(t, err) - defer jsonFile.Close() - signedBlindedBeaconBlock := new(eth2ApiV1Capella.SignedBlindedBeaconBlock) - require.NoError(t, DecodeJSON(jsonFile, &signedBlindedBeaconBlock)) - - backend := newTestBackend(t, 1, time.Second) - mockResp := builderApi.VersionedSubmitBlindedBlockResponse{ - Version: spec.DataVersionCapella, - Capella: &capella.ExecutionPayload{ - BlockHash: signedBlindedBeaconBlock.Message.Body.ExecutionPayloadHeader.BlockHash, - Withdrawals: make([]*capella.Withdrawal, 0), - }, - } - backend.relays[0].GetPayloadResponse = &mockResp - - rr := backend.request(t, http.MethodPost, path, signedBlindedBeaconBlock) - require.Equal(t, http.StatusOK, rr.Code, rr.Body.String()) - require.Equal(t, 1, backend.relays[0].GetRequestCount(path)) - - resp := new(builderApi.VersionedSubmitBlindedBlockResponse) - err = json.Unmarshal(rr.Body.Bytes(), resp) - require.NoError(t, err) - require.Equal(t, signedBlindedBeaconBlock.Message.Body.ExecutionPayloadHeader.BlockHash, resp.Capella.BlockHash) - }) - } -} - -func TestGetPayloadCapella(t *testing.T) { - // Load the signed blinded beacon block used for getPayload - jsonFile, err := os.Open("../testdata/signed-blinded-beacon-block-capella.json") - require.NoError(t, err) - defer jsonFile.Close() - signedBlindedBeaconBlock := new(eth2ApiV1Capella.SignedBlindedBeaconBlock) - require.NoError(t, DecodeJSON(jsonFile, &signedBlindedBeaconBlock)) - - backend := newTestBackend(t, 1, time.Second) - - // Prepare getPayload response - backend.relays[0].GetPayloadResponse = &builderApi.VersionedSubmitBlindedBlockResponse{ - Version: spec.DataVersionCapella, - Capella: blindedBlockToExecutionPayloadCapella(signedBlindedBeaconBlock), - } - - // call getPayload, ensure it's only called on relay 0 (origin of the bid) - getPayloadPath := "/eth/v1/builder/blinded_blocks" - rr := backend.request(t, http.MethodPost, getPayloadPath, signedBlindedBeaconBlock) - require.Equal(t, http.StatusOK, rr.Code, rr.Body.String()) - require.Equal(t, 1, backend.relays[0].GetRequestCount(getPayloadPath)) - - resp := new(builderApi.VersionedSubmitBlindedBlockResponse) - err = json.Unmarshal(rr.Body.Bytes(), resp) - require.NoError(t, err) - require.Equal(t, signedBlindedBeaconBlock.Message.Body.ExecutionPayloadHeader.BlockHash, resp.Capella.BlockHash) -} - func TestGetPayloadDeneb(t *testing.T) { // Load the signed blinded beacon block used for getPayload jsonFile, err := os.Open("../testdata/signed-blinded-beacon-block-deneb.json") @@ -868,10 +787,10 @@ func TestGetPayloadDeneb(t *testing.T) { func TestGetPayloadToAllRelays(t *testing.T) { // Load the signed blinded beacon block used for getPayload - jsonFile, err := os.Open("../testdata/signed-blinded-beacon-block-capella.json") + jsonFile, err := os.Open("../testdata/signed-blinded-beacon-block-deneb.json") require.NoError(t, err) defer jsonFile.Close() - signedBlindedBeaconBlock := new(eth2ApiV1Capella.SignedBlindedBeaconBlock) + signedBlindedBeaconBlock := new(eth2ApiV1Deneb.SignedBlindedBeaconBlock) require.NoError(t, DecodeJSON(jsonFile, &signedBlindedBeaconBlock)) // Create a test backend with 2 relays @@ -884,7 +803,7 @@ func TestGetPayloadToAllRelays(t *testing.T) { "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", "0x8a1d7b8dd64e0aafe7ea7b6c95065c9364cf99d38470c12ee807d55f7de1529ad29ce2c422e0b65e3d5a05c02caca249", - spec.DataVersionCapella, + spec.DataVersionDeneb, ) rr := backend.request(t, http.MethodGet, getHeaderPath, nil) require.Equal(t, http.StatusOK, rr.Code, rr.Body.String()) @@ -893,8 +812,8 @@ func TestGetPayloadToAllRelays(t *testing.T) { // Prepare getPayload response backend.relays[0].GetPayloadResponse = &builderApi.VersionedSubmitBlindedBlockResponse{ - Version: spec.DataVersionCapella, - Capella: blindedBlockToExecutionPayloadCapella(signedBlindedBeaconBlock), + Version: spec.DataVersionDeneb, + Deneb: blindedBlockContentsToPayloadDeneb(signedBlindedBeaconBlock), } // call getPayload, ensure it's called to all relays diff --git a/server/utils.go b/server/utils.go index 7c7fb0cb..3d493e20 100644 --- a/server/utils.go +++ b/server/utils.go @@ -247,17 +247,13 @@ func checkRelaySignature(bid *builderSpec.VersionedSignedBuilderBid, domain phas func getPayloadResponseIsEmpty(payload *builderApi.VersionedSubmitBlindedBlockResponse) bool { switch payload.Version { - case spec.DataVersionCapella: - if payload.Capella == nil || payload.Capella.BlockHash == nilHash { - return true - } case spec.DataVersionDeneb: if payload.Deneb == nil || payload.Deneb.ExecutionPayload == nil || payload.Deneb.ExecutionPayload.BlockHash == nilHash || payload.Deneb.BlobsBundle == nil { return true } - case spec.DataVersionUnknown, spec.DataVersionPhase0, spec.DataVersionAltair, spec.DataVersionBellatrix: + case spec.DataVersionUnknown, spec.DataVersionPhase0, spec.DataVersionAltair, spec.DataVersionBellatrix, spec.DataVersionCapella: return true } return false diff --git a/server/utils_test.go b/server/utils_test.go index 3ae76f68..cfb89abb 100644 --- a/server/utils_test.go +++ b/server/utils_test.go @@ -13,7 +13,6 @@ import ( builderApi "github.com/attestantio/go-builder-client/api" builderApiDeneb "github.com/attestantio/go-builder-client/api/deneb" "github.com/attestantio/go-eth2-client/spec" - "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/flashbots/mev-boost/config" @@ -107,16 +106,6 @@ func TestGetPayloadResponseIsEmpty(t *testing.T) { payload *builderApi.VersionedSubmitBlindedBlockResponse expected bool }{ - { - name: "Non-empty capella payload response", - payload: &builderApi.VersionedSubmitBlindedBlockResponse{ - Version: spec.DataVersionCapella, - Capella: &capella.ExecutionPayload{ - BlockHash: phase0.Hash32{0x1}, - }, - }, - expected: false, - }, { name: "Non-empty deneb payload response", payload: &builderApi.VersionedSubmitBlindedBlockResponse{ @@ -134,23 +123,6 @@ func TestGetPayloadResponseIsEmpty(t *testing.T) { }, expected: false, }, - { - name: "Empty capella payload response", - payload: &builderApi.VersionedSubmitBlindedBlockResponse{ - Version: spec.DataVersionCapella, - }, - expected: true, - }, - { - name: "Nil block hash for capella payload response", - payload: &builderApi.VersionedSubmitBlindedBlockResponse{ - Version: spec.DataVersionCapella, - Capella: &capella.ExecutionPayload{ - BlockHash: nilHash, - }, - }, - expected: true, - }, { name: "Empty deneb payload response", payload: &builderApi.VersionedSubmitBlindedBlockResponse{ diff --git a/testdata/signed-blinded-beacon-block-capella.json b/testdata/signed-blinded-beacon-block-capella.json deleted file mode 100644 index 4eb15d69..00000000 --- a/testdata/signed-blinded-beacon-block-capella.json +++ /dev/null @@ -1,184 +0,0 @@ -{ - "message": { - "slot": "1", - "proposer_index": "1", - "parent_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "state_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "body": { - "randao_reveal": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505", - "eth1_data": { - "deposit_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "deposit_count": "1", - "block_hash": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2" - }, - "graffiti": "0x035d6e107958843dc805e7094b9843a30a1afd56d0df2e2b8ad1a907d56961e3", - "proposer_slashings": [ - { - "signed_header_1": { - "message": { - "slot": "1", - "proposer_index": "1", - "parent_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "state_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "body_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2" - }, - "signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505" - }, - "signed_header_2": { - "message": { - "slot": "1", - "proposer_index": "1", - "parent_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "state_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "body_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2" - }, - "signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505" - } - } - ], - "attester_slashings": [ - { - "attestation_1": { - "attesting_indices": ["1"], - "signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505", - "data": { - "slot": "1", - "index": "1", - "beacon_block_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "source": { - "epoch": "1", - "root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2" - }, - "target": { - "epoch": "1", - "root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2" - } - } - }, - "attestation_2": { - "attesting_indices": ["1"], - "signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505", - "data": { - "slot": "1", - "index": "1", - "beacon_block_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "source": { - "epoch": "1", - "root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2" - }, - "target": { - "epoch": "1", - "root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2" - } - } - } - } - ], - "attestations": [ - { - "aggregation_bits": "0x01", - "signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505", - "data": { - "slot": "1", - "index": "1", - "beacon_block_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "source": { - "epoch": "1", - "root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2" - }, - "target": { - "epoch": "1", - "root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2" - } - } - } - ], - "deposits": [ - { - "proof": [ - "0xcd5a13caadcac56ae4acdabbe37bcd12348b3dbd728a703cc8c7fd641a765a23", - "0x11e283b8e45f0864817a125f630afa79e57a7093ccabb9a7dfec9b7cfc50b5b0", - "0x1c7dbcb2c3ff23e0867512b2f5cf4ff300fd95f6654c721a29e30a188d177acb", - "0x26777a9e610b55549f1d0fec6bc47049073ebd03a74c3d308dd4633ac156db43", - "0xd2253d9472594a826ac081ae7847d8ff776fccc8eccf044395fcdf4fe9357351", - "0x95faeee7cf2b494d0808fb6abcea11e0fb98e92d268f30bb0295f56ef624de48", - "0x128cb49cac29a390f096dd95b7ce97b0465bce89fd003f48e8b349cb7f70aeeb", - "0x9335cff8f4423727a09c097611113bd2a9b94af5bde89254163ff30cb448bd59", - "0x493e981118edb12e7fcb78ff0c90c8a365a813e272a96e648b2dd38a2424247e", - "0x8792492a88df0902cb407250b0149e8389a7b1d3f772094669bd0a75a054c5ff", - "0xbad3cf3f2f110d3af7ffd1157ca8d313f3564b208c854c24b9b8249371b00495", - "0x9aa7d4e7a9fc2c9ceaf6b475f2975c580b53f5c076988cdc2dfe20798ff85df3", - "0x67ee9b8565b885c424e7c0e17d4722e26baef4e086b863e7cb1a1eb50f95450e", - "0xe19199724ac00c727d30773c6d2e310de0ea5298be1af27f931ff265873c54ea", - "0x7ca1e29efdde8c316c55b06a4854df3f0e2c6061e9d37eaf59a5310b0fc63600", - "0xfb048c607eafa7ce08251b7bad7f4cdc9671fad7bd32b9a879c9705a25367a33", - "0xa545e0beb4b0e9f62b3e4718684ee7bb5b471ea1e6c00f4f39d464d819c789bb", - "0xac2587b5e376276c0fe6fec5b99538c64cac6fd7178495dc83f76cb71a4e04a8", - "0x7583c07a2c06f98d37f7e9f8c8a336a78814c96b85a5ca8e2b46d2ef42c3274a", - "0xa5ea145810ea5cb3af54f5022127d86190d1c3812037a7475b63d1da36d0deca", - "0x5e6ab651c5244c2701c655ab18a6098f6a6e0fab9c5ad68e8fd2fe40c4d74740", - "0xde9fd756dbfece4ef84d7491a405ae1a955adb3cf00465a6ac102fc273ae6c2c", - "0x2087c35f0207f9b2e2868314ad78b33b079e477b86b76ecbb007af9ac6f527a4", - "0xba70fa1d351ad45fff13e571827e9abd07c16928c097eaab7b465c9a2c3962d7", - "0x6b6ce93bbfa3c460dfb8d19feed44dfd8b27dc6f462161c341ce1a8e30c1e4f5", - "0xa274b195993d5b91c9f1bba9e0ebedf11a5558e03d4f8b90eef701e043f95d11", - "0xafc6eb3ff05c7254e544a201f7c47518c1cf0c7905e06c87648dab6a0cde515d", - "0xb4ab300a00ef3654766c11fe8ab92a3af548a652e7785e9b315d688ab72d0d2e", - "0xac00ad809a1a95d3585c776584f79949b556c87c894bb75dd57deac3da8dd786", - "0x683e1d65ed20b4bd6895e2d7e33fcac13e7a38316f4cdc0ac793e0c10e846a26", - "0xdaf19d17403f7067798652ef62326c928e7caae1dc65af119364cea9651847c5", - "0x2f68b4a365337404e1fc611bbfc3e841d603af623630a82586c7a26fbd2335d7", - "0x080cad38549e8609d5422fdf547c1dc12dccd045f369d8a4ca288bfeba35eeec" - ], - "data": { - "pubkey": "0x93247f2209abcacf57b75a51dafae777f9dd38bc7053d1af526f220a7489a6d3a2753e5f3e8b1cfe39b56f43611df74a", - "withdrawal_credentials": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "amount": "1", - "signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505" - } - } - ], - "voluntary_exits": [ - { - "message": { - "epoch": "1", - "validator_index": "1" - }, - "signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505" - } - ], - "sync_aggregate": { - "sync_committee_bits": "0x41157a77520bb661f0763f70142fba246e4c46983310145ff9e0b417bbff29f3ede7f957eb00c50ef39dec4e9172f800b58e2b7d79e5757d47655699a19253d5", - "sync_committee_signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505" - }, - "execution_payload_header": { - "parent_hash": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "fee_recipient": "0xabcf8e0d4e9587369b2301d0790347320302cc09", - "state_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "receipts_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "logs_bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "prev_randao": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "block_number": "1", - "gas_limit": "1", - "gas_used": "1", - "timestamp": "1", - "extra_data": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "base_fee_per_gas": "1", - "block_hash": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "transactions_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "withdrawals_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2" - }, - "bls_to_execution_changes": [ - { - "message": { - "validator_index": "1", - "from_bls_pubkey": "0x93247f2209abcacf57b75a51dafae777f9dd38bc7053d1af526f220a7489a6d3a2753e5f3e8b1cfe39b56f43611df74a", - "to_execution_address": "0xabcf8e0d4e9587369b2301d0790347320302cc09" - }, - "signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505" - } - ] - } - }, - "signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505" -} diff --git a/testdata/signed-builder-bid-bellatrix.json b/testdata/signed-builder-bid-bellatrix.json deleted file mode 100644 index 5cc79f21..00000000 --- a/testdata/signed-builder-bid-bellatrix.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "version": "bellatrix", - "data": { - "message": { - "header": { - "parent_hash": "0x17f4eeae822cc81533016678413443b95e34517e67f12b4a3a92ff6b66f972ef", - "fee_recipient": "0x58e809c71e4885cb7b3f1d5c793ab04ed239d779", - "state_root": "0x3d6e230e6eceb8f3db582777b1500b8b31b9d268339e7b32bba8d6f1311b211d", - "receipts_root": "0xea760203509bdde017a506b12c825976d12b04db7bce9eca9e1ed007056a3f36", - "logs_bloom": "0x0c803a8d3c6642adee3185bd914c599317d96487831dabda82461f65700b2528781bdadf785664f9d8b11c4ee1139dfeb056125d2abd67e379cabc6d58f1c3ea304b97cf17fcd8a4c53f4dedeaa041acce062fc8fbc88ffc111577db4a936378749f2fd82b4bfcb880821dd5cbefee984bc1ad116096a64a44a2aac8a1791a7ad3a53d91c584ac69a8973daed6daee4432a198c9935fa0e5c2a4a6ca78b821a5b046e571a5c0961f469d40e429066755fec611afe25b560db07f989933556ce0cea4070ca47677b007b4b9857fc092625f82c84526737dc98e173e34fe6e4d0f1a400fd994298b7c2fa8187331c333c415f0499836ff0eed5c762bf570e67b44", - "prev_randao": "0x76ff751467270668df463600d26dba58297a986e649bac84ea856712d4779c00", - "block_number": "2983837628677007840", - "gas_limit": "6738255228996962210", - "gas_used": "5573520557770513197", - "timestamp": "1744720080366521389", - "extra_data": "0xc648", - "base_fee_per_gas": "88770397543877639215846057887940126737648744594802753726778414602657613619599", - "block_hash": "0x42c294e902bfc9884c1ce5fef156d4661bb8f0ff488bface37f18c3e7be64b0f", - "transactions_root": "0x8457d0eb7611a621e7a094059f087415ffcfc91714fc184a1f3c48db06b4d08b" - }, - "value": "12345", - "pubkey": "0x010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101" - }, - "signature": "0x010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101" - } -} diff --git a/testdata/signed-builder-bid-capella.json b/testdata/signed-builder-bid-capella.json deleted file mode 100644 index 7019af51..00000000 --- a/testdata/signed-builder-bid-capella.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "version": "capella", - "data": { - "message": { - "header": { - "parent_hash": "0x17f4eeae822cc81533016678413443b95e34517e67f12b4a3a92ff6b66f972ef", - "fee_recipient": "0x58e809c71e4885cb7b3f1d5c793ab04ed239d779", - "state_root": "0x3d6e230e6eceb8f3db582777b1500b8b31b9d268339e7b32bba8d6f1311b211d", - "receipts_root": "0xea760203509bdde017a506b12c825976d12b04db7bce9eca9e1ed007056a3f36", - "logs_bloom": "0x0c803a8d3c6642adee3185bd914c599317d96487831dabda82461f65700b2528781bdadf785664f9d8b11c4ee1139dfeb056125d2abd67e379cabc6d58f1c3ea304b97cf17fcd8a4c53f4dedeaa041acce062fc8fbc88ffc111577db4a936378749f2fd82b4bfcb880821dd5cbefee984bc1ad116096a64a44a2aac8a1791a7ad3a53d91c584ac69a8973daed6daee4432a198c9935fa0e5c2a4a6ca78b821a5b046e571a5c0961f469d40e429066755fec611afe25b560db07f989933556ce0cea4070ca47677b007b4b9857fc092625f82c84526737dc98e173e34fe6e4d0f1a400fd994298b7c2fa8187331c333c415f0499836ff0eed5c762bf570e67b44", - "prev_randao": "0x76ff751467270668df463600d26dba58297a986e649bac84ea856712d4779c00", - "block_number": "2983837628677007840", - "gas_limit": "6738255228996962210", - "gas_used": "5573520557770513197", - "timestamp": "1744720080366521389", - "extra_data": "0xc648", - "base_fee_per_gas": "88770397543877639215846057887940126737648744594802753726778414602657613619599", - "block_hash": "0x42c294e902bfc9884c1ce5fef156d4661bb8f0ff488bface37f18c3e7be64b0f", - "transactions_root": "0x8457d0eb7611a621e7a094059f087415ffcfc91714fc184a1f3c48db06b4d08b", - "withdrawals_root": "0x5c1a7e3e0eab917a7c0d677c6b692ed55ce05f07d572e09b1c06d558f474ea7a" - }, - "value": "12345", - "pubkey": "0x010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101" - }, - "signature": "0x010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101" - } -} diff --git a/testdata/zhejiang-execution-payload-capella.json b/testdata/zhejiang-execution-payload-capella.json deleted file mode 100644 index 3618a63c..00000000 --- a/testdata/zhejiang-execution-payload-capella.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "parent_hash": "0x40d276c614b86013c95bbe59698628940b6c62ef63d50a528c24e9eaab591198", - "fee_recipient": "0x13cb6ae34a13a0977f4d7101ebc24b87bb23f0d5", - "state_root": "0x0e5a097fa89d985392014b37b23e7f69286ed8dc8c06e2e55dada849d331c2e1", - "receipts_root": "0x1ddeeef0faf8c796762027d9ac55de825894985b18d6640cac1cc29041d50b7d", - "logs_bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "prev_randao": "0xf5af8152556568891bc536bdd0ccfa2e37b7c951dd57af0e9f8bd552b7426c53", - "block_number": "139225", - "gas_limit": "30000000", - "gas_used": "551506", - "timestamp": "1677021756", - "extra_data": "0x496c6c756d696e61746520446d6f63726174697a6520447374726962757465", - "base_fee_per_gas": "7", - "block_hash": "0x08751ea2076d3ecc606231495a90ba91a66a9b8fb1a2b76c333f1957a1c667c3", - "transactions": [ - "0xf875821054851010b87200830186a094f9aec40f2a2b2effe691491d7cfe3c90ddf6bbd8872386f26fc10000841998aeef8328d3b9a0ac092d4e961e6382b8b3a80e60b4d55a52157ebda53a9183326f4dc3f1d1302ea062e966f7c072a22699fff9eaffe4893fa41d1fb72cd9382fc43fb083d299d8a7", - "0xf86e821055850dbcac8e00830186a094f9aec40f2a2b2effe691491d7cfe3c90ddf6bbd880844e71d92d8328d3b9a03cb8c728f77b35a07507b70aa922b6e31bae0fc870b0de7fba0d50dc6eb9ceefa0513ea444fb4133e923fc530c3a34a3de84623fa1a860761b2275e94a4801d757", - "0xf875821054850ee6b28000830186a094f9aec40f2a2b2effe691491d7cfe3c90ddf6bbd8872386f399c6f200841998aeef8328d3baa005822bca0d7104540eae5db2b6b1c6269bca65510f44f769b2a9a1458be6397da04ea1f2d874c9effa336099ae5f2bd626887675a5ce9fb8847ecc2722131a0130", - "0xf86e821055850dbcac8e00830186a094f9aec40f2a2b2effe691491d7cfe3c90ddf6bbd880844e71d92d8328d3baa07925e78c3ac04877525a917beee6e24128356a63f3cd7c6ec221771cb405be8da05be8386defe14eef922fbba7c949f6404882a0d123e467ff11a55d6a9e4c18c1", - "0xf875821054850eab17b600830186a094f9aec40f2a2b2effe691491d7cfe3c90ddf6bbd8872386f3d561bc00841998aeef8328d3b9a0cd6b92b536ec40391285420feb8248bc129b80345a9ba19fc33f5653823a7706a0646f8ce3664772820240cabd6f6f9c1248e3017fdf4d5c5fb72763e61f78d446", - "0xf86e821055850dbcac8e00830186a094f9aec40f2a2b2effe691491d7cfe3c90ddf6bbd880844e71d92d8328d3baa05bf1ba6fac6f621ec8528d3f6b5abbae72e3f9c8a212ddaad551f29427c30a49a05a33b94218db9e44ffbdf068d63be62475719a0029dcd652437344608d583d04", - "0xf875821054850e6f7cec00830186a094f9aec40f2a2b2effe691491d7cfe3c90ddf6bbd8872386f410fc8600841998aeef8328d3baa00358efcdf94fee3b7736a1acde54bdaba1dcde70d028acb26e8a658a3a4e8395a00a24ea2c5d9f398ff9747e43c896096ea770fb9ecd09c0979229198cd08dbde8", - "0xf86e821055850dbcac8e00830186a094f9aec40f2a2b2effe691491d7cfe3c90ddf6bbd880844e71d92d8328d3b9a0d03940e5d6f837663e31647492cbdb78d6682838d88522f939c8f67737ff435fa07747a35e473163a7fa8ddeae5a1c04b7ff93881170940758dc2e09eb4a704d4e", - "0xf875821054850e33e22200830186a094f9aec40f2a2b2effe691491d7cfe3c90ddf6bbd8872386f44c975000841998aeef8328d3baa070381fcd0adb9c49e68fe861c7badc5d644d7140db3e2235b61e22eb9a023e1ba02fe84ed44efd953759c6c4892077acc571a8798d0afe84552e70be2298e717bb", - "0xf86e821055850dbcac8e00830186a094f9aec40f2a2b2effe691491d7cfe3c90ddf6bbd880844e71d92d8328d3b9a07a1e1c837de4d9e5797c0d76fd1b8dd4b768893e6990d4320063636230cc9b47a018d81eb0e8a82de9e5ee9eb886c8b0a6fcde6d52ee5d2f1fe9e472499d8d7828", - "0xf875821054850df8475800830186a094f9aec40f2a2b2effe691491d7cfe3c90ddf6bbd8872386f488321a00841998aeef8328d3b9a0cff9e433b2df74270efe3bed7b19e9eb845c0b51da98cf235db283b05a4c52eea066302c9e70d910b3b97caa4d9f4e7d884af346f26e7ef25925009e93844da676", - "0xf86e821055850dbcac8e00830186a094f9aec40f2a2b2effe691491d7cfe3c90ddf6bbd880844e71d92d8328d3baa02aa3cb1e8b51a9080ec3b92f8978995f0b794fd8db0614d5a384711cc1db3259a012351f30cffed3adc0d2c89b71d2fecbdcc2133cfeb7b1058532bbb0e53e45e9", - "0x02f877831469cb82cbe48405f5e1008405f5e10e825208948aa2b8622c1223a62fbc1119fa2b483ab41b250b88016345785d8a000080c080a0600fd64f4b97683e7b1130f5bc9e9860e0bb9f6dc6c3bf13ecdb6554cc6596c1a02682d446b692d0d8e2a7e4d15ba9fd259230bea211fc40ee056629ede5093811", - "0x02f877831469cb82cbe58405f5e1008405f5e10e82520894388979a907fee4c8083aaffb9f66bc33001c1d4d88016345785d8a000080c001a0b242a130a0e7976a70766124772c6bc7a01c11e08bb1af134ae7d077b45c1528a03adc5e74af9304312fa53bf858babe795bcfe06ab5188873b6fe7623c08b7b57", - "0x02f877831469cb82cbe58405f5e1008405f5e10e825208948aa2b8622c1223a62fbc1119fa2b483ab41b250b88016345785d8a000080c001a05defd8d136d031e2c9afcc1bd590dc6e3fda7863a641771f6d0d168cbf610f02a03b2a491394fc5702ce911a312324660018e4421084f53b965d8b3f238143ad63", - "0x02f877831469cb82cbe68405f5e1008405f5e10e82520894388979a907fee4c8083aaffb9f66bc33001c1d4d88016345785d8a000080c001a0dc74824467ca640cdeae147a837e867b92548ea2e1ca739a865e022dc27b8a7aa062f6d55d06030a6a90e57b2086336cf33a00fa4ac1a08ba9a14b7c1b83e51647", - "0x02f86e831469cb8209aa800782520894f97e180c050e5ab072211ad2c213eb5aee4df13487614fca865658a280c080a011f98172aa018c80ff382d7d4c51534fd78fa29254dac91746e3d0c6ef7010dea04cbc906ab1c898206d3b084cd38066d9d1e671bf11cc98d41ceb93a20cc8d5e3" - ], - "withdrawals": [ - { - "index": "1530173", - "validator_index": "48240", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530174", - "validator_index": "48241", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530175", - "validator_index": "48242", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530176", - "validator_index": "48243", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530177", - "validator_index": "48244", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530178", - "validator_index": "48245", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530179", - "validator_index": "48246", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530180", - "validator_index": "48247", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "178988" - }, - { - "index": "1530181", - "validator_index": "48248", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530182", - "validator_index": "48249", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "178988" - }, - { - "index": "1530183", - "validator_index": "48250", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530184", - "validator_index": "48251", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530185", - "validator_index": "48252", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530186", - "validator_index": "48253", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530187", - "validator_index": "48254", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - }, - { - "index": "1530188", - "validator_index": "48255", - "address": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "amount": "188209" - } - ] -}