diff --git a/CHANGELOG.md b/CHANGELOG.md index 43a569a40..d841f3b44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ #### Gov Module - ([\#461](https://github.com/forbole/bdjuno/pull/461)) Parse `x/gov` genesis with `genesisDoc.InitialHeight` instead of the hard-coded height 1 +- ([\#465](https://github.com/forbole/bdjuno/pull/465)) Get open proposal ids in deposit or voting period by block time instead of current time #### Daily refetch - ([\#454](https://github.com/forbole/bdjuno/pull/454)) Added `daily refetch` module to refetch missing blocks every day diff --git a/database/gov.go b/database/gov.go index 26de439f2..3577e27c7 100644 --- a/database/gov.go +++ b/database/gov.go @@ -3,6 +3,7 @@ package database import ( "encoding/json" "fmt" + "time" codectypes "github.com/cosmos/cosmos-sdk/codec/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" @@ -204,8 +205,8 @@ func (db *Db) GetProposal(id uint64) (*types.Proposal, error) { return &proposal, nil } -// GetOpenProposalsIds returns all the ids of the proposals that are currently in deposit or voting period -func (db *Db) GetOpenProposalsIds() ([]uint64, error) { +// GetOpenProposalsIds returns all the ids of the proposals that are in deposit or voting period at the given block time +func (db *Db) GetOpenProposalsIds(blockTime time.Time) ([]uint64, error) { var ids []uint64 stmt := `SELECT id FROM proposal WHERE status = $1 OR status = $2` err := db.Sqlx.Select(&ids, stmt, govtypes.StatusDepositPeriod.String(), govtypes.StatusVotingPeriod.String()) @@ -215,8 +216,8 @@ func (db *Db) GetOpenProposalsIds() ([]uint64, error) { // Get also the invalid status proposals due to gRPC failure but still are in deposit period or voting period var idsInvalid []uint64 - stmt = `SELECT id FROM proposal WHERE status = $1 AND (voting_end_time > NOW() OR deposit_end_time > NOW())` - err = db.Sqlx.Select(&idsInvalid, stmt, types.ProposalStatusInvalid) + stmt = `SELECT id FROM proposal WHERE status = $1 AND (voting_end_time > $2 OR deposit_end_time > $2)` + err = db.Sqlx.Select(&idsInvalid, stmt, types.ProposalStatusInvalid, blockTime) ids = append(ids, idsInvalid...) return ids, err diff --git a/database/gov_test.go b/database/gov_test.go index 51a56c09c..6bf8f5912 100644 --- a/database/gov_test.go +++ b/database/gov_test.go @@ -215,6 +215,20 @@ func (suite *DbTestSuite) TestBigDipperDb_GetOpenProposalsIds() { content1 := govtypes.NewTextProposal("title", "description") content2 := govtypes.NewTextProposal("title1", "description1") + + invalidProposal := types.NewProposal( + 6, + "proposalRoute1", + "proposalType1", + content2, + types.ProposalStatusInvalid, + time.Date(2020, 1, 2, 00, 00, 00, 000, time.UTC), + time.Date(2020, 1, 2, 01, 00, 00, 000, time.UTC), + time.Date(2020, 1, 2, 02, 00, 00, 000, time.UTC), + time.Date(2020, 1, 2, 03, 00, 00, 000, time.UTC), + proposer2.String(), + ) + input := []types.Proposal{ types.NewProposal( 1, @@ -264,14 +278,16 @@ func (suite *DbTestSuite) TestBigDipperDb_GetOpenProposalsIds() { time.Date(2020, 1, 2, 03, 00, 00, 000, time.UTC), proposer2.String(), ), + invalidProposal, } err := suite.database.SaveProposals(input) suite.Require().NoError(err) - ids, err := suite.database.GetOpenProposalsIds() + timeBeforeDepositEnd := invalidProposal.DepositEndTime.Add(-1 * time.Hour) + ids, err := suite.database.GetOpenProposalsIds(timeBeforeDepositEnd) suite.Require().NoError(err) - suite.Require().Equal([]uint64{1, 2}, ids) + suite.Require().Equal([]uint64{1, 2, 6}, ids) } func (suite *DbTestSuite) TestBigDipperDb_UpdateProposal() { diff --git a/modules/gov/handle_block.go b/modules/gov/handle_block.go index d584b48a1..76138e4e9 100644 --- a/modules/gov/handle_block.go +++ b/modules/gov/handle_block.go @@ -2,6 +2,7 @@ package gov import ( "fmt" + "time" juno "github.com/forbole/juno/v3/types" @@ -14,7 +15,7 @@ import ( func (m *Module) HandleBlock( b *tmctypes.ResultBlock, _ *tmctypes.ResultBlockResults, _ []*juno.Tx, vals *tmctypes.ResultValidators, ) error { - err := m.updateProposals(b.Block.Height, vals) + err := m.updateProposals(b.Block.Height, b.Block.Time, vals) if err != nil { log.Error().Str("module", "gov").Int64("height", b.Block.Height). Err(err).Msg("error while updating proposals") @@ -23,8 +24,8 @@ func (m *Module) HandleBlock( } // updateProposals updates the proposals -func (m *Module) updateProposals(height int64, blockVals *tmctypes.ResultValidators) error { - ids, err := m.db.GetOpenProposalsIds() +func (m *Module) updateProposals(height int64, blockTime time.Time, blockVals *tmctypes.ResultValidators) error { + ids, err := m.db.GetOpenProposalsIds(blockTime) if err != nil { log.Error().Err(err).Str("module", "gov").Msg("error while getting open ids") }