diff --git a/baseapp/abci.go b/baseapp/abci.go index fd20bba4e1..ca13c03a13 100644 --- a/baseapp/abci.go +++ b/baseapp/abci.go @@ -453,14 +453,14 @@ func (app *BaseApp) PrepareProposal(req *abci.RequestPrepareProposal) (resp *abc "panic", err, ) - resp = &abci.ResponsePrepareProposal{} + resp = &abci.ResponsePrepareProposal{Txs: req.Txs} } }() resp, err = app.prepareProposal(app.prepareProposalState.ctx, req) if err != nil { app.logger.Error("failed to prepare proposal", "height", req.Height, "time", req.Time, "err", err) - return &abci.ResponsePrepareProposal{}, nil + return &abci.ResponsePrepareProposal{Txs: req.Txs}, nil } return resp, nil diff --git a/baseapp/abci_test.go b/baseapp/abci_test.go index 55ae30be3e..b12d1ac747 100644 --- a/baseapp/abci_test.go +++ b/baseapp/abci_test.go @@ -2296,6 +2296,43 @@ func TestBaseApp_VoteExtensions(t *testing.T) { require.Equal(t, avgPrice, committedAvgPrice) } +func TestABCI_PrepareProposal_Panic(t *testing.T) { + prepareOpt := func(bapp *baseapp.BaseApp) { + bapp.SetPrepareProposal(func(ctx sdk.Context, req *abci.RequestPrepareProposal) (*abci.ResponsePrepareProposal, error) { + if len(req.Txs) == 3 { + panic("i don't like number 3, panic") + } + // return empty if no panic + return &abci.ResponsePrepareProposal{}, nil + }) + } + + suite := NewBaseAppSuite(t, prepareOpt) + + _, err := suite.baseApp.InitChain(&abci.RequestInitChain{ + InitialHeight: 1, + ConsensusParams: &cmtproto.ConsensusParams{}, + }) + require.NoError(t, err) + + txs := [][]byte{{1}, {2}} + reqPrepareProposal := abci.RequestPrepareProposal{ + MaxTxBytes: 1000, + Height: 1, // this value can't be 0 + Txs: txs, + } + resPrepareProposal, err := suite.baseApp.PrepareProposal(&reqPrepareProposal) + require.NoError(t, err) + require.Equal(t, 0, len(resPrepareProposal.Txs)) + + // make it panic, and check if it returns 3 txs (because of panic recovery) + txs = [][]byte{{1}, {2}, {3}} + reqPrepareProposal.Txs = txs + resPrepareProposal, err = suite.baseApp.PrepareProposal(&reqPrepareProposal) + require.NoError(t, err) + require.Equal(t, 3, len(resPrepareProposal.Txs)) +} + func TestOptimisticExecution(t *testing.T) { suite := NewBaseAppSuite(t, baseapp.SetOptimisticExecution())