From ee8f1346f46d3dabf3471c634dac68475d8f7b76 Mon Sep 17 00:00:00 2001 From: Anton Bronnikov Date: Wed, 6 Mar 2024 22:56:10 +0200 Subject: [PATCH 1/8] core/vm, params: ensure order of forks, prevent overflow --- core/vm/operations_acl.go | 7 ++++++- internal/ethapi/api_test.go | 2 +- params/config.go | 10 ++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/core/vm/operations_acl.go b/core/vm/operations_acl.go index bca6d1e83b88..f420a241058b 100644 --- a/core/vm/operations_acl.go +++ b/core/vm/operations_acl.go @@ -187,7 +187,12 @@ func makeCallVariantGasCallEIP2929(oldCalculator gasFunc) gasFunc { // outside of this function, as part of the dynamic gas, and that will make it // also become correctly reported to tracers. contract.Gas += coldCost - return gas + coldCost, nil + + var overflow bool + if gas, overflow = math.SafeAdd(gas, coldCost); overflow { + return 0, ErrGasUintOverflow + } + return gas, nil } } diff --git a/internal/ethapi/api_test.go b/internal/ethapi/api_test.go index 831b865a0381..3c9b186040a1 100644 --- a/internal/ethapi/api_test.go +++ b/internal/ethapi/api_test.go @@ -1459,6 +1459,7 @@ func setupReceiptBackend(t *testing.T, genBlocks int) (*testBackend, []common.Ha tx *types.Transaction err error ) + b.SetPoS() switch i { case 0: // transfer 1000wei @@ -1507,7 +1508,6 @@ func setupReceiptBackend(t *testing.T, genBlocks int) (*testBackend, []common.Ha b.AddTx(tx) txHashes[i] = tx.Hash() } - b.SetPoS() }) return backend, txHashes } diff --git a/params/config.go b/params/config.go index 7e8dfc8124bc..e97d21af5650 100644 --- a/params/config.go +++ b/params/config.go @@ -859,6 +859,8 @@ func (c *ChainConfig) Rules(num *big.Int, isMerge bool, timestamp uint64) Rules if chainID == nil { chainID = new(big.Int) } + // disallow setting Merge out of order + isMerge = isMerge && c.IsLondon(num) return Rules{ ChainID: new(big.Int).Set(chainID), IsHomestead: c.IsHomestead(num), @@ -872,9 +874,9 @@ func (c *ChainConfig) Rules(num *big.Int, isMerge bool, timestamp uint64) Rules IsBerlin: c.IsBerlin(num), IsLondon: c.IsLondon(num), IsMerge: isMerge, - IsShanghai: c.IsShanghai(num, timestamp), - IsCancun: c.IsCancun(num, timestamp), - IsPrague: c.IsPrague(num, timestamp), - IsVerkle: c.IsVerkle(num, timestamp), + IsShanghai: isMerge && c.IsShanghai(num, timestamp), + IsCancun: isMerge && c.IsCancun(num, timestamp), + IsPrague: isMerge && c.IsPrague(num, timestamp), + IsVerkle: isMerge && c.IsVerkle(num, timestamp), } } From f52c1110647a6bc8e1c2b252f06d8f379ab907e6 Mon Sep 17 00:00:00 2001 From: "n.medvedev" Date: Thu, 7 Mar 2024 18:35:19 +0000 Subject: [PATCH 2/8] fix docker compose so example tests successfully pass --- suave/devenv/docker-compose.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/suave/devenv/docker-compose.yml b/suave/devenv/docker-compose.yml index e8993307f19c..a85593b21e98 100644 --- a/suave/devenv/docker-compose.yml +++ b/suave/devenv/docker-compose.yml @@ -18,6 +18,9 @@ services: - --keystore=/keystore/keystore - --unlock=0xB5fEAfbDD752ad52Afb7e1bD2E40432A485bBB7F - --password=/keystore/password.txt + - --suave.dev + - --suave.eth.remote_endpoint=http://suave-enabled-chain:8545 + - --suave.eth.external-whitelist=172.17.0.1 depends_on: - suave-enabled-chain volumes: @@ -25,12 +28,28 @@ services: ports: - 8545:8545 - 8546:8546 + networks: + - suave-net suave-enabled-chain: build: ../.. command: - --dev - --dev.gaslimit=30000000 - --http + - --http.addr=0.0.0.0 + - --http.vhosts=* + - --http.corsdomain=* + - --datadir=/data + - --keystore=/keystore/keystore + - --password=/keystore/password.txt + - --unlock=0xB5fEAfbDD752ad52Afb7e1bD2E40432A485bBB7F + - --allow-insecure-unlock - --ws ports: - 8555:8545 + volumes: + - ./suave-ex-node:/keystore + networks: + - suave-net +networks: + suave-net: From 80ec7dcf02c5d8d503494ac870af1f2ee9b590db Mon Sep 17 00:00:00 2001 From: Jinsuk Park Date: Tue, 12 Mar 2024 16:17:47 -0700 Subject: [PATCH 3/8] adds AddTransactions, AddBundle, AddBundles to the builder API --- miner/builder.go | 131 +++++++++++++++++++++++--- miner/builder_test.go | 154 ++++++++++++++++++++++++++++++- suave/builder/api/api.go | 17 ++++ suave/builder/api/api_client.go | 18 ++++ suave/builder/api/api_server.go | 15 +++ suave/builder/api/api_test.go | 12 ++- suave/builder/session_manager.go | 24 +++++ 7 files changed, 355 insertions(+), 16 deletions(-) diff --git a/miner/builder.go b/miner/builder.go index 578e2a09e509..6be23de13cc2 100644 --- a/miner/builder.go +++ b/miner/builder.go @@ -22,6 +22,13 @@ import ( "github.com/holiman/uint256" ) +var ( + ErrInvalidInclusionRange = errors.New("invalid inclusion range") + ErrInvalidBlockNumber = errors.New("invalid block number") + ErrExceedsMaxBlock = errors.New("block number exceeds max block") + ErrEmptyTxs = errors.New("empty transactions") +) + type BuilderConfig struct { ChainConfig *params.ChainConfig Engine consensus.Engine @@ -77,28 +84,100 @@ func NewBuilder(config *BuilderConfig, args *BuilderArgs) (*Builder, error) { return b, nil } -type SBundle struct { - BlockNumber *big.Int `json:"blockNumber,omitempty"` // if BlockNumber is set it must match DecryptionCondition! - MaxBlock *big.Int `json:"maxBlock,omitempty"` - Txs types.Transactions `json:"txs"` - RevertingHashes []common.Hash `json:"revertingHashes,omitempty"` - RefundPercent *int `json:"percent,omitempty"` -} - -func (b *Builder) AddTransaction(txn *types.Transaction) (*suavextypes.SimulateTransactionResult, error) { +func (b *Builder) addTransaction(txn *types.Transaction, env *environment) (*suavextypes.SimulateTransactionResult, error) { // If the context is not set, the logs will not be recorded b.env.state.SetTxContext(txn.Hash(), b.env.tcount) - logs, err := b.wrk.commitTransaction(b.env, txn) + logs, err := b.wrk.commitTransaction(env, txn) if err != nil { return &suavextypes.SimulateTransactionResult{ Error: err.Error(), Success: false, - }, nil + }, err } return receiptToSimResult(&types.Receipt{Logs: logs}), nil } +func (b *Builder) AddTransaction(txn *types.Transaction) (*suavextypes.SimulateTransactionResult, error) { + res, _ := b.addTransaction(txn, b.env) + return res, nil +} + +func (b *Builder) AddTransactions(txns types.Transactions) ([]*suavextypes.SimulateTransactionResult, error) { + var result []*suavextypes.SimulateTransactionResult + snap := b.env.copy() + + for _, txn := range txns { + res, err := b.addTransaction(txn, snap) + result = append(result, res) + if err != nil { + return result, nil + } + } + b.env = snap + return result, nil +} + +func (b *Builder) addBundle(bundle *suavextypes.Bundle, env *environment) (*suavextypes.SimulateBundleResult, error) { + if err := checkBundleInclusion(b.env.header.Number, bundle); err != nil { + return nil, err + } + + revertingHashes := bundle.RevertingHashesMap() + + var results []*suavextypes.SimulateTransactionResult + for _, txn := range bundle.Txs { + result, err := b.addTransaction(txn, env) + results = append(results, result) + if err != nil { + if _, ok := revertingHashes[txn.Hash()]; ok { + // continue if the transaction is in the reverting hashes + continue + } + return &suavextypes.SimulateBundleResult{ + Error: err.Error(), + Success: false, + }, nil + } + } + + return &suavextypes.SimulateBundleResult{ + SimulateTransactionResults: results, + Success: true, + }, nil +} + +func (b *Builder) AddBundle(bundle *suavextypes.Bundle) (*suavextypes.SimulateBundleResult, error) { + snap := b.env.copy() + result, err := b.addBundle(bundle, snap) + + if err != nil { + return &suavextypes.SimulateBundleResult{ + Error: err.Error(), + Success: false, + }, nil + } + + b.env = snap + return result, nil +} + +func (b *Builder) AddBundles(bundles []*suavextypes.Bundle) ([]*suavextypes.SimulateBundleResult, error) { + var results []*suavextypes.SimulateBundleResult + snap := b.env.copy() + + for _, bundle := range bundles { + result, err := b.addBundle(bundle, snap) + results = append(results, result) + if err != nil { + return results, nil + } + } + + b.env = snap + return results, nil +} + func (b *Builder) FillPending() error { if err := b.wrk.commitPendingTxs(b.env); err != nil { return err @@ -223,3 +302,33 @@ func executableDataToDenebExecutionPayload(data *engine.ExecutableData) (*deneb. Withdrawals: withdrawalData, }, nil } + +func checkBundleInclusion(currentBlockNumber *big.Int, bundle *suavextypes.Bundle) error { + if bundle.BlockNumber != nil && bundle.MaxBlock != nil && bundle.BlockNumber.Cmp(bundle.MaxBlock) > 0 { + return ErrInvalidInclusionRange + } + + // check inclusion target if BlockNumber is set + if bundle.BlockNumber != nil { + if bundle.MaxBlock == nil && currentBlockNumber.Cmp(bundle.BlockNumber) != 0 { + return ErrInvalidBlockNumber + } + + if bundle.MaxBlock != nil { + if currentBlockNumber.Cmp(bundle.MaxBlock) > 0 { + return ErrExceedsMaxBlock + } + + if currentBlockNumber.Cmp(bundle.BlockNumber) < 0 { + return ErrInvalidBlockNumber + } + } + } + + // check if the bundle has transactions + if bundle.Txs == nil || bundle.Txs.Len() == 0 { + return ErrEmptyTxs + } + + return nil +} diff --git a/miner/builder_test.go b/miner/builder_test.go index d0e89ff3d4b2..eea4a601690f 100644 --- a/miner/builder_test.go +++ b/miner/builder_test.go @@ -12,9 +12,12 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/clique" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" + suavextypes "github.com/ethereum/go-ethereum/suave/builder/api" "github.com/stretchr/testify/require" ) @@ -40,6 +43,110 @@ func TestBuilder_AddTxn_Simple(t *testing.T) { require.Len(t, builder.env.receipts, 1) } +func TestBuilder_AddTxns_Simple(t *testing.T) { + t.Parallel() + config, backend := newMockBuilderConfig(t) + builder, err := NewBuilder(config, &BuilderArgs{}) + require.NoError(t, err) + + tx1 := backend.newRandomTx(false) + tx2 := backend.newRandomTxWithNonce(1) + + res, err := builder.AddTransactions([]*types.Transaction{tx1, tx2}) + require.NoError(t, err) + require.Len(t, res, 2) + for _, r := range res { + require.True(t, r.Success) + } + + tx3 := backend.newRandomTxWithNonce(2) + tx4 := backend.newRandomTxWithNonce(1000) // fails with nonce too high + + res, err = builder.AddTransactions([]*types.Transaction{tx3, tx4}) + require.NoError(t, err) + require.Len(t, res, 2) + require.True(t, res[0].Success) + require.False(t, res[1].Success) + require.Len(t, builder.env.txs, 2) +} + +func TestBuilder_AddBundle_Simple(t *testing.T) { + t.Parallel() + config, backend := newMockBuilderConfig(t) + builder, err := NewBuilder(config, &BuilderArgs{}) + require.NoError(t, err) + + tx1 := backend.newRandomTx(false) + tx2 := backend.newRandomTxWithNonce(1) + + bundle := &suavextypes.Bundle{ + Txs: []*types.Transaction{tx1, tx2}, + } + + res, err := builder.AddBundle(bundle) + require.NoError(t, err) + require.True(t, res.Success) + require.Len(t, res.SimulateTransactionResults, 2) +} + +func TestBuilder_AddBundle_RevertHashes(t *testing.T) { + t.Parallel() + config, backend := newMockBuilderConfig(t) + builder, err := NewBuilder(config, &BuilderArgs{}) + require.NoError(t, err) + + tx1 := backend.newRandomTx(false) + tx2 := backend.newRandomTxWithNonce(3) // fails with nonce too high + + bundle := &suavextypes.Bundle{ + Txs: []*types.Transaction{tx1, tx2}, + RevertingHashes: []common.Hash{tx2.Hash()}, + } + + res, err := builder.AddBundle(bundle) + require.NoError(t, err) + require.True(t, res.Success) + require.Len(t, res.SimulateTransactionResults, 2) + require.True(t, res.SimulateTransactionResults[0].Success) + require.False(t, res.SimulateTransactionResults[1].Success) +} + +func TestBuilder_AddBundle_InvalidInclusion(t *testing.T) { + t.Parallel() + config, backend := newMockBuilderConfig(t) + builder, err := NewBuilder(config, &BuilderArgs{ + Slot: 10, + }) + require.NoError(t, err) + + tx1 := backend.newRandomTx(false) + tx2 := backend.newRandomTx(false) + + bundle := &suavextypes.Bundle{ + Txs: []*types.Transaction{tx1, tx2}, + BlockNumber: big.NewInt(20), + } + + backend.insertRandomBlocks(10) + require.Equal(t, uint64(10), backend.chain.CurrentBlock().Number.Uint64()) + + res, err := builder.AddBundle(bundle) + require.NoError(t, err) + require.False(t, res.Success) + require.Len(t, res.SimulateTransactionResults, 0) + + bundle = &suavextypes.Bundle{ + Txs: []*types.Transaction{tx1, tx2}, + BlockNumber: big.NewInt(5), + MaxBlock: big.NewInt(6), + } + + res, err = builder.AddBundle(bundle) + require.NoError(t, err) + require.False(t, res.Success) + require.Len(t, res.SimulateTransactionResults, 0) +} + func TestBuilder_FillTransactions(t *testing.T) { t.Parallel() config, backend := newMockBuilderConfig(t) @@ -118,10 +225,8 @@ func TestBuilder_Bid(t *testing.T) { _, err = builder.BuildBlock() require.NoError(t, err) - req, err := builder.Bid([48]byte{}) + _, err = builder.Bid([48]byte{}) require.NoError(t, err) - - fmt.Println("-- req --", req) } func newMockBuilderConfig(t *testing.T) (*BuilderConfig, *testWorkerBackend) { @@ -145,6 +250,49 @@ func newMockBuilderConfig(t *testing.T) (*BuilderConfig, *testWorkerBackend) { return bConfig, backend } +func (b *testWorkerBackend) newRandomTxWithNonce(nonce uint64) *types.Transaction { + gasPrice := big.NewInt(10 * params.InitialBaseFee) + tx, _ := types.SignTx(types.NewTransaction(nonce, testUserAddress, big.NewInt(1000), params.TxGas, gasPrice, nil), types.HomesteadSigner{}, testBankKey) + return tx +} + +func (b *testWorkerBackend) insertRandomBlocks(n int) []*types.Block { + extraVanity := 32 + extraSeal := crypto.SignatureLength + diffInTurn := big.NewInt(2) + signer := new(types.HomesteadSigner) + _, blocks, _ := core.GenerateChainWithGenesis(b.genesis, b.chain.Engine(), n, func(i int, block *core.BlockGen) { + block.SetDifficulty(big.NewInt(2)) // diffInTurn + + if i != 1 { + tx, err := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), common.Address{0x00}, new(big.Int), params.TxGas, block.BaseFee(), nil), signer, testBankKey) + if err != nil { + panic(err) + } + block.AddTxWithChain(b.chain, tx) + } + }) + + for i, block := range blocks { + header := block.Header() + if i > 0 { + header.ParentHash = blocks[i-1].Hash() + } + header.Extra = make([]byte, extraVanity+extraSeal) + header.Difficulty = diffInTurn + + sig, _ := crypto.Sign(clique.SealHash(header).Bytes(), testBankKey) + copy(header.Extra[len(header.Extra)-extraSeal:], sig) + blocks[i] = block.WithSeal(header) + } + + if _, err := b.chain.InsertChain(blocks); err != nil { + panic(fmt.Sprintf("failed to insert initial blocks: %v", err)) + } + + return blocks +} + func (b *testWorkerBackend) newCall(to common.Address, data []byte) *types.Transaction { gasPrice := big.NewInt(10 * params.InitialBaseFee) tx, _ := types.SignTx(types.NewTransaction(b.txPool.Nonce(testBankAddress), to, big.NewInt(0), 1000000, gasPrice, data), types.HomesteadSigner{}, testBankKey) diff --git a/suave/builder/api/api.go b/suave/builder/api/api.go index 41376fede603..c4d04b1633dd 100644 --- a/suave/builder/api/api.go +++ b/suave/builder/api/api.go @@ -24,6 +24,14 @@ type Bundle struct { RefundPercent *int `json:"percent,omitempty"` } +func (bundle *Bundle) RevertingHashesMap() map[common.Hash]struct{} { + m := make(map[common.Hash]struct{}) + for _, hash := range bundle.RevertingHashes { + m[hash] = struct{}{} + } + return m +} + type BuildBlockArgs struct { Slot uint64 `json:"slot"` ProposerPubkey []byte `json:"proposerPubkey"` @@ -52,6 +60,12 @@ type SimulateTransactionResult struct { Error string `json:"error"` } +type SimulateBundleResult struct { + SimulateTransactionResults []*SimulateTransactionResult + Success bool + Error string +} + // field type overrides for gencodec type simulateTransactionResultMarshaling struct { Egp hexutil.Uint64 @@ -77,6 +91,9 @@ type SubmitBlockRequest struct { type API interface { NewSession(ctx context.Context, args *BuildBlockArgs) (string, error) AddTransaction(ctx context.Context, sessionId string, tx *types.Transaction) (*SimulateTransactionResult, error) + AddTransactions(ctx context.Context, sessionId string, txs types.Transactions) ([]*SimulateTransactionResult, error) + AddBundle(ctx context.Context, sessionId string, bundle *Bundle) (*SimulateBundleResult, error) + AddBundles(ctx context.Context, sessionId string, bundles []*Bundle) ([]*SimulateBundleResult, error) BuildBlock(ctx context.Context, sessionId string) error Bid(ctx context.Context, sessioId string, blsPubKey phase0.BLSPubKey) (*SubmitBlockRequest, error) } diff --git a/suave/builder/api/api_client.go b/suave/builder/api/api_client.go index 9f75c04a6254..da99414bed91 100644 --- a/suave/builder/api/api_client.go +++ b/suave/builder/api/api_client.go @@ -42,6 +42,24 @@ func (a *APIClient) AddTransaction(ctx context.Context, sessionId string, tx *ty return receipt, err } +func (a *APIClient) AddTransactions(ctx context.Context, sessionId string, txs types.Transactions) ([]*SimulateTransactionResult, error) { + var receipt []*SimulateTransactionResult + err := a.rpc.CallContext(ctx, &receipt, "suavex_addTransactions", sessionId, txs) + return receipt, err +} + +func (a *APIClient) AddBundle(ctx context.Context, sessionId string, bundle *Bundle) (*SimulateBundleResult, error) { + var receipt *SimulateBundleResult + err := a.rpc.CallContext(ctx, &receipt, "suavex_addBundle", sessionId, bundle) + return receipt, err +} + +func (a *APIClient) AddBundles(ctx context.Context, sessionId string, bundles []*Bundle) ([]*SimulateBundleResult, error) { + var receipt []*SimulateBundleResult + err := a.rpc.CallContext(ctx, &receipt, "suavex_addBundles", sessionId, bundles) + return receipt, err +} + func (a *APIClient) BuildBlock(ctx context.Context, sessionId string) error { return a.rpc.CallContext(ctx, nil, "suavex_buildBlock", sessionId) } diff --git a/suave/builder/api/api_server.go b/suave/builder/api/api_server.go index 233240bb3db3..ad4aa0a18468 100644 --- a/suave/builder/api/api_server.go +++ b/suave/builder/api/api_server.go @@ -13,6 +13,9 @@ var _ API = (*Server)(nil) type SessionManager interface { NewSession(context.Context, *BuildBlockArgs) (string, error) AddTransaction(sessionId string, tx *types.Transaction) (*SimulateTransactionResult, error) + AddTransactions(sessionId string, txs types.Transactions) ([]*SimulateTransactionResult, error) + AddBundle(sessionId string, bundle *Bundle) (*SimulateBundleResult, error) + AddBundles(sessionId string, bundles []*Bundle) ([]*SimulateBundleResult, error) BuildBlock(sessionId string) error Bid(sessionId string, blsPubKey phase0.BLSPubKey) (*SubmitBlockRequest, error) } @@ -36,6 +39,18 @@ func (s *Server) AddTransaction(ctx context.Context, sessionId string, tx *types return s.sessionMngr.AddTransaction(sessionId, tx) } +func (s *Server) AddTransactions(ctx context.Context, sessionId string, txs types.Transactions) ([]*SimulateTransactionResult, error) { + return s.sessionMngr.AddTransactions(sessionId, txs) +} + +func (s *Server) AddBundle(ctx context.Context, sessionId string, bundle *Bundle) (*SimulateBundleResult, error) { + return s.sessionMngr.AddBundle(sessionId, bundle) +} + +func (s *Server) AddBundles(ctx context.Context, sessionId string, bundles []*Bundle) ([]*SimulateBundleResult, error) { + return s.sessionMngr.AddBundles(sessionId, bundles) +} + func (s *Server) BuildBlock(ctx context.Context, sessionId string) error { return s.sessionMngr.BuildBlock(sessionId) } diff --git a/suave/builder/api/api_test.go b/suave/builder/api/api_test.go index 0c29477ac106..a3041247b927 100644 --- a/suave/builder/api/api_test.go +++ b/suave/builder/api/api_test.go @@ -39,8 +39,16 @@ func (nullSessionManager) AddTransaction(sessionId string, tx *types.Transaction return &SimulateTransactionResult{Logs: []*SimulatedLog{}}, nil } -func (nullSessionManager) AddBundle(sessionId string, bundle Bundle) error { - return nil +func (nullSessionManager) AddTransactions(sessionId string, txs types.Transactions) ([]*SimulateTransactionResult, error) { + return nil, nil +} + +func (nullSessionManager) AddBundle(sessionId string, bundle *Bundle) (*SimulateBundleResult, error) { + return nil, nil +} + +func (nullSessionManager) AddBundles(sessionId string, bundles []*Bundle) ([]*SimulateBundleResult, error) { + return nil, nil } func (nullSessionManager) BuildBlock(sessionId string) error { diff --git a/suave/builder/session_manager.go b/suave/builder/session_manager.go index cef712659113..cf27ae254f25 100644 --- a/suave/builder/session_manager.go +++ b/suave/builder/session_manager.go @@ -150,6 +150,30 @@ func (s *SessionManager) AddTransaction(sessionId string, tx *types.Transaction) return builder.AddTransaction(tx) } +func (s *SessionManager) AddTransactions(sessionId string, txs types.Transactions) ([]*api.SimulateTransactionResult, error) { + builder, err := s.getSession(sessionId) + if err != nil { + return nil, err + } + return builder.AddTransactions(txs) +} + +func (s *SessionManager) AddBundle(sessionId string, bundle *api.Bundle) (*api.SimulateBundleResult, error) { + builder, err := s.getSession(sessionId) + if err != nil { + return nil, err + } + return builder.AddBundle(bundle) +} + +func (s *SessionManager) AddBundles(sessionId string, bundles []*api.Bundle) ([]*api.SimulateBundleResult, error) { + builder, err := s.getSession(sessionId) + if err != nil { + return nil, err + } + return builder.AddBundles(bundles) +} + func (s *SessionManager) BuildBlock(sessionId string) error { builder, err := s.getSession(sessionId) if err != nil { From acb8edda0036925b261bf0edc16418b7a40a8922 Mon Sep 17 00:00:00 2001 From: Jinsuk Park Date: Tue, 12 Mar 2024 16:23:36 -0700 Subject: [PATCH 4/8] fix lint error --- miner/builder.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/miner/builder.go b/miner/builder.go index 6be23de13cc2..dcad81042043 100644 --- a/miner/builder.go +++ b/miner/builder.go @@ -218,8 +218,8 @@ func (b *Builder) Bid(builderPubKey phase0.BLSPubKey) (*suavextypes.SubmitBlockR blockBidMsg := builderV1.BidTrace{ Slot: b.args.Slot, - ParentHash: phase0.Hash32(payload.ParentHash), - BlockHash: phase0.Hash32(payload.BlockHash), + ParentHash: payload.ParentHash, + BlockHash: payload.BlockHash, BuilderPubkey: builderPubKey, ProposerPubkey: phase0.BLSPubKey(proposerPubkey), ProposerFeeRecipient: bellatrix.ExecutionAddress(b.args.FeeRecipient), From 8d856b98ac6576f1779076f3570aa8b4ecb095d7 Mon Sep 17 00:00:00 2001 From: Jinsuk Park Date: Tue, 12 Mar 2024 16:36:51 -0700 Subject: [PATCH 5/8] populate egp field --- miner/builder.go | 10 ++++++++-- suave/builder/api/api.go | 7 ++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/miner/builder.go b/miner/builder.go index dcad81042043..da3576755562 100644 --- a/miner/builder.go +++ b/miner/builder.go @@ -88,6 +88,7 @@ func (b *Builder) addTransaction(txn *types.Transaction, env *environment) (*sua // If the context is not set, the logs will not be recorded b.env.state.SetTxContext(txn.Hash(), b.env.tcount) + prevGas := env.header.GasUsed logs, err := b.wrk.commitTransaction(env, txn) if err != nil { return &suavextypes.SimulateTransactionResult{ @@ -95,7 +96,8 @@ func (b *Builder) addTransaction(txn *types.Transaction, env *environment) (*sua Success: false, }, err } - return receiptToSimResult(&types.Receipt{Logs: logs}), nil + egp := env.header.GasUsed - prevGas + return receiptToSimResult(&types.Receipt{Logs: logs}, egp), nil } func (b *Builder) AddTransaction(txn *types.Transaction) (*suavextypes.SimulateTransactionResult, error) { @@ -124,6 +126,7 @@ func (b *Builder) addBundle(bundle *suavextypes.Bundle, env *environment) (*suav } revertingHashes := bundle.RevertingHashesMap() + egp := uint64(0) var results []*suavextypes.SimulateTransactionResult for _, txn := range bundle.Txs { @@ -139,9 +142,11 @@ func (b *Builder) addBundle(bundle *suavextypes.Bundle, env *environment) (*suav Success: false, }, nil } + egp += result.Egp } return &suavextypes.SimulateBundleResult{ + Egp: egp, SimulateTransactionResults: results, Success: true, }, nil @@ -248,8 +253,9 @@ func (b *Builder) Bid(builderPubKey phase0.BLSPubKey) (*suavextypes.SubmitBlockR return &bidRequest, nil } -func receiptToSimResult(receipt *types.Receipt) *suavextypes.SimulateTransactionResult { +func receiptToSimResult(receipt *types.Receipt, egp uint64) *suavextypes.SimulateTransactionResult { result := &suavextypes.SimulateTransactionResult{ + Egp: egp, Success: true, Logs: []*suavextypes.SimulatedLog{}, } diff --git a/suave/builder/api/api.go b/suave/builder/api/api.go index c4d04b1633dd..ba77ae270092 100644 --- a/suave/builder/api/api.go +++ b/suave/builder/api/api.go @@ -61,9 +61,10 @@ type SimulateTransactionResult struct { } type SimulateBundleResult struct { - SimulateTransactionResults []*SimulateTransactionResult - Success bool - Error string + Egp uint64 `json:"egp"` + SimulateTransactionResults []*SimulateTransactionResult `json:"simulateTransactionResults"` + Success bool `json:"success"` + Error string `json:"error"` } // field type overrides for gencodec From 32064fbf3d978b7a9edd705a23421599a7254144 Mon Sep 17 00:00:00 2001 From: Jinsuk Park Date: Tue, 12 Mar 2024 16:59:35 -0700 Subject: [PATCH 6/8] check env after failed bundle inclusion --- miner/builder_test.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/miner/builder_test.go b/miner/builder_test.go index eea4a601690f..f27239700bf5 100644 --- a/miner/builder_test.go +++ b/miner/builder_test.go @@ -118,6 +118,7 @@ func TestBuilder_AddBundle_InvalidInclusion(t *testing.T) { Slot: 10, }) require.NoError(t, err) + snap := builder.env tx1 := backend.newRandomTx(false) tx2 := backend.newRandomTx(false) @@ -145,6 +146,37 @@ func TestBuilder_AddBundle_InvalidInclusion(t *testing.T) { require.NoError(t, err) require.False(t, res.Success) require.Len(t, res.SimulateTransactionResults, 0) + // should not modify state for failed bundle inclusion + require.Equal(t, snap, builder.env) +} + +func TestBuilder_AddBundles_Simple(t *testing.T) { + t.Parallel() + config, backend := newMockBuilderConfig(t) + builder, err := NewBuilder(config, &BuilderArgs{ + Slot: 10, + }) + require.NoError(t, err) + + tx1 := backend.newRandomTx(false) + tx2 := backend.newRandomTxWithNonce(1) + + bundle1 := &suavextypes.Bundle{ + Txs: []*types.Transaction{tx1, tx2}, + } + + tx3 := backend.newRandomTxWithNonce(2) + tx4 := backend.newRandomTxWithNonce(3) + + bundle2 := &suavextypes.Bundle{ + Txs: []*types.Transaction{tx3, tx4}, + } + + res, err := builder.AddBundles([]*suavextypes.Bundle{bundle1, bundle2}) + require.NoError(t, err) + require.Len(t, res, 2) + require.True(t, res[0].Success) + require.True(t, res[1].Success) } func TestBuilder_FillTransactions(t *testing.T) { From 80d21f6c4400bf872926e3ad9502a43650510d32 Mon Sep 17 00:00:00 2001 From: Jinsuk Park Date: Tue, 12 Mar 2024 18:54:35 -0700 Subject: [PATCH 7/8] verify state by balance --- miner/builder.go | 29 +++++++++++------------ miner/builder_test.go | 53 ++++++++++++++++++++++++++++++++----------- 2 files changed, 55 insertions(+), 27 deletions(-) diff --git a/miner/builder.go b/miner/builder.go index da3576755562..b46c0010dbba 100644 --- a/miner/builder.go +++ b/miner/builder.go @@ -106,23 +106,26 @@ func (b *Builder) AddTransaction(txn *types.Transaction) (*suavextypes.SimulateT } func (b *Builder) AddTransactions(txns types.Transactions) ([]*suavextypes.SimulateTransactionResult, error) { - var result []*suavextypes.SimulateTransactionResult + results := make([]*suavextypes.SimulateTransactionResult, 0) snap := b.env.copy() for _, txn := range txns { res, err := b.addTransaction(txn, snap) - result = append(result, res) + results = append(results, res) if err != nil { - return result, nil + return results, nil } } b.env = snap - return result, nil + return results, nil } func (b *Builder) addBundle(bundle *suavextypes.Bundle, env *environment) (*suavextypes.SimulateBundleResult, error) { - if err := checkBundleInclusion(b.env.header.Number, bundle); err != nil { - return nil, err + if err := checkBundleParams(b.env.header.Number, bundle); err != nil { + return &suavextypes.SimulateBundleResult{ + Error: err.Error(), + Success: false, + }, err } revertingHashes := bundle.RevertingHashesMap() @@ -138,9 +141,10 @@ func (b *Builder) addBundle(bundle *suavextypes.Bundle, env *environment) (*suav continue } return &suavextypes.SimulateBundleResult{ - Error: err.Error(), - Success: false, - }, nil + Error: err.Error(), + SimulateTransactionResults: results, + Success: false, + }, err } egp += result.Egp } @@ -157,10 +161,7 @@ func (b *Builder) AddBundle(bundle *suavextypes.Bundle) (*suavextypes.SimulateBu result, err := b.addBundle(bundle, snap) if err != nil { - return &suavextypes.SimulateBundleResult{ - Error: err.Error(), - Success: false, - }, nil + return result, nil } b.env = snap @@ -309,7 +310,7 @@ func executableDataToDenebExecutionPayload(data *engine.ExecutableData) (*deneb. }, nil } -func checkBundleInclusion(currentBlockNumber *big.Int, bundle *suavextypes.Bundle) error { +func checkBundleParams(currentBlockNumber *big.Int, bundle *suavextypes.Bundle) error { if bundle.BlockNumber != nil && bundle.MaxBlock != nil && bundle.BlockNumber.Cmp(bundle.MaxBlock) > 0 { return ErrInvalidInclusionRange } diff --git a/miner/builder_test.go b/miner/builder_test.go index f27239700bf5..57f645226754 100644 --- a/miner/builder_test.go +++ b/miner/builder_test.go @@ -28,12 +28,13 @@ func TestBuilder_AddTxn_Simple(t *testing.T) { builder, err := NewBuilder(config, &BuilderArgs{}) require.NoError(t, err) - tx1 := backend.newRandomTx(true) + tx1 := backend.newRandomTx(false) res, err := builder.AddTransaction(tx1) require.NoError(t, err) require.True(t, res.Success) require.Len(t, builder.env.receipts, 1) + require.Equal(t, big.NewInt(1000), builder.env.state.GetBalance(testUserAddress)) // we cannot add the same transaction again. Note that by design the // function does not error but returns the SimulateTransactionResult.success = false @@ -41,6 +42,7 @@ func TestBuilder_AddTxn_Simple(t *testing.T) { require.NoError(t, err) require.False(t, res.Success) require.Len(t, builder.env.receipts, 1) + require.Equal(t, big.NewInt(1000), builder.env.state.GetBalance(testUserAddress)) } func TestBuilder_AddTxns_Simple(t *testing.T) { @@ -58,6 +60,7 @@ func TestBuilder_AddTxns_Simple(t *testing.T) { for _, r := range res { require.True(t, r.Success) } + require.Equal(t, big.NewInt(2000), builder.env.state.GetBalance(testUserAddress)) tx3 := backend.newRandomTxWithNonce(2) tx4 := backend.newRandomTxWithNonce(1000) // fails with nonce too high @@ -68,6 +71,7 @@ func TestBuilder_AddTxns_Simple(t *testing.T) { require.True(t, res[0].Success) require.False(t, res[1].Success) require.Len(t, builder.env.txs, 2) + require.Equal(t, big.NewInt(2000), builder.env.state.GetBalance(testUserAddress)) } func TestBuilder_AddBundle_Simple(t *testing.T) { @@ -87,6 +91,7 @@ func TestBuilder_AddBundle_Simple(t *testing.T) { require.NoError(t, err) require.True(t, res.Success) require.Len(t, res.SimulateTransactionResults, 2) + require.Equal(t, big.NewInt(2000), builder.env.state.GetBalance(testUserAddress)) } func TestBuilder_AddBundle_RevertHashes(t *testing.T) { @@ -99,26 +104,37 @@ func TestBuilder_AddBundle_RevertHashes(t *testing.T) { tx2 := backend.newRandomTxWithNonce(3) // fails with nonce too high bundle := &suavextypes.Bundle{ - Txs: []*types.Transaction{tx1, tx2}, - RevertingHashes: []common.Hash{tx2.Hash()}, + Txs: []*types.Transaction{tx1, tx2}, } res, err := builder.AddBundle(bundle) require.NoError(t, err) + require.False(t, res.Success) + require.Len(t, res.SimulateTransactionResults, 2) + require.True(t, res.SimulateTransactionResults[0].Success) + require.False(t, res.SimulateTransactionResults[1].Success) + require.Equal(t, big.NewInt(0), builder.env.state.GetBalance(testUserAddress)) + + bundle.RevertingHashes = []common.Hash{tx2.Hash()} + + res, err = builder.AddBundle(bundle) + require.NoError(t, err) require.True(t, res.Success) require.Len(t, res.SimulateTransactionResults, 2) require.True(t, res.SimulateTransactionResults[0].Success) require.False(t, res.SimulateTransactionResults[1].Success) + require.Equal(t, big.NewInt(1000), builder.env.state.GetBalance(testUserAddress)) } -func TestBuilder_AddBundle_InvalidInclusion(t *testing.T) { +func TestBuilder_AddBundle_InvalidParams(t *testing.T) { t.Parallel() config, backend := newMockBuilderConfig(t) - builder, err := NewBuilder(config, &BuilderArgs{ - Slot: 10, - }) + // set builder target block number to 10 + backend.insertRandomBlocks(9) + + builder, err := NewBuilder(config, &BuilderArgs{}) + require.Equal(t, uint64(10), builder.env.header.Number.Uint64()) require.NoError(t, err) - snap := builder.env tx1 := backend.newRandomTx(false) tx2 := backend.newRandomTx(false) @@ -128,13 +144,12 @@ func TestBuilder_AddBundle_InvalidInclusion(t *testing.T) { BlockNumber: big.NewInt(20), } - backend.insertRandomBlocks(10) - require.Equal(t, uint64(10), backend.chain.CurrentBlock().Number.Uint64()) - res, err := builder.AddBundle(bundle) require.NoError(t, err) require.False(t, res.Success) + require.Equal(t, ErrInvalidBlockNumber.Error(), res.Error) require.Len(t, res.SimulateTransactionResults, 0) + require.Equal(t, big.NewInt(0), builder.env.state.GetBalance(testUserAddress)) bundle = &suavextypes.Bundle{ Txs: []*types.Transaction{tx1, tx2}, @@ -145,9 +160,20 @@ func TestBuilder_AddBundle_InvalidInclusion(t *testing.T) { res, err = builder.AddBundle(bundle) require.NoError(t, err) require.False(t, res.Success) + require.Equal(t, ErrExceedsMaxBlock.Error(), res.Error) + require.Len(t, res.SimulateTransactionResults, 0) + require.Equal(t, big.NewInt(0), builder.env.state.GetBalance(testUserAddress)) + + bundle = &suavextypes.Bundle{ + Txs: []*types.Transaction{}, + } + + res, err = builder.AddBundle(bundle) + require.NoError(t, err) + require.False(t, res.Success) + require.Equal(t, ErrEmptyTxs.Error(), res.Error) require.Len(t, res.SimulateTransactionResults, 0) - // should not modify state for failed bundle inclusion - require.Equal(t, snap, builder.env) + require.Equal(t, big.NewInt(0), builder.env.state.GetBalance(testUserAddress)) } func TestBuilder_AddBundles_Simple(t *testing.T) { @@ -177,6 +203,7 @@ func TestBuilder_AddBundles_Simple(t *testing.T) { require.Len(t, res, 2) require.True(t, res[0].Success) require.True(t, res[1].Success) + require.Equal(t, big.NewInt(4000), builder.env.state.GetBalance(testUserAddress)) } func TestBuilder_FillTransactions(t *testing.T) { From 0b871ae9fda8dd9ba6c7b64a8060507644f92c96 Mon Sep 17 00:00:00 2001 From: Jinsuk Park Date: Wed, 13 Mar 2024 10:49:38 -0700 Subject: [PATCH 8/8] Remove AddBundle from api --- miner/builder.go | 12 ---- miner/builder_test.go | 102 +++++++++++++------------------ suave/builder/api/api.go | 1 - suave/builder/api/api_client.go | 6 -- suave/builder/api/api_server.go | 5 -- suave/builder/api/api_test.go | 12 ++-- suave/builder/session_manager.go | 8 --- 7 files changed, 50 insertions(+), 96 deletions(-) diff --git a/miner/builder.go b/miner/builder.go index b46c0010dbba..ab9080be5f3f 100644 --- a/miner/builder.go +++ b/miner/builder.go @@ -156,18 +156,6 @@ func (b *Builder) addBundle(bundle *suavextypes.Bundle, env *environment) (*suav }, nil } -func (b *Builder) AddBundle(bundle *suavextypes.Bundle) (*suavextypes.SimulateBundleResult, error) { - snap := b.env.copy() - result, err := b.addBundle(bundle, snap) - - if err != nil { - return result, nil - } - - b.env = snap - return result, nil -} - func (b *Builder) AddBundles(bundles []*suavextypes.Bundle) ([]*suavextypes.SimulateBundleResult, error) { var results []*suavextypes.SimulateBundleResult snap := b.env.copy() diff --git a/miner/builder_test.go b/miner/builder_test.go index 57f645226754..423094cc3ba3 100644 --- a/miner/builder_test.go +++ b/miner/builder_test.go @@ -74,7 +74,7 @@ func TestBuilder_AddTxns_Simple(t *testing.T) { require.Equal(t, big.NewInt(2000), builder.env.state.GetBalance(testUserAddress)) } -func TestBuilder_AddBundle_Simple(t *testing.T) { +func TestBuilder_AddBundles_Simple(t *testing.T) { t.Parallel() config, backend := newMockBuilderConfig(t) builder, err := NewBuilder(config, &BuilderArgs{}) @@ -83,18 +83,26 @@ func TestBuilder_AddBundle_Simple(t *testing.T) { tx1 := backend.newRandomTx(false) tx2 := backend.newRandomTxWithNonce(1) - bundle := &suavextypes.Bundle{ + bundle1 := &suavextypes.Bundle{ Txs: []*types.Transaction{tx1, tx2}, } - res, err := builder.AddBundle(bundle) + tx3 := backend.newRandomTxWithNonce(2) + tx4 := backend.newRandomTxWithNonce(3) + + bundle2 := &suavextypes.Bundle{ + Txs: []*types.Transaction{tx3, tx4}, + } + + res, err := builder.AddBundles([]*suavextypes.Bundle{bundle1, bundle2}) require.NoError(t, err) - require.True(t, res.Success) - require.Len(t, res.SimulateTransactionResults, 2) - require.Equal(t, big.NewInt(2000), builder.env.state.GetBalance(testUserAddress)) + require.Len(t, res, 2) + require.True(t, res[0].Success) + require.True(t, res[1].Success) + require.Equal(t, big.NewInt(4000), builder.env.state.GetBalance(testUserAddress)) } -func TestBuilder_AddBundle_RevertHashes(t *testing.T) { +func TestBuilder_AddBundles_RevertHashes(t *testing.T) { t.Parallel() config, backend := newMockBuilderConfig(t) builder, err := NewBuilder(config, &BuilderArgs{}) @@ -107,26 +115,28 @@ func TestBuilder_AddBundle_RevertHashes(t *testing.T) { Txs: []*types.Transaction{tx1, tx2}, } - res, err := builder.AddBundle(bundle) + res, err := builder.AddBundles([]*suavextypes.Bundle{bundle}) require.NoError(t, err) - require.False(t, res.Success) - require.Len(t, res.SimulateTransactionResults, 2) - require.True(t, res.SimulateTransactionResults[0].Success) - require.False(t, res.SimulateTransactionResults[1].Success) + require.Len(t, res, 1) + require.False(t, res[0].Success) + require.Len(t, res[0].SimulateTransactionResults, 2) + require.True(t, res[0].SimulateTransactionResults[0].Success) + require.False(t, res[0].SimulateTransactionResults[1].Success) require.Equal(t, big.NewInt(0), builder.env.state.GetBalance(testUserAddress)) bundle.RevertingHashes = []common.Hash{tx2.Hash()} - res, err = builder.AddBundle(bundle) + res, err = builder.AddBundles([]*suavextypes.Bundle{bundle}) require.NoError(t, err) - require.True(t, res.Success) - require.Len(t, res.SimulateTransactionResults, 2) - require.True(t, res.SimulateTransactionResults[0].Success) - require.False(t, res.SimulateTransactionResults[1].Success) + require.Len(t, res, 1) + require.True(t, res[0].Success) + require.Len(t, res[0].SimulateTransactionResults, 2) + require.True(t, res[0].SimulateTransactionResults[0].Success) + require.False(t, res[0].SimulateTransactionResults[1].Success) require.Equal(t, big.NewInt(1000), builder.env.state.GetBalance(testUserAddress)) } -func TestBuilder_AddBundle_InvalidParams(t *testing.T) { +func TestBuilder_AddBundles_InvalidParams(t *testing.T) { t.Parallel() config, backend := newMockBuilderConfig(t) // set builder target block number to 10 @@ -144,11 +154,12 @@ func TestBuilder_AddBundle_InvalidParams(t *testing.T) { BlockNumber: big.NewInt(20), } - res, err := builder.AddBundle(bundle) + res, err := builder.AddBundles([]*suavextypes.Bundle{bundle}) require.NoError(t, err) - require.False(t, res.Success) - require.Equal(t, ErrInvalidBlockNumber.Error(), res.Error) - require.Len(t, res.SimulateTransactionResults, 0) + require.Len(t, res, 1) + require.False(t, res[0].Success) + require.Equal(t, ErrInvalidBlockNumber.Error(), res[0].Error) + require.Len(t, res[0].SimulateTransactionResults, 0) require.Equal(t, big.NewInt(0), builder.env.state.GetBalance(testUserAddress)) bundle = &suavextypes.Bundle{ @@ -157,55 +168,26 @@ func TestBuilder_AddBundle_InvalidParams(t *testing.T) { MaxBlock: big.NewInt(6), } - res, err = builder.AddBundle(bundle) + res, err = builder.AddBundles([]*suavextypes.Bundle{bundle}) require.NoError(t, err) - require.False(t, res.Success) - require.Equal(t, ErrExceedsMaxBlock.Error(), res.Error) - require.Len(t, res.SimulateTransactionResults, 0) + require.Len(t, res, 1) + require.False(t, res[0].Success) + require.Equal(t, ErrExceedsMaxBlock.Error(), res[0].Error) + require.Len(t, res[0].SimulateTransactionResults, 0) require.Equal(t, big.NewInt(0), builder.env.state.GetBalance(testUserAddress)) bundle = &suavextypes.Bundle{ Txs: []*types.Transaction{}, } - res, err = builder.AddBundle(bundle) + res, err = builder.AddBundles([]*suavextypes.Bundle{bundle}) require.NoError(t, err) - require.False(t, res.Success) - require.Equal(t, ErrEmptyTxs.Error(), res.Error) - require.Len(t, res.SimulateTransactionResults, 0) + require.False(t, res[0].Success) + require.Equal(t, ErrEmptyTxs.Error(), res[0].Error) + require.Len(t, res[0].SimulateTransactionResults, 0) require.Equal(t, big.NewInt(0), builder.env.state.GetBalance(testUserAddress)) } -func TestBuilder_AddBundles_Simple(t *testing.T) { - t.Parallel() - config, backend := newMockBuilderConfig(t) - builder, err := NewBuilder(config, &BuilderArgs{ - Slot: 10, - }) - require.NoError(t, err) - - tx1 := backend.newRandomTx(false) - tx2 := backend.newRandomTxWithNonce(1) - - bundle1 := &suavextypes.Bundle{ - Txs: []*types.Transaction{tx1, tx2}, - } - - tx3 := backend.newRandomTxWithNonce(2) - tx4 := backend.newRandomTxWithNonce(3) - - bundle2 := &suavextypes.Bundle{ - Txs: []*types.Transaction{tx3, tx4}, - } - - res, err := builder.AddBundles([]*suavextypes.Bundle{bundle1, bundle2}) - require.NoError(t, err) - require.Len(t, res, 2) - require.True(t, res[0].Success) - require.True(t, res[1].Success) - require.Equal(t, big.NewInt(4000), builder.env.state.GetBalance(testUserAddress)) -} - func TestBuilder_FillTransactions(t *testing.T) { t.Parallel() config, backend := newMockBuilderConfig(t) diff --git a/suave/builder/api/api.go b/suave/builder/api/api.go index ba77ae270092..34da1e2e8a1b 100644 --- a/suave/builder/api/api.go +++ b/suave/builder/api/api.go @@ -93,7 +93,6 @@ type API interface { NewSession(ctx context.Context, args *BuildBlockArgs) (string, error) AddTransaction(ctx context.Context, sessionId string, tx *types.Transaction) (*SimulateTransactionResult, error) AddTransactions(ctx context.Context, sessionId string, txs types.Transactions) ([]*SimulateTransactionResult, error) - AddBundle(ctx context.Context, sessionId string, bundle *Bundle) (*SimulateBundleResult, error) AddBundles(ctx context.Context, sessionId string, bundles []*Bundle) ([]*SimulateBundleResult, error) BuildBlock(ctx context.Context, sessionId string) error Bid(ctx context.Context, sessioId string, blsPubKey phase0.BLSPubKey) (*SubmitBlockRequest, error) diff --git a/suave/builder/api/api_client.go b/suave/builder/api/api_client.go index da99414bed91..49e49ad8d826 100644 --- a/suave/builder/api/api_client.go +++ b/suave/builder/api/api_client.go @@ -48,12 +48,6 @@ func (a *APIClient) AddTransactions(ctx context.Context, sessionId string, txs t return receipt, err } -func (a *APIClient) AddBundle(ctx context.Context, sessionId string, bundle *Bundle) (*SimulateBundleResult, error) { - var receipt *SimulateBundleResult - err := a.rpc.CallContext(ctx, &receipt, "suavex_addBundle", sessionId, bundle) - return receipt, err -} - func (a *APIClient) AddBundles(ctx context.Context, sessionId string, bundles []*Bundle) ([]*SimulateBundleResult, error) { var receipt []*SimulateBundleResult err := a.rpc.CallContext(ctx, &receipt, "suavex_addBundles", sessionId, bundles) diff --git a/suave/builder/api/api_server.go b/suave/builder/api/api_server.go index ad4aa0a18468..9a2204f46d41 100644 --- a/suave/builder/api/api_server.go +++ b/suave/builder/api/api_server.go @@ -14,7 +14,6 @@ type SessionManager interface { NewSession(context.Context, *BuildBlockArgs) (string, error) AddTransaction(sessionId string, tx *types.Transaction) (*SimulateTransactionResult, error) AddTransactions(sessionId string, txs types.Transactions) ([]*SimulateTransactionResult, error) - AddBundle(sessionId string, bundle *Bundle) (*SimulateBundleResult, error) AddBundles(sessionId string, bundles []*Bundle) ([]*SimulateBundleResult, error) BuildBlock(sessionId string) error Bid(sessionId string, blsPubKey phase0.BLSPubKey) (*SubmitBlockRequest, error) @@ -43,10 +42,6 @@ func (s *Server) AddTransactions(ctx context.Context, sessionId string, txs type return s.sessionMngr.AddTransactions(sessionId, txs) } -func (s *Server) AddBundle(ctx context.Context, sessionId string, bundle *Bundle) (*SimulateBundleResult, error) { - return s.sessionMngr.AddBundle(sessionId, bundle) -} - func (s *Server) AddBundles(ctx context.Context, sessionId string, bundles []*Bundle) ([]*SimulateBundleResult, error) { return s.sessionMngr.AddBundles(sessionId, bundles) } diff --git a/suave/builder/api/api_test.go b/suave/builder/api/api_test.go index a3041247b927..4c4d263e8e0f 100644 --- a/suave/builder/api/api_test.go +++ b/suave/builder/api/api_test.go @@ -27,6 +27,14 @@ func TestAPI(t *testing.T) { txn := types.NewTransaction(0, common.Address{}, big.NewInt(1), 1, big.NewInt(1), []byte{}) _, err = c.AddTransaction(context.Background(), "1", txn) require.NoError(t, err) + _, err = c.AddTransactions(context.Background(), "1", []*types.Transaction{txn}) + require.NoError(t, err) + + bundle := &Bundle{ + Txs: []*types.Transaction{txn}, + } + _, err = c.AddBundles(context.Background(), "1", []*Bundle{bundle}) + require.NoError(t, err) } type nullSessionManager struct{} @@ -43,10 +51,6 @@ func (nullSessionManager) AddTransactions(sessionId string, txs types.Transactio return nil, nil } -func (nullSessionManager) AddBundle(sessionId string, bundle *Bundle) (*SimulateBundleResult, error) { - return nil, nil -} - func (nullSessionManager) AddBundles(sessionId string, bundles []*Bundle) ([]*SimulateBundleResult, error) { return nil, nil } diff --git a/suave/builder/session_manager.go b/suave/builder/session_manager.go index cf27ae254f25..b0495e00ff5c 100644 --- a/suave/builder/session_manager.go +++ b/suave/builder/session_manager.go @@ -158,14 +158,6 @@ func (s *SessionManager) AddTransactions(sessionId string, txs types.Transaction return builder.AddTransactions(txs) } -func (s *SessionManager) AddBundle(sessionId string, bundle *api.Bundle) (*api.SimulateBundleResult, error) { - builder, err := s.getSession(sessionId) - if err != nil { - return nil, err - } - return builder.AddBundle(bundle) -} - func (s *SessionManager) AddBundles(sessionId string, bundles []*api.Bundle) ([]*api.SimulateBundleResult, error) { builder, err := s.getSession(sessionId) if err != nil {