diff --git a/mempool/mempool.go b/mempool/mempool.go index d401f37f..e7cbb28d 100644 --- a/mempool/mempool.go +++ b/mempool/mempool.go @@ -8,6 +8,7 @@ import ( comettypes "github.com/cometbft/cometbft/types" dbm "github.com/cosmos/cosmos-db" + "github.com/polymerdao/monomer" "github.com/polymerdao/monomer/utils" ) @@ -38,6 +39,13 @@ func (p *Pool) Enqueue(userTxn comettypes.Tx) (err error) { // Unfortunately, comet's DB interface doesn't support it. // Moving to a different DB interface is left for future work. + // Attempt to adapt the Cosmos transaction to an Ethereum deposit transaction. + // If the adaptation succeeds, it indicates that the + // user transaction is a deposit transaction, which is not allowed in the pool. + if _, err := monomer.GetDepositTxs(userTxn); err == nil { + return errors.New("deposit txs are not allowed in the pool") + } + batch := p.db.NewBatch() defer func() { err = utils.WrapCloseErr(err, batch) diff --git a/mempool/mempool_test.go b/mempool/mempool_test.go index e3bc57be..deadac62 100644 --- a/mempool/mempool_test.go +++ b/mempool/mempool_test.go @@ -4,6 +4,8 @@ import ( "testing" comettypes "github.com/cometbft/cometbft/types" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/polymerdao/monomer" "github.com/polymerdao/monomer/mempool" "github.com/polymerdao/monomer/testutils" "github.com/stretchr/testify/assert" @@ -22,6 +24,18 @@ func TestMempool(t *testing.T) { require.Error(t, err) }) + t.Run("deposit transaction", func(t *testing.T) { + l1AttributesTx, depositTx, _ := testutils.GenerateEthTxs(t) + l1AttributesTxBytes, err := l1AttributesTx.MarshalBinary() + require.NoError(t, err) + depositTxBytes, err := depositTx.MarshalBinary() + require.NoError(t, err) + + cosmosTxs, err := monomer.AdaptPayloadTxsToCosmosTxs([]hexutil.Bytes{l1AttributesTxBytes, depositTxBytes}) + require.NoError(t, err) + require.ErrorContains(t, pool.Enqueue(cosmosTxs[0]), "deposit txs are not allowed in the pool") + }) + // enqueue multiple to empty for i := byte(0); i < 3; i++ { require.NoError(t, pool.Enqueue(comettypes.Tx([]byte{i}))) diff --git a/x/rollup/tx/helpers/ante.go b/x/rollup/tx/helpers/ante.go index ca8b9ce6..eb1a20ab 100644 --- a/x/rollup/tx/helpers/ante.go +++ b/x/rollup/tx/helpers/ante.go @@ -1,7 +1,6 @@ package helpers import ( - "errors" "fmt" sdktypes "github.com/cosmos/cosmos-sdk/types" @@ -36,28 +35,22 @@ func (a *AnteHandler) AnteHandle( tx sdktypes.Tx, simulate bool, ) (sdktypes.Context, error) { - if _, ok := tx.(*rolluptypes.DepositsTx); ok { + switch tx.(type) { + case *rolluptypes.DepositsTx: newCtx, err := rolluptx.DepositAnteHandler(ctx, tx, simulate) if err != nil { return newCtx, fmt.Errorf("deposit ante handle: %v", err) } - return newCtx, nil - } - - for _, msg := range tx.GetMsgs() { - if _, ok := msg.(rolluptypes.DepositMsg); ok { - return ctx, errors.New("transaction contains deposit message") + return newCtx, err + default: // Unfortunately, the Cosmos SDK does not export its default tx type. + newCtx, err := a.authAnteHandler(ctx, tx, simulate) + if err != nil { + return newCtx, fmt.Errorf("auth ante handle: %v", err) } + newCtx, err = rolluptx.L1DataAnteHandler(newCtx, tx, a.rollupKeeper) + if err != nil { + return newCtx, fmt.Errorf("l1 data ante handle: %v", err) + } + return newCtx, nil } - - // need the tx decoder - newCtx, err := a.authAnteHandler(ctx, tx, simulate) - if err != nil { - return newCtx, fmt.Errorf("auth ante handle: %v", err) - } - newCtx, err = rolluptx.L1DataAnteHandler(newCtx, tx, a.rollupKeeper) - if err != nil { - return newCtx, fmt.Errorf("l1 data ante handle: %v", err) - } - return newCtx, nil }