diff --git a/database/gov.go b/database/gov.go index 660db8398..ee87aaa60 100644 --- a/database/gov.go +++ b/database/gov.go @@ -7,6 +7,7 @@ import ( "time" "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/lib/pq" @@ -130,9 +131,7 @@ INSERT INTO proposal( // GetProposal returns the proposal with the given id, or nil if not found func (db *Db) GetProposal(id uint64) (types.Proposal, error) { - var proposal types.Proposal var rows []*dbtypes.ProposalRow - err := db.SQL.Select(&rows, `SELECT * FROM proposal WHERE id = $1`, id) if err != nil { return types.Proposal{}, err @@ -143,14 +142,60 @@ func (db *Db) GetProposal(id uint64) (types.Proposal, error) { } row := rows[0] - proposal.ID = row.ProposalID - proposal.Status = row.Status - proposal.VotingStartTime = dbtypes.NullTimeToTime(row.VotingStartTime) - proposal.VotingEndTime = dbtypes.NullTimeToTime(row.VotingEndTime) + trimContent := strings.TrimPrefix(row.Content, "{") + trimContent = strings.TrimPrefix(trimContent, "}") + jsonMessages := strings.Split(trimContent, ",") + + var messages []*codectypes.Any + for _, jsonMessage := range jsonMessages { + var msg codectypes.Any + err = db.Cdc.UnmarshalJSON([]byte(jsonMessage), &msg) + if err != nil { + return types.Proposal{}, err + } + messages = append(messages, &msg) + } + + proposal := types.NewProposal( + row.ProposalID, + row.Title, + row.Description, + row.Metadata, + messages, + row.Status, + row.SubmitTime, + row.DepositEndTime, + dbtypes.NullTimeToTime(row.VotingStartTime), + dbtypes.NullTimeToTime(row.VotingEndTime), + row.Proposer, + ) return proposal, nil } +// GetProposalForUpdate returns a proposal with data required by NewProposalUpdate type +func (db *Db) GetProposalForUpdate(id uint64) (types.ProposalUpdate, error) { + var proposalForUpdate types.ProposalUpdate + var rows []*dbtypes.ProposalRow + + err := db.SQL.Select(&rows, `SELECT status, voting_start_time, voting_end_time FROM proposal WHERE id = $1`, id) + if err != nil { + return types.ProposalUpdate{}, err + } + + if len(rows) == 0 { + return types.ProposalUpdate{}, nil + } + + row := rows[0] + proposalForUpdate.ProposalID = id + proposalForUpdate.Status = row.Status + proposalForUpdate.VotingStartTime = dbtypes.NullTimeToTime(row.VotingStartTime) + proposalForUpdate.VotingEndTime = dbtypes.NullTimeToTime(row.VotingEndTime) + + return proposalForUpdate, nil +} + // 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 diff --git a/modules/gov/utils_proposal.go b/modules/gov/utils_proposal.go index 5649ee621..3784ee08c 100644 --- a/modules/gov/utils_proposal.go +++ b/modules/gov/utils_proposal.go @@ -82,17 +82,17 @@ func (m *Module) UpdateProposalStakingPoolSnapshot(height int64, blockVals *tmct // updateDeletedProposalStatus updates the proposal having the given id by setting its status // to the one that represents a deleted proposal func (m *Module) updateDeletedProposalStatus(id uint64) error { - stored, err := m.db.GetProposal(id) + proposalForUpdate, err := m.db.GetProposalForUpdate(id) if err != nil { return err } return m.db.UpdateProposal( types.NewProposalUpdate( - stored.ID, + proposalForUpdate.ProposalID, types.ProposalStatusInvalid, - stored.VotingStartTime, - stored.VotingEndTime, + proposalForUpdate.VotingStartTime, + proposalForUpdate.VotingEndTime, ), ) }