Skip to content

Commit

Permalink
feat: take pay bid tx as block tag (#5)
Browse files Browse the repository at this point in the history
* feat: take pay bid tx as block tag
  • Loading branch information
irrun authored Mar 20, 2024
1 parent 5eea713 commit 4181bd7
Show file tree
Hide file tree
Showing 9 changed files with 241 additions and 47 deletions.
87 changes: 65 additions & 22 deletions account/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (

"github.com/bnb-chain/bsc-mev-sentry/log"
"github.com/bnb-chain/bsc-mev-sentry/node"
"github.com/bnb-chain/bsc-mev-sentry/syncutils"
)

type Mode string
Expand All @@ -24,15 +25,15 @@ const (
)

type Account interface {
PayBidTx(context.Context, node.FullNode, common.Address, *big.Int) ([]byte, error)
PayBidTx(context.Context, common.Address, *big.Int) ([]byte, error)
}

func New(config *Config) (Account, error) {
func New(config *Config, fullNode node.FullNode) (Account, error) {
switch config.Mode {
case privateKeyMode:
return newPrivateKeyAccount(config.PrivateKey)
return newPrivateKeyAccount(config.PrivateKey, fullNode)
case keystoreMode:
return newKeystoreAccount(config.KeystorePath, config.Password, config.Address)
return newKeystoreAccount(config.KeystorePath, config.Password, config.Address, fullNode)
default:
return nil, errors.New("invalid account mode")
}
Expand All @@ -52,12 +53,15 @@ type Config struct {

type keystoreAccount struct {
keystore *keystore.KeyStore
address common.Address
account accounts.Account
fullNode node.FullNode
}

func newKeystoreAccount(keystorePath, password, opAccount string) (*keystoreAccount, error) {
func newKeystoreAccount(keystorePath, password, opAccount string, fullNode node.FullNode) (*keystoreAccount, error) {
address := common.HexToAddress(opAccount)
ks := keystore.NewKeyStore(keystorePath, keystore.StandardScryptN, keystore.StandardScryptP)
account, err := ks.Find(accounts.Account{Address: common.HexToAddress(opAccount)})
account, err := ks.Find(accounts.Account{Address: address})
if err != nil {
log.Errorw("failed to create key store account", "err", err)
return nil, err
Expand All @@ -69,15 +73,25 @@ func newKeystoreAccount(keystorePath, password, opAccount string) (*keystoreAcco
return nil, err
}

return &keystoreAccount{ks, account}, nil
return &keystoreAccount{ks, address, account, fullNode}, nil
}

func (k *keystoreAccount) PayBidTx(ctx context.Context, fullNode node.FullNode, receiver common.Address, amount *big.Int) ([]byte, error) {
nonce, err := fetchNonce(ctx, fullNode, k.account.Address)
func (k *keystoreAccount) PayBidTx(ctx context.Context, receiver common.Address, amount *big.Int) ([]byte, error) {
// take pay bid tx as block tag
if amount == nil {
amount = big.NewInt(0)
}

balance, nonce, err := prev(ctx, k.fullNode, k.address)
if err != nil {
return nil, err
}

if balance.Cmp(amount) < 0 {
log.Errorw("insufficient balance", "balance", balance, "amount", amount)
return nil, errors.New("insufficient balance")
}

tx := types.NewTx(&types.LegacyTx{
Nonce: nonce,
GasPrice: big.NewInt(0),
Expand All @@ -86,7 +100,7 @@ func (k *keystoreAccount) PayBidTx(ctx context.Context, fullNode node.FullNode,
Value: amount,
})

signedTx, err := k.keystore.SignTx(k.account, tx, fullNode.ChainID())
signedTx, err := k.keystore.SignTx(k.account, tx, k.fullNode.ChainID())
if err != nil {
log.Errorw("failed to sign tx", "err", err)
return nil, err
Expand All @@ -96,11 +110,12 @@ func (k *keystoreAccount) PayBidTx(ctx context.Context, fullNode node.FullNode,
}

type privateKeyAccount struct {
key *ecdsa.PrivateKey
address common.Address
key *ecdsa.PrivateKey
address common.Address
fullNode node.FullNode
}

func newPrivateKeyAccount(privateKey string) (*privateKeyAccount, error) {
func newPrivateKeyAccount(privateKey string, fullNode node.FullNode) (*privateKeyAccount, error) {
key, err := crypto.HexToECDSA(privateKey)
if err != nil {
log.Errorw("failed to load private key", "err", err)
Expand All @@ -116,15 +131,25 @@ func newPrivateKeyAccount(privateKey string) (*privateKeyAccount, error) {

addr := crypto.PubkeyToAddress(*pubKeyECDSA)

return &privateKeyAccount{key, addr}, nil
return &privateKeyAccount{key, addr, fullNode}, nil
}

func (p *privateKeyAccount) PayBidTx(ctx context.Context, fullNode node.FullNode, receiver common.Address, amount *big.Int) ([]byte, error) {
nonce, err := fetchNonce(ctx, fullNode, p.address)
func (p *privateKeyAccount) PayBidTx(ctx context.Context, receiver common.Address, amount *big.Int) ([]byte, error) {
// take pay bid tx as block tag
if amount == nil {
amount = big.NewInt(0)
}

balance, nonce, err := prev(ctx, p.fullNode, p.address)
if err != nil {
return nil, err
}

if balance.Cmp(amount) < 0 {
log.Errorw("insufficient balance", "balance", balance, "amount", amount)
return nil, errors.New("insufficient balance")
}

tx := types.NewTx(&types.LegacyTx{
Nonce: nonce,
GasPrice: big.NewInt(0),
Expand All @@ -133,7 +158,7 @@ func (p *privateKeyAccount) PayBidTx(ctx context.Context, fullNode node.FullNode
Value: amount,
})

signedTx, err := types.SignTx(tx, types.LatestSignerForChainID(fullNode.ChainID()), p.key)
signedTx, err := types.SignTx(tx, types.LatestSignerForChainID(p.fullNode.ChainID()), p.key)
if err != nil {
log.Errorw("failed to sign tx", "err", err)
return nil, err
Expand All @@ -142,12 +167,30 @@ func (p *privateKeyAccount) PayBidTx(ctx context.Context, fullNode node.FullNode
return signedTx.MarshalBinary()
}

func fetchNonce(ctx context.Context, fullNode node.FullNode, address common.Address) (uint64, error) {
nonce, err := fullNode.PendingNonceAt(ctx, address)
func prev(ctx context.Context, fullNode node.FullNode, address common.Address) (balance *big.Int, nonce uint64, err error) {
err = syncutils.BatchRun(
func() error {
var er error
balance, er = fullNode.Balance(ctx, address)
if er != nil {
return er
}

return nil
},
func() error {
var er error
nonce, er = fullNode.PendingNonceAt(ctx, address)
if er != nil {
return er
}

return nil
})

if err != nil {
log.Errorw("failed to get nonce", "err", err)
return 0, err
log.Errorw("failed to query sentry balance or nonce", "err", err)
}

return nonce, err
return
}
8 changes: 4 additions & 4 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ func main() {

log.Infow("bsc mev-sentry start", "configPath", *configPath, "config", cfg)

acc, err := account.New(&cfg.Account)
fullNode := node.NewFullNode(&cfg.FullNode)

acc, err := account.New(&cfg.Account, fullNode)
if err != nil {
log.Panicw("failed to create account", "err", err)
}
Expand All @@ -61,10 +63,8 @@ func main() {
}
}

fullNode := node.NewFullNode(&cfg.FullNode)

rpcServer := rpc.NewServer()
sentryService := service.NewMevSentry(&cfg.Service, acc, validators, builders, fullNode)
sentryService := service.NewMevSentry(&cfg.Service, acc, validators, builders)
if err = rpcServer.RegisterName("mev", sentryService); err != nil {
panic(err)
}
Expand Down
6 changes: 3 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ require (
github.com/goccy/go-json v0.10.2 // indirect
github.com/gofrs/flock v0.8.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect
github.com/google/uuid v1.4.0 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
Expand Down Expand Up @@ -144,7 +144,7 @@ require (
golang.org/x/tools v0.16.0 // indirect
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
google.golang.org/grpc v1.56.3 // indirect
google.golang.org/protobuf v1.31.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
rsc.io/tmplfunc v0.0.3 // indirect
Expand All @@ -153,7 +153,7 @@ require (
replace (
github.com/btcsuite/btcd => github.com/btcsuite/btcd v0.23.0
github.com/cometbft/cometbft => github.com/bnb-chain/greenfield-tendermint v0.0.0-20230417032003-4cda1f296fb2
github.com/ethereum/go-ethereum => github.com/irrun/bsc v0.0.0-20240307063536-491ddfc5f814
github.com/ethereum/go-ethereum => github.com/bnb-chain/bsc-builder v0.0.0-20240320091307-8943e3fd7c83
github.com/grpc-ecosystem/grpc-gateway/v2 => github.com/prysmaticlabs/grpc-gateway/v2 v2.3.1-0.20210702154020-550e1cd83ec1
github.com/syndtr/goleveldb v1.0.1 => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
github.com/tendermint/tendermint => github.com/bnb-chain/tendermint v0.31.16
Expand Down
19 changes: 12 additions & 7 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -938,6 +938,9 @@ github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
github.com/bnb-chain/bsc-builder v0.0.0-20240320091307-8943e3fd7c83 h1:w1Ex51i0Q1DSWvTPmP7JdVSp4MFEvEGGv82W/dh6VgE=
github.com/bnb-chain/bsc-builder v0.0.0-20240320091307-8943e3fd7c83/go.mod h1:r9/LuIlntgKKPG0ztTHdX2Env53Vci323MQivBOSR3Q=
github.com/bnb-chain/fastssz v0.1.2/go.mod h1:KcabV+OEw2QwgyY8Fc88ZG79CKYkFdu0kKWyfA3dI6o=
github.com/bnb-chain/greenfield-tendermint v0.0.0-20230417032003-4cda1f296fb2 h1:jubavYCs/mCFj/g6Utl+l4SfpykdBdWJFPsvb9FcEXU=
github.com/bnb-chain/greenfield-tendermint v0.0.0-20230417032003-4cda1f296fb2/go.mod h1:9q11eHNRY9FDwFH+4pompzPNGv//Z3VcfvkELaHJPMs=
github.com/bnb-chain/ics23 v0.1.0 h1:DvjGOts2FBfbxB48384CYD1LbcrfjThFz8kowY/7KxU=
Expand Down Expand Up @@ -1430,8 +1433,9 @@ github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5 h1:6dVcS0LktRSyEE
github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5/go.mod h1:S8yiDeAXy8f88W4Ul+0dBMPx49S05byYbmZD6Uv94K4=
github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI=
github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY=
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c=
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA=
github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA=
github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
Expand Down Expand Up @@ -1716,8 +1720,9 @@ 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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
Expand Down Expand Up @@ -2013,8 +2018,9 @@ github.com/herumi/bls-eth-go-binary v0.0.0-20210130185500-57372fb27371/go.mod h1
github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e h1:wCMygKUQhmcQAjlk2Gquzq6dLmyMv2kF+llRspoRgrk=
github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw=
github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc=
github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4=
github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc=
github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
github.com/holiman/goevmlab v0.0.0-20221201133036-b31966a5267d/go.mod h1:tQJ4EfAokPShVDyEwKslIWKyt0qA/z8u+iK3kAwO424=
Expand Down Expand Up @@ -2107,8 +2113,6 @@ github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5Uybo
github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g=
github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw=
github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA=
github.com/irrun/bsc v0.0.0-20240307063536-491ddfc5f814 h1:SNtLl+uHpc1BH7cfIg3uMFtC8C2vUck/UX5iEEqHqxw=
github.com/irrun/bsc v0.0.0-20240307063536-491ddfc5f814/go.mod h1:GiSvQIQBNzED3cQQQxnAZSo5rfDmCWynGqSQWtPhBqc=
github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg=
github.com/ishidawataru/sctp v0.0.0-20210226210310-f2269e66cdee/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg=
github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA=
Expand Down Expand Up @@ -3100,6 +3104,7 @@ github.com/prysmaticlabs/go-bitfield v0.0.0-20210108222456-8e92c3709aa0/go.mod h
github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw=
github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4=
github.com/prysmaticlabs/gohashtree v0.0.0-20220517220438-192ee5ae6982/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk=
github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk=
github.com/prysmaticlabs/gohashtree v0.0.3-alpha h1:1EVinCWdb3Lorq7xn8DYQHf48nCcdAM3Vb18KsFlRWY=
github.com/prysmaticlabs/gohashtree v0.0.3-alpha/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk=
github.com/prysmaticlabs/grpc-gateway/v2 v2.3.1-0.20210702154020-550e1cd83ec1 h1:xcu59yYL6AWWTl6jtejBfE0y8uF35fArCBeZjRlvJss=
Expand Down Expand Up @@ -4876,8 +4881,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw
google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610=
Expand Down
5 changes: 5 additions & 0 deletions node/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
type FullNode interface {
ChainID() *big.Int
PendingNonceAt(context.Context, common.Address) (uint64, error)
Balance(context.Context, common.Address) (*big.Int, error)
}

type FullNodeConfig struct {
Expand Down Expand Up @@ -62,6 +63,10 @@ func (f *fullNode) PendingNonceAt(ctx context.Context, account common.Address) (
return f.client.PendingNonceAt(ctx, account)
}

func (f *fullNode) Balance(ctx context.Context, account common.Address) (*big.Int, error) {
return f.client.BalanceAt(ctx, account, nil)
}

func (f *fullNode) refresh() {
chainID, err := f.client.ChainID(context.Background())
if err != nil {
Expand Down
8 changes: 8 additions & 0 deletions node/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package node
import (
"context"
"crypto/tls"
"fmt"
"math/big"
"net"
"net/http"
Expand Down Expand Up @@ -47,6 +48,7 @@ type Validator interface {
type ValidatorConfig struct {
PrivateURL string
PublicHostName string
BidFeeCeil uint64
}

func NewValidator(config *ValidatorConfig) Validator {
Expand Down Expand Up @@ -82,6 +84,12 @@ type validator struct {
}

func (n *validator) SendBid(ctx context.Context, args types.BidArgs) (common.Hash, error) {
bidFeeCeil := big.NewInt(int64(n.cfg.BidFeeCeil))

if args.RawBid.BuilderFee.Cmp(bidFeeCeil) > 0 {
return common.Hash{}, fmt.Errorf("bid fee exceeds the ceiling %v", n.cfg.BidFeeCeil)
}

return n.client.SendBid(ctx, args)
}

Expand Down
18 changes: 7 additions & 11 deletions service/sentry.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,20 +46,18 @@ type MevSentry struct {
account account.Account
validators map[string]node.Validator // hostname -> validator
builders map[common.Address]node.Builder // address -> builder
fullNode node.FullNode
}

func NewMevSentry(cfg *Config,
account account.Account,
validators map[string]node.Validator,
builders map[common.Address]node.Builder,
fullNode node.FullNode) *MevSentry {
) *MevSentry {
s := &MevSentry{
timeout: cfg.RPCTimeout,
account: account,
validators: validators,
builders: builders,
fullNode: fullNode,
}

return s
Expand Down Expand Up @@ -88,16 +86,14 @@ func (s *MevSentry) SendBid(ctx context.Context, args types.BidArgs) (common.Has
return common.Hash{}, types.NewInvalidBidError(fmt.Sprintf("invalid signature:%v", err))
}

if args.RawBid.BuilderFee != nil && args.RawBid.BuilderFee.Cmp(big.NewInt(0)) > 0 {
payBidTx, er := s.account.PayBidTx(ctx, s.fullNode, builder, args.RawBid.BuilderFee)
if er != nil {
log.Errorw("failed to create pay bid tx", "err", err)
return common.Hash{}, err
}

args.PayBidTx = payBidTx
payBidTx, er := s.account.PayBidTx(ctx, builder, args.RawBid.BuilderFee)
if er != nil {
log.Errorw("failed to create pay bid tx", "err", err)
return common.Hash{}, err
}

args.PayBidTx = payBidTx

return validator.SendBid(ctx, args)
}

Expand Down
Loading

0 comments on commit 4181bd7

Please sign in to comment.