Skip to content

Commit 7c88124

Browse files
feat: Add Fusaka support for MEV-Boost relay (#745)
* wip for fulu * fix tests * minor check * minor fixes * add fulu header * use validate builder submission v5 for fulu * minor log update * address review comments * add get payload v2 * add async block publishing * address comments * clean logs * add some debug logs * unmarshall submitted block based on fork * devnet-3 related fixes * partially parse payload to infer fork version * address review comments * add test * add ssz block payload * add tests for submitBlockPayload * fix fmt + lint * use payload slot instead of headSlot * lint + fmt * throw warning if proposerEthConsensusVersion is incorrect * wrap error * address review comments * fix CI * replace go boost utils to use main branch * run go mod tidy * update deps * update go-builder-client deps * update go-builder-client to use attestantio fulu branch --------- Co-authored-by: faheelsattar <[email protected]>
1 parent 344d5b6 commit 7c88124

22 files changed

+985
-164
lines changed

beaconclient/util.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/http"
99
"strings"
1010

11+
"github.com/flashbots/mev-boost-relay/common"
1112
"github.com/goccy/go-json"
1213
)
1314

@@ -45,15 +46,15 @@ func fetchBeacon(method, url string, payload []byte, dst any, httpClient *http.C
4546
}
4647

4748
if ssz {
48-
req.Header.Add("Content-Type", "application/octet-stream")
49+
req.Header.Add("Content-Type", common.ApplicationOctetStream)
4950
} else {
50-
req.Header.Add("Content-Type", "application/json")
51+
req.Header.Add("Content-Type", common.ApplicationJSON)
5152
}
5253

5354
for k, v := range headers {
5455
req.Header.Add(k, v[0])
5556
}
56-
req.Header.Set("Accept", "application/json")
57+
req.Header.Set("Accept", common.ApplicationJSON)
5758

5859
client := http.DefaultClient
5960
if httpClient != nil {

common/constants.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ const (
55
EthConsensusVersionCapella = "capella"
66
EthConsensusVersionDeneb = "deneb"
77
EthConsensusVersionElectra = "electra"
8+
EthConsensusVersionFulu = "fulu"
89
)

common/ssz_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ func TestSSZBuilderSubmission(t *testing.T) {
3030
filepath: "../testdata/submitBlockPayloadDeneb_Goerli",
3131
hashTreeRoot: "0x258007ab62465df2b5d798571d3ba0554302b7569eb1ca99405485d32723d63f",
3232
},
33+
{
34+
name: "Electra",
35+
filepath: "../testdata/submitBlockPayloadElectra",
36+
hashTreeRoot: "0xb8616dd72528dea999474715a46e74e5c695792e2d1c1556ad18d623129ff3b8",
37+
},
38+
{
39+
name: "Fulu",
40+
filepath: "../testdata/submitBlockPayloadFulu",
41+
hashTreeRoot: "0x0e298120f364a7319654285e375c3afd73bb3daa008d922ce30ea8d6dbf30c35",
42+
},
3343
}
3444

3545
for _, testCase := range testCases {

common/types.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,17 @@ var (
6868
ElectraForkVersionHoodi = "0x60000910"
6969
ElectraForkVersionMainnet = "0x05000000"
7070

71+
FuluForkVersionHolesky = "0x07017000"
72+
FuluForkVersionSepolia = "0x90000075"
73+
FuluForkVersionGoerli = "0x06001020"
74+
FuluForkVersionHoodi = "0x70000910"
75+
FuluForkVersionMainnet = "0x06000000"
76+
7177
ForkVersionStringBellatrix = "bellatrix"
7278
ForkVersionStringCapella = "capella"
7379
ForkVersionStringDeneb = "deneb"
7480
ForkVersionStringElectra = "electra"
81+
ForkVersionStringFulu = "fulu"
7582
)
7683

7784
type EthNetworkDetails struct {
@@ -82,12 +89,14 @@ type EthNetworkDetails struct {
8289
CapellaForkVersionHex string
8390
DenebForkVersionHex string
8491
ElectraForkVersionHex string
92+
FuluForkVersionHex string
8593

8694
DomainBuilder phase0.Domain
8795
DomainBeaconProposerBellatrix phase0.Domain
8896
DomainBeaconProposerCapella phase0.Domain
8997
DomainBeaconProposerDeneb phase0.Domain
9098
DomainBeaconProposerElectra phase0.Domain
99+
DomainBeaconProposerFulu phase0.Domain
91100
}
92101

93102
func NewEthNetworkDetails(networkName string) (ret *EthNetworkDetails, err error) {
@@ -97,11 +106,13 @@ func NewEthNetworkDetails(networkName string) (ret *EthNetworkDetails, err error
97106
var capellaForkVersion string
98107
var denebForkVersion string
99108
var electraForkVersion string
109+
var fuluForkVersion string
100110
var domainBuilder phase0.Domain
101111
var domainBeaconProposerBellatrix phase0.Domain
102112
var domainBeaconProposerCapella phase0.Domain
103113
var domainBeaconProposerDeneb phase0.Domain
104114
var domainBeaconProposerElectra phase0.Domain
115+
var domainBeaconProposerFulu phase0.Domain
105116

106117
switch networkName {
107118
case EthNetworkHolesky:
@@ -111,41 +122,47 @@ func NewEthNetworkDetails(networkName string) (ret *EthNetworkDetails, err error
111122
capellaForkVersion = CapellaForkVersionHolesky
112123
denebForkVersion = DenebForkVersionHolesky
113124
electraForkVersion = ElectraForkVersionHolesky
125+
fuluForkVersion = FuluForkVersionHolesky
114126
case EthNetworkSepolia:
115127
genesisForkVersion = GenesisForkVersionSepolia
116128
genesisValidatorsRoot = GenesisValidatorsRootSepolia
117129
bellatrixForkVersion = BellatrixForkVersionSepolia
118130
capellaForkVersion = CapellaForkVersionSepolia
119131
denebForkVersion = DenebForkVersionSepolia
120132
electraForkVersion = ElectraForkVersionSepolia
133+
fuluForkVersion = FuluForkVersionSepolia
121134
case EthNetworkGoerli:
122135
genesisForkVersion = GenesisForkVersionGoerli
123136
genesisValidatorsRoot = GenesisValidatorsRootGoerli
124137
bellatrixForkVersion = BellatrixForkVersionGoerli
125138
capellaForkVersion = CapellaForkVersionGoerli
126139
denebForkVersion = DenebForkVersionGoerli
127140
electraForkVersion = ElectraForkVersionGoerli
141+
fuluForkVersion = FuluForkVersionGoerli
128142
case EthNetworkHoodi:
129143
genesisForkVersion = GenesisForkVersionHoodi
130144
genesisValidatorsRoot = GenesisValidatorsRootHoodi
131145
bellatrixForkVersion = BellatrixForkVersionHoodi
132146
capellaForkVersion = CapellaForkVersionHoodi
133147
denebForkVersion = DenebForkVersionHoodi
134148
electraForkVersion = ElectraForkVersionHoodi
149+
fuluForkVersion = FuluForkVersionHoodi
135150
case EthNetworkMainnet:
136151
genesisForkVersion = GenesisForkVersionMainnet
137152
genesisValidatorsRoot = GenesisValidatorsRootMainnet
138153
bellatrixForkVersion = BellatrixForkVersionMainnet
139154
capellaForkVersion = CapellaForkVersionMainnet
140155
denebForkVersion = DenebForkVersionMainnet
141156
electraForkVersion = ElectraForkVersionMainnet
157+
fuluForkVersion = FuluForkVersionMainnet
142158
case EthNetworkCustom:
143159
genesisForkVersion = os.Getenv("GENESIS_FORK_VERSION")
144160
genesisValidatorsRoot = os.Getenv("GENESIS_VALIDATORS_ROOT")
145161
bellatrixForkVersion = os.Getenv("BELLATRIX_FORK_VERSION")
146162
capellaForkVersion = os.Getenv("CAPELLA_FORK_VERSION")
147163
denebForkVersion = os.Getenv("DENEB_FORK_VERSION")
148164
electraForkVersion = os.Getenv("ELECTRA_FORK_VERSION")
165+
fuluForkVersion = os.Getenv("FULU_FORK_VERSION")
149166
default:
150167
return nil, fmt.Errorf("%w: %s", ErrUnknownNetwork, networkName)
151168
}
@@ -175,6 +192,11 @@ func NewEthNetworkDetails(networkName string) (ret *EthNetworkDetails, err error
175192
return nil, err
176193
}
177194

195+
domainBeaconProposerFulu, err = ComputeDomain(boostSsz.DomainTypeBeaconProposer, fuluForkVersion, genesisValidatorsRoot)
196+
if err != nil {
197+
return nil, err
198+
}
199+
178200
return &EthNetworkDetails{
179201
Name: networkName,
180202
GenesisForkVersionHex: genesisForkVersion,
@@ -183,11 +205,13 @@ func NewEthNetworkDetails(networkName string) (ret *EthNetworkDetails, err error
183205
CapellaForkVersionHex: capellaForkVersion,
184206
DenebForkVersionHex: denebForkVersion,
185207
ElectraForkVersionHex: electraForkVersion,
208+
FuluForkVersionHex: fuluForkVersion,
186209
DomainBuilder: domainBuilder,
187210
DomainBeaconProposerBellatrix: domainBeaconProposerBellatrix,
188211
DomainBeaconProposerCapella: domainBeaconProposerCapella,
189212
DomainBeaconProposerDeneb: domainBeaconProposerDeneb,
190213
DomainBeaconProposerElectra: domainBeaconProposerElectra,
214+
DomainBeaconProposerFulu: domainBeaconProposerFulu,
191215
}, nil
192216
}
193217

@@ -206,6 +230,7 @@ func (e *EthNetworkDetails) String() string {
206230
DomainBeaconProposerCapella: %x,
207231
DomainBeaconProposerDeneb: %x
208232
DomainBeaconProposerElectra: %x
233+
DomainBeaconProposerFulu: %x
209234
}`,
210235
e.Name,
211236
e.GenesisForkVersionHex,
@@ -218,7 +243,8 @@ func (e *EthNetworkDetails) String() string {
218243
e.DomainBeaconProposerBellatrix,
219244
e.DomainBeaconProposerCapella,
220245
e.DomainBeaconProposerDeneb,
221-
e.DomainBeaconProposerElectra)
246+
e.DomainBeaconProposerElectra,
247+
e.DomainBeaconProposerFulu)
222248
}
223249

224250
// PubkeyHex represents a hex-encoded public key.

0 commit comments

Comments
 (0)