133 lines
3.7 KiB
Go
133 lines
3.7 KiB
Go
// DONTCOVER
|
|
package v036
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v034"
|
|
)
|
|
|
|
const (
|
|
ModuleName = "gov"
|
|
RouterKey = ModuleName
|
|
|
|
ProposalTypeText string = "Text"
|
|
|
|
MaxDescriptionLength int = 5000
|
|
MaxTitleLength int = 140
|
|
)
|
|
|
|
var (
|
|
_ Content = TextProposal{}
|
|
)
|
|
|
|
type (
|
|
Proposals []Proposal
|
|
ProposalQueue []uint64
|
|
|
|
TextProposal struct {
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
}
|
|
|
|
Content interface {
|
|
GetTitle() string
|
|
GetDescription() string
|
|
ProposalRoute() string
|
|
ProposalType() string
|
|
ValidateBasic() error
|
|
String() string
|
|
}
|
|
|
|
Proposal struct {
|
|
Content `json:"content"`
|
|
|
|
ProposalID uint64 `json:"id"`
|
|
Status v034gov.ProposalStatus `json:"proposal_status"`
|
|
FinalTallyResult v034gov.TallyResult `json:"final_tally_result"`
|
|
|
|
SubmitTime time.Time `json:"submit_time"`
|
|
DepositEndTime time.Time `json:"deposit_end_time"`
|
|
TotalDeposit sdk.Coins `json:"total_deposit"`
|
|
|
|
VotingStartTime time.Time `json:"voting_start_time"`
|
|
VotingEndTime time.Time `json:"voting_end_time"`
|
|
}
|
|
|
|
GenesisState struct {
|
|
StartingProposalID uint64 `json:"starting_proposal_id"`
|
|
Deposits v034gov.Deposits `json:"deposits"`
|
|
Votes v034gov.Votes `json:"votes"`
|
|
Proposals []Proposal `json:"proposals"`
|
|
DepositParams v034gov.DepositParams `json:"deposit_params"`
|
|
VotingParams v034gov.VotingParams `json:"voting_params"`
|
|
TallyParams v034gov.TallyParams `json:"tally_params"`
|
|
}
|
|
)
|
|
|
|
func NewGenesisState(
|
|
startingProposalID uint64, deposits v034gov.Deposits, votes v034gov.Votes, proposals []Proposal,
|
|
depositParams v034gov.DepositParams, votingParams v034gov.VotingParams, tallyParams v034gov.TallyParams,
|
|
) GenesisState {
|
|
|
|
return GenesisState{
|
|
StartingProposalID: startingProposalID,
|
|
Deposits: deposits,
|
|
Votes: votes,
|
|
Proposals: proposals,
|
|
DepositParams: depositParams,
|
|
VotingParams: votingParams,
|
|
TallyParams: tallyParams,
|
|
}
|
|
}
|
|
|
|
func NewTextProposal(title, description string) Content {
|
|
return TextProposal{title, description}
|
|
}
|
|
|
|
func (tp TextProposal) GetTitle() string { return tp.Title }
|
|
func (tp TextProposal) GetDescription() string { return tp.Description }
|
|
func (tp TextProposal) ProposalRoute() string { return RouterKey }
|
|
func (tp TextProposal) ProposalType() string { return ProposalTypeText }
|
|
func (tp TextProposal) ValidateBasic() error { return ValidateAbstract(tp) }
|
|
|
|
func (tp TextProposal) String() string {
|
|
return fmt.Sprintf(`Text Proposal:
|
|
Title: %s
|
|
Description: %s
|
|
`, tp.Title, tp.Description)
|
|
}
|
|
|
|
func ErrInvalidProposalContent(msg string) error {
|
|
return fmt.Errorf("invalid proposal content: %s", msg)
|
|
}
|
|
|
|
func ValidateAbstract(c Content) error {
|
|
title := c.GetTitle()
|
|
if len(strings.TrimSpace(title)) == 0 {
|
|
return ErrInvalidProposalContent("proposal title cannot be blank")
|
|
}
|
|
if len(title) > MaxTitleLength {
|
|
return ErrInvalidProposalContent(fmt.Sprintf("proposal title is longer than max length of %d", MaxTitleLength))
|
|
}
|
|
|
|
description := c.GetDescription()
|
|
if len(description) == 0 {
|
|
return ErrInvalidProposalContent("proposal description cannot be blank")
|
|
}
|
|
if len(description) > MaxDescriptionLength {
|
|
return ErrInvalidProposalContent(fmt.Sprintf("proposal description is longer than max length of %d", MaxDescriptionLength))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {
|
|
cdc.RegisterInterface((*Content)(nil), nil)
|
|
cdc.RegisterConcrete(TextProposal{}, "cosmos-sdk/TextProposal", nil)
|
|
}
|