Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Enhance relay with whitelist filtering capability for validator and builder selection #657

Open
wants to merge 71 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
9365717
wip
ckartik Sep 17, 2024
8030776
wip: implements basic filtering
ckartik Sep 17, 2024
2776c6a
wip: adds comments around technical decisions that need to be made.
ckartik Sep 17, 2024
be89e84
wip: adds mevcommit relay
ckartik Sep 18, 2024
f6703a1
wip: documenting some thoughts
ckartik Sep 18, 2024
b498fe3
wip: more details
ckartik Sep 20, 2024
5216a9f
feat: adds opted in column to builder table
ckartik Sep 24, 2024
44adf4c
feat: adds opted in status for validators
ckartik Sep 24, 2024
c440444
feat: stubs basic mevcommit client
ckartik Sep 24, 2024
274a15e
feat: get's current opted in status of validators via mev-commit client
ckartik Sep 24, 2024
7de9955
feat: adds new table instead of just column
ckartik Sep 25, 2024
f95c086
feat: adds the new table migration
ckartik Sep 25, 2024
fa672e0
feat: adds db entries for validators
ckartik Sep 25, 2024
bd03f6f
feat: updates format of validator registration
ckartik Sep 25, 2024
54ea6de
feat: adds a redis handlers for validator registration
ckartik Sep 25, 2024
9f236de
feat: wip move most data to redis for validators
ckartik Sep 26, 2024
d1d8e5f
feat: completes implementation of mevcommit client
ckartik Sep 27, 2024
26d3047
feat: use the provider registry client
ckartik Sep 27, 2024
ed193ab
feat: wip adds all the e2e calls to complete implementation for relay…
ckartik Sep 30, 2024
79254ca
chore: adds to public interface
ckartik Sep 30, 2024
5967122
chore: make sure we're also updating the builder registrations
ckartik Oct 1, 2024
e22eb54
chore: removes DB entries for now
ckartik Oct 1, 2024
1525d87
chore: adds the unit tests for the mev-commit client
ckartik Oct 2, 2024
bb957ae
feat: adds more unit test coverage.
ckartik Oct 2, 2024
0400be7
chore: fix variable naming
ckartik Oct 2, 2024
5149183
nit: ensure we grab readlock on purposer duties map
ckartik Oct 2, 2024
6a05c1f
chore: cleanup
ckartik Oct 4, 2024
152c784
chore: configures correct os vars on startup
ckartik Oct 4, 2024
a0a7249
feat: allow toggling of mev-commit filtering feature
ckartik Oct 7, 2024
79045fd
nit: fixes two small bugs and adds a unit test
ckartik Oct 8, 2024
3035693
chore: cleanup and move feature flag higher
ckartik Oct 9, 2024
ca20ea2
feat: query for finalized state on purposeres
ckartik Oct 9, 2024
f76b56e
chore: remove db modificaitons
ckartik Oct 9, 2024
26004e9
chore: remove interface
ckartik Oct 9, 2024
d5b315d
chore: cleanup mockdb
ckartik Oct 9, 2024
ecaaba9
nit: updates name of registry
ckartik Oct 9, 2024
0207cbb
chore: name variable correctly
ckartik Oct 9, 2024
0ea6366
feat: restructure builder monitoring for efficency
ckartik Oct 9, 2024
1e1c94d
chore: ensures tests still work
ckartik Oct 9, 2024
0ce89a5
chore: cleans up old appraoch to monitoring builders
ckartik Oct 9, 2024
1aa80bb
nit: cleanup
ckartik Oct 9, 2024
52410bf
chore: move time start for monitoring to top level
ckartik Oct 9, 2024
ece5972
nit: reduce log level
ckartik Oct 9, 2024
5314d28
chore: removes legacy getbuilders
ckartik Oct 11, 2024
550bdcc
chore: clean up code and fix anti-pattern
ckartik Oct 11, 2024
03b13c1
feat: track slashes
ckartik Oct 11, 2024
941ba64
nit: made changes event registration checks
ckartik Oct 11, 2024
426c229
Merge pull request #1 from primev/ckartik/add-mev-commit-support
ckartik Oct 11, 2024
aa56c41
nit: remove gitignore changes
ckartik Oct 14, 2024
6dcb0f5
nit: remove change in database.go
ckartik Oct 14, 2024
866c4ac
chore: removes all db related changes
ckartik Oct 14, 2024
f3cb4f1
nit: remove redundant todo
ckartik Oct 14, 2024
21c486f
Merge pull request #2 from primev/ckartik/final-cleanup
ckartik Oct 14, 2024
dd5f08e
chore: remove redundant validator deletion
ckartik Oct 14, 2024
d4d63f5
chore: runs gofumpt
ckartik Oct 14, 2024
93c336f
chore: fixes all issues identified by linter (#3)
ckartik Oct 14, 2024
dca4cb5
chore: simplify blocknumber retrieval
ckartik Oct 14, 2024
28b6991
nit: remove comment
ckartik Oct 14, 2024
9dfd417
nit: add more test coverage on redis
ckartik Oct 14, 2024
32c96f0
nit: make sure filtering is on during all tests
ckartik Oct 14, 2024
ae70252
chore: downgrade go
ckartik Oct 14, 2024
ac5b759
nit: bump go-ethereum version
ckartik Oct 14, 2024
3ea3e16
feat: faster filtering and more test coverage
ckartik Oct 15, 2024
c50bce5
nit: comment cleanup
ckartik Oct 15, 2024
89402c7
chore: replace http with ws connection
ckartik Oct 15, 2024
422eb7c
nit: cleanup test
ckartik Oct 15, 2024
0354237
feat: adds LRU cache for mevcommit registrations
ckartik Oct 15, 2024
b9dcb96
feat: stores validator opted in status in proposer duties map (#4)
ckartik Oct 16, 2024
63b4b42
feat: Reduces critical path latency by caching builder info in runtim…
ckartik Oct 17, 2024
f3c6bd9
feat: minor update to event names in relay (#7)
ckartik Jan 7, 2025
2a6a1bf
chore: bump contract addresses
ckartik Jan 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1
FROM golang:1.21 as builder
FROM golang:1.23 AS builder
ARG VERSION
WORKDIR /build

Expand Down
61 changes: 32 additions & 29 deletions cmd/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,22 @@ var (
apiDefaultInternalAPIEnabled = os.Getenv("ENABLE_INTERNAL_API") == "1"

// Default Builder, Data, and Proposer API as true.
apiDefaultBuilderAPIEnabled = os.Getenv("DISABLE_BUILDER_API") != "1"
apiDefaultDataAPIEnabled = os.Getenv("DISABLE_DATA_API") != "1"
apiDefaultProposerAPIEnabled = os.Getenv("DISABLE_PROPOSER_API") != "1"

apiListenAddr string
apiPprofEnabled bool
apiSecretKey string
apiBlockSimURL string
apiDebug bool
apiBuilderAPI bool
apiDataAPI bool
apiInternalAPI bool
apiProposerAPI bool
apiLogTag string
apiDefaultBuilderAPIEnabled = os.Getenv("DISABLE_BUILDER_API") != "1"
apiDefaultDataAPIEnabled = os.Getenv("DISABLE_DATA_API") != "1"
apiDefaultProposerAPIEnabled = os.Getenv("DISABLE_PROPOSER_API") != "1"
apiDefaultMevCommitFilteringEnabled = os.Getenv("DISABLE_MEV_COMMIT_FILTERING") != "1"

apiMevCommitFiltering bool
apiListenAddr string
apiPprofEnabled bool
apiSecretKey string
apiBlockSimURL string
apiDebug bool
apiBuilderAPI bool
apiDataAPI bool
apiInternalAPI bool
apiProposerAPI bool
apiLogTag string
)

func init() {
Expand All @@ -68,6 +70,7 @@ func init() {
apiCmd.Flags().BoolVar(&apiDataAPI, "data-api", apiDefaultDataAPIEnabled, "enable data API (/data/...)")
apiCmd.Flags().BoolVar(&apiInternalAPI, "internal-api", apiDefaultInternalAPIEnabled, "enable internal API (/internal/...)")
apiCmd.Flags().BoolVar(&apiProposerAPI, "proposer-api", apiDefaultProposerAPIEnabled, "enable proposer API (/proposer/...)")
apiCmd.Flags().BoolVar(&apiMevCommitFiltering, "mev-commit-filtering", apiDefaultMevCommitFilteringEnabled, "enable mev-commit-filtering")
}

var apiCmd = &cobra.Command{
Expand Down Expand Up @@ -155,21 +158,21 @@ var apiCmd = &cobra.Command{
}

opts := api.RelayAPIOpts{
Log: log,
ListenAddr: apiListenAddr,
BeaconClient: beaconClient,
Datastore: ds,
Redis: redis,
Memcached: mem,
DB: db,
EthNetDetails: *networkInfo,
BlockSimURL: apiBlockSimURL,

BlockBuilderAPI: apiBuilderAPI,
DataAPI: apiDataAPI,
InternalAPI: apiInternalAPI,
ProposerAPI: apiProposerAPI,
PprofAPI: apiPprofEnabled,
Log: log,
ListenAddr: apiListenAddr,
BeaconClient: beaconClient,
Datastore: ds,
Redis: redis,
Memcached: mem,
DB: db,
EthNetDetails: *networkInfo,
BlockSimURL: apiBlockSimURL,
MevCommitFiltering: apiMevCommitFiltering,
BlockBuilderAPI: apiBuilderAPI,
DataAPI: apiDataAPI,
InternalAPI: apiInternalAPI,
ProposerAPI: apiProposerAPI,
PprofAPI: apiPprofEnabled,
}

// Decode the private key
Expand Down
19 changes: 19 additions & 0 deletions cmd/housekeeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ import (
"os"
"strings"

gethCommon "github.com/ethereum/go-ethereum/common"
"github.com/flashbots/mev-boost-relay/beaconclient"
"github.com/flashbots/mev-boost-relay/common"
"github.com/flashbots/mev-boost-relay/database"
"github.com/flashbots/mev-boost-relay/datastore"
"github.com/flashbots/mev-boost-relay/mevcommitclient"
"github.com/flashbots/mev-boost-relay/services/housekeeper"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
Expand All @@ -35,6 +37,11 @@ func init() {

housekeeperCmd.Flags().BoolVar(&hkPprofEnabled, "pprof", hkDefaultPprofEnabled, "enable pprof API")
housekeeperCmd.Flags().StringVar(&hkPprofListenAddr, "pprof-listen-addr", hkDefaultPprofListenAddr, "listen address for pprof server")

housekeeperCmd.Flags().StringVar(&mevCommitRPC, "mev-commit-rpc", defaultMevCommitRPC, "mev-commit-chain RPC endpoint")
housekeeperCmd.Flags().StringVar(&ethereumL1RPC, "ethereum-l1-rpc", defaultEthereumL1RPC, "Ethereum L1 RPC endpoint")
housekeeperCmd.Flags().StringVar(&providerRegistryAddr, "provider-registry-addr", defaultProviderRegistryAddr, "mev-commit provider registry contract address")
housekeeperCmd.Flags().StringVar(&validatorOptInRouterAddr, "validator-optin-router-addr", defaultValidatorOptInRouterAddr, "mev-commit validator opt-in router contract address")
}

var housekeeperCmd = &cobra.Command{
Expand Down Expand Up @@ -84,6 +91,16 @@ var housekeeperCmd = &cobra.Command{
log.WithError(err).Fatalf("Failed to connect to Postgres database at %s%s", dbURL.Host, dbURL.Path)
}

mevCommitClient, err := mevcommitclient.NewMevCommitClient(
ethereumL1RPC,
mevCommitRPC,
gethCommon.HexToAddress(validatorOptInRouterAddr),
gethCommon.HexToAddress(providerRegistryAddr),
)
if err != nil {
log.WithError(err).Fatal("Failed to create mev-commit client")
}

opts := &housekeeper.HousekeeperOpts{
Log: log,
Redis: redis,
Expand All @@ -92,6 +109,8 @@ var housekeeperCmd = &cobra.Command{

PprofAPI: hkPprofEnabled,
PprofListenAddress: hkPprofListenAddr,

MevCommitClient: mevCommitClient,
}
service := housekeeper.NewHousekeeper(opts)
log.Info("Starting housekeeper service...")
Expand Down
27 changes: 18 additions & 9 deletions cmd/variables.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,19 @@ import (
)

var (
defaultNetwork = common.GetEnv("NETWORK", "")
defaultBeaconURIs = common.GetSliceEnv("BEACON_URIS", []string{"http://localhost:3500"})
defaultBeaconPublishURIs = common.GetSliceEnv("BEACON_PUBLISH_URIS", []string{})
defaultRedisURI = common.GetEnv("REDIS_URI", "localhost:6379")
defaultRedisReadonlyURI = common.GetEnv("REDIS_READONLY_URI", "")
defaultPostgresDSN = common.GetEnv("POSTGRES_DSN", "")
defaultMemcachedURIs = common.GetSliceEnv("MEMCACHED_URIS", nil)
defaultLogJSON = os.Getenv("LOG_JSON") != ""
defaultLogLevel = common.GetEnv("LOG_LEVEL", "info")
defaultNetwork = common.GetEnv("NETWORK", "")
defaultBeaconURIs = common.GetSliceEnv("BEACON_URIS", []string{"http://localhost:3500"})
defaultBeaconPublishURIs = common.GetSliceEnv("BEACON_PUBLISH_URIS", []string{})
defaultRedisURI = common.GetEnv("REDIS_URI", "localhost:6379")
defaultRedisReadonlyURI = common.GetEnv("REDIS_READONLY_URI", "")
defaultPostgresDSN = common.GetEnv("POSTGRES_DSN", "")
defaultMemcachedURIs = common.GetSliceEnv("MEMCACHED_URIS", nil)
defaultLogJSON = os.Getenv("LOG_JSON") != ""
defaultLogLevel = common.GetEnv("LOG_LEVEL", "info")
defaultMevCommitRPC = common.GetEnv("MEV_COMMIT_RPC", "")
defaultEthereumL1RPC = common.GetEnv("ETHEREUM_L1_RPC", "")
defaultProviderRegistryAddr = common.GetEnv("PROVIDER_REGISTRY_ADDR", "")
defaultValidatorOptInRouterAddr = common.GetEnv("VALIDATOR_OPTIN_ROUTER_ADDR", "")

beaconNodeURIs []string
beaconNodePublishURIs []string
Expand All @@ -24,6 +28,11 @@ var (
postgresDSN string
memcachedURIs []string

mevCommitRPC string
ethereumL1RPC string
providerRegistryAddr string
validatorOptInRouterAddr string

logJSON bool
logLevel string

Expand Down
7 changes: 4 additions & 3 deletions common/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,9 +188,10 @@ func (p PubkeyHex) String() string {
}

type BuilderGetValidatorsResponseEntry struct {
Slot uint64 `json:"slot,string"`
ValidatorIndex uint64 `json:"validator_index,string"`
Entry *builderApiV1.SignedValidatorRegistration `json:"entry"`
Slot uint64 `json:"slot,string"`
ValidatorIndex uint64 `json:"validator_index,string"`
Entry *builderApiV1.SignedValidatorRegistration `json:"entry"`
IsMevCommitValidator bool `json:"is_mev_commit"`
}

type BidTraceV2 struct {
Expand Down
6 changes: 6 additions & 0 deletions datastore/datastore.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ type Datastore struct {
}

func NewDatastore(redisCache *RedisCache, memcached *Memcached, db database.IDatabaseService) (ds *Datastore, err error) {

ds = &Datastore{
db: db,
memcached: memcached,
Expand Down Expand Up @@ -184,6 +185,11 @@ func (ds *Datastore) SetKnownValidator(pubkeyHex common.PubkeyHex, index uint64)
ds.knownValidatorsByIndex[index] = pubkeyHex
}

// IsMevCommitBlockBuilder checks if a builder is registered for mev-commit
func (ds *Datastore) IsMevCommitBlockBuilder(builderPubkey common.PubkeyHex) (bool, error) {
return ds.redis.IsMevCommitBlockBuilder(builderPubkey)
}

// SaveValidatorRegistration saves a validator registration into both Redis and the database
func (ds *Datastore) SaveValidatorRegistration(entry builderApiV1.SignedValidatorRegistration) error {
// First save in the database
Expand Down
59 changes: 59 additions & 0 deletions datastore/redis.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/attestantio/go-eth2-client/spec/capella"
"github.com/flashbots/go-utils/cli"
"github.com/flashbots/mev-boost-relay/common"
"github.com/flashbots/mev-boost-relay/mevcommitclient"
"github.com/go-redis/redis/v9"
)

Expand Down Expand Up @@ -95,6 +96,7 @@ type RedisCache struct {

// keys
keyValidatorRegistrationTimestamp string
keyMevCommitBlockBuilder string

keyRelayConfig string
keyStats string
Expand Down Expand Up @@ -135,6 +137,7 @@ func NewRedisCache(prefix, redisURI, readonlyURI string) (*RedisCache, error) {
prefixFloorBidValue: fmt.Sprintf("%s/%s:bid-floor-value", redisPrefix, prefix), // prefix:slot_parentHash_proposerPubkey

keyValidatorRegistrationTimestamp: fmt.Sprintf("%s/%s:validator-registration-timestamp", redisPrefix, prefix),
keyMevCommitBlockBuilder: fmt.Sprintf("%s/%s:mev-commit-block-builder", redisPrefix, prefix),
keyRelayConfig: fmt.Sprintf("%s/%s:relay-config", redisPrefix, prefix),

keyStats: fmt.Sprintf("%s/%s:stats", redisPrefix, prefix),
Expand Down Expand Up @@ -241,6 +244,62 @@ func (r *RedisCache) GetValidatorRegistrationTimestamp(proposerPubkey common.Pub
return timestamp, err
}

func (r *RedisCache) SetMevCommitBlockBuilder(builder mevcommitclient.MevCommitProvider) error {
ctx := context.Background()

jsonBuilder, err := json.Marshal(builder)
if err != nil {
return fmt.Errorf("failed to marshal MevCommitProvider: %w", err)
}
err = r.client.HSet(ctx, r.keyMevCommitBlockBuilder, builder.Pubkey, string(jsonBuilder)).Err()
if err != nil {
return fmt.Errorf("failed to set mev-commit block builder: %w", err)
}

return nil
}

func (r *RedisCache) GetMevCommitBlockBuilders() ([]mevcommitclient.MevCommitProvider, error) {
ctx := context.Background()

// Retrieve all fields and values from the hash
entries, err := r.client.HGetAll(ctx, r.keyMevCommitBlockBuilder).Result()
if err != nil {
return nil, fmt.Errorf("failed to get mev-commit block builders: %w", err)
}

// Convert map to MevCommitProvider slice
builders := make([]mevcommitclient.MevCommitProvider, 0, len(entries))
for _, value := range entries {
var builder mevcommitclient.MevCommitProvider
err := json.Unmarshal([]byte(value), &builder)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal MevCommitProvider: %w", err)
}
builders = append(builders, builder)
}

return builders, nil
}

func (r *RedisCache) IsMevCommitBlockBuilder(builderPubkey common.PubkeyHex) (bool, error) {
ctx := context.Background()

// Check if the builder pubkey exists in the hash
exists, err := r.client.HExists(ctx, r.keyMevCommitBlockBuilder, builderPubkey.String()).Result()
if err != nil {
return false, fmt.Errorf("failed to check if builder is in mev-commit block builders hash: %w", err)
}

return exists, nil
}

func (r *RedisCache) DeleteMevCommitBlockBuilder(builderPubkey common.PubkeyHex) error {
ctx := context.Background()

return r.client.HDel(ctx, r.keyMevCommitBlockBuilder, builderPubkey.String()).Err()
}

func (r *RedisCache) SetValidatorRegistrationTimestampIfNewer(proposerPubkey common.PubkeyHex, timestamp uint64) error {
knownTimestamp, err := r.GetValidatorRegistrationTimestamp(proposerPubkey)
if err != nil {
Expand Down
52 changes: 52 additions & 0 deletions datastore/redis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ import (
"github.com/attestantio/go-eth2-client/spec"
"github.com/attestantio/go-eth2-client/spec/bellatrix"
"github.com/attestantio/go-eth2-client/spec/phase0"
gethCommon "github.com/ethereum/go-ethereum/common"
"github.com/flashbots/mev-boost-relay/common"
"github.com/flashbots/mev-boost-relay/mevcommitclient"
"github.com/go-redis/redis/v9"
"github.com/holiman/uint256"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -101,6 +103,7 @@ func TestRedisProposerDuties(t *testing.T) {
Pubkey: phase0.BLSPubKey{},
},
},
IsMevCommitValidator: true,
},
}
err := cache.SetProposerDuties(duties)
Expand All @@ -111,6 +114,9 @@ func TestRedisProposerDuties(t *testing.T) {

require.Len(t, duties2, 1)
require.Equal(t, duties[0].Entry.Message.FeeRecipient, duties2[0].Entry.Message.FeeRecipient)
require.Equal(t, duties[0].IsMevCommitValidator, duties2[0].IsMevCommitValidator)
require.Equal(t, duties[0].IsMevCommitValidator, true)

}

func TestBuilderBids(t *testing.T) {
Expand Down Expand Up @@ -444,6 +450,52 @@ func TestPipelineNilCheck(t *testing.T) {
require.Equal(t, big.NewInt(0), f)
}

func TestSetMevCommitBlockBuilders(t *testing.T) {
cache := setupTestRedis(t)

builderPubkey := "0xfa1ed37c3553d0ce1e9349b2c5063cf6e394d231c8d3e0df75e9462257c081543086109ffddaacc0aa76f33dc9661c83"
// Set a commit block builder
builder := mevcommitclient.MevCommitProvider{
Pubkey: []byte(builderPubkey),
EOAAddress: gethCommon.HexToAddress("0x0000000000000000000000000000000000000001"),
}
err := cache.SetMevCommitBlockBuilder(builder)
require.NoError(t, err)

// Retrieve the list of mev-commit block builders
builders, err := cache.GetMevCommitBlockBuilders()
require.NoError(t, err)
require.Len(t, builders, 1)
require.Equal(t, builder, builders[0])
require.Equal(t, builderPubkey, string(builders[0].Pubkey))
require.Equal(t, gethCommon.HexToAddress("0x0000000000000000000000000000000000000001"), builders[0].EOAAddress)

// Check if the commit block builder is set correctly
isSet, err := cache.IsMevCommitBlockBuilder(common.PubkeyHex(builderPubkey))
require.NoError(t, err)
require.True(t, isSet)

// Check if a non-existent commit block builder returns false
nonExistentBuilderPubkey := "0x2e02be2c9f9eccf9856478fdb7876598fed2da09f45c233969ba647a250231150ecf38bce5771adb6171c86b79a92f16"
isSet, err = cache.IsMevCommitBlockBuilder(common.PubkeyHex(nonExistentBuilderPubkey))
require.NoError(t, err)
require.False(t, isSet)

// Test removing a registered block builder
err = cache.DeleteMevCommitBlockBuilder(common.PubkeyHex(builderPubkey))
require.NoError(t, err)

// Check if the removed builder is no longer registered
isSet, err = cache.IsMevCommitBlockBuilder(common.PubkeyHex(builderPubkey))
require.NoError(t, err)
require.False(t, isSet)

// Verify the list of mev-commit block builders is now empty
builders, err = cache.GetMevCommitBlockBuilders()
require.NoError(t, err)
require.Empty(t, builders)
}

// func TestPipeline(t *testing.T) {
// cache := setupTestRedis(t)

Expand Down
Loading