diff --git a/app/app.go b/app/app.go index 6e8c777f5..e7ba4a830 100644 --- a/app/app.go +++ b/app/app.go @@ -29,6 +29,7 @@ import ( dbm "github.com/tendermint/tendermint/libs/db" "github.com/tendermint/tendermint/libs/log" tmtypes "github.com/tendermint/tendermint/types" + govtypes "github.com/irisnet/irishub/types/gov" ) const ( @@ -96,6 +97,7 @@ func MakeCodec() *codec.Codec { distr.RegisterCodec(cdc) slashing.RegisterCodec(cdc) gov.RegisterCodec(cdc) + govtypes.RegisterCodec(cdc) record.RegisterCodec(cdc) upgrade.RegisterCodec(cdc) service.RegisterCodec(cdc) diff --git a/app/v0/protocol_v0.go b/app/v0/protocol_v0.go index 9c542a56d..a26a5a52f 100644 --- a/app/v0/protocol_v0.go +++ b/app/v0/protocol_v0.go @@ -11,7 +11,7 @@ import ( "github.com/irisnet/irishub/modules/bank" distr "github.com/irisnet/irishub/modules/distribution" "github.com/irisnet/irishub/modules/gov" - "github.com/irisnet/irishub/modules/gov/params" + "github.com/irisnet/irishub/types/gov/params" "github.com/irisnet/irishub/modules/guardian" "github.com/irisnet/irishub/modules/mint" "github.com/irisnet/irishub/modules/params" @@ -26,6 +26,7 @@ import ( abci "github.com/tendermint/tendermint/abci/types" "sort" "time" + govtypes "github.com/irisnet/irishub/types/gov" ) var _ protocol.Protocol = (*ProtocolVersion0)(nil) @@ -156,7 +157,7 @@ func (p *ProtocolVersion0) configKeepers(protocolkeeper protocolKeeper.Keeper) { p.guardianKeeper, &stakeKeeper, protocolkeeper, - gov.DefaultCodespace, + govtypes.DefaultCodespace, ) p.recordKeeper = record.NewKeeper( diff --git a/client/gov/cli/query.go b/client/gov/cli/query.go index 748a68298..627543b2c 100644 --- a/client/gov/cli/query.go +++ b/client/gov/cli/query.go @@ -9,11 +9,12 @@ import ( client "github.com/irisnet/irishub/client/gov" "github.com/irisnet/irishub/codec" "github.com/irisnet/irishub/modules/gov" - "github.com/irisnet/irishub/modules/gov/params" + "github.com/irisnet/irishub/types/gov/params" "github.com/irisnet/irishub/modules/params" sdk "github.com/irisnet/irishub/types" "github.com/spf13/cobra" "github.com/spf13/viper" + govtypes "github.com/irisnet/irishub/types/gov" ) // GetCmdQueryProposal implements the query proposal command. @@ -84,7 +85,7 @@ func GetCmdQueryProposals(queryRoute string, cdc *codec.Codec) *cobra.Command { } if len(strProposalStatus) != 0 { - proposalStatus, err := gov.ProposalStatusFromString(client.NormalizeProposalStatus(strProposalStatus)) + proposalStatus, err := govtypes.ProposalStatusFromString(client.NormalizeProposalStatus(strProposalStatus)) if err != nil { return err } @@ -426,7 +427,7 @@ func printModuleList(res []sdk.KVPair) (err error) { } func printParamStr(p params.GovParameter, keyStr string) { - var param gov.Param + var param govtypes.Param param.Key = keyStr param.Value = p.ToJson("") param.Op = "" @@ -444,7 +445,7 @@ func GetCmdPullGovConfig(storeName string, cdc *codec.Codec) *cobra.Command { ctx := context.NewCLIContext().WithCodec(cdc) res, err := ctx.QuerySubspace([]byte("Gov/"), storeName) if err == nil && len(res) != 0 { - var pd gov.ParameterConfigFile + var pd govtypes.ParameterConfigFile pathStr := viper.GetString(flagPath) err := pd.WriteFile(cdc, res, pathStr) return err diff --git a/client/gov/cli/sendtx.go b/client/gov/cli/sendtx.go index 392b95fa2..711959ae5 100644 --- a/client/gov/cli/sendtx.go +++ b/client/gov/cli/sendtx.go @@ -15,6 +15,7 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/spf13/viper" + govtypes "github.com/irisnet/irishub/types/gov" ) // GetCmdSubmitProposal implements submitting a proposal transaction command. @@ -47,13 +48,13 @@ func GetCmdSubmitProposal(cdc *codec.Codec) *cobra.Command { return err } - proposalType, err := gov.ProposalTypeFromString(strProposalType) + proposalType, err := govtypes.ProposalTypeFromString(strProposalType) if err != nil { return err } //////////////////// iris begin /////////////////////////// - var param gov.Param - if proposalType == gov.ProposalTypeParameterChange { + var param govtypes.Param + if proposalType == govtypes.ProposalTypeParameterChange { pathStr := viper.GetString(flagPath) keyStr := viper.GetString(flagKey) opStr := viper.GetString(flagOp) @@ -65,9 +66,9 @@ func GetCmdSubmitProposal(cdc *codec.Codec) *cobra.Command { //////////////////// iris end ///////////////////////////// msg := gov.NewMsgSubmitProposal(title, description, proposalType, fromAddr, amount, param) - if proposalType == gov.ProposalTypeTxTaxUsage { + if proposalType == govtypes.ProposalTypeTxTaxUsage { usageStr := viper.GetString(flagUsage) - usage, err := gov.UsageTypeFromString(usageStr) + usage, err := govtypes.UsageTypeFromString(usageStr) if err != nil { return err } @@ -88,7 +89,7 @@ func GetCmdSubmitProposal(cdc *codec.Codec) *cobra.Command { return utils.SendOrPrintTx(txCtx, cliCtx, []sdk.Msg{taxMsg}) } - if proposalType == gov.ProposalTypeSoftwareUpgrade { + if proposalType == govtypes.ProposalTypeSoftwareUpgrade { version := uint64(viper.GetInt64(flagVersion)) software := viper.GetString(flagSoftware) switchHeight := uint64(viper.GetInt64(flagSwitchHeight)) @@ -125,15 +126,15 @@ func GetCmdSubmitProposal(cdc *codec.Codec) *cobra.Command { } //////////////////// iris begin /////////////////////////// -func getParamFromString(paramStr string, pathStr string, keyStr string, opStr string, cdc *codec.Codec) (gov.Param, error) { - var param gov.Param +func getParamFromString(paramStr string, pathStr string, keyStr string, opStr string, cdc *codec.Codec) (govtypes.Param, error) { + var param govtypes.Param if paramStr != "" { err := json.Unmarshal([]byte(paramStr), ¶m) return param, err } else if pathStr != "" { - paramDoc := gov.ParameterConfigFile{} + paramDoc := govtypes.ParameterConfigFile{} err := paramDoc.ReadFile(cdc, pathStr) if err != nil { return param, err @@ -216,7 +217,7 @@ func GetCmdVote(cdc *codec.Codec) *cobra.Command { proposalID := uint64(viper.GetInt64(flagProposalID)) option := viper.GetString(flagOption) - byteVoteOption, err := gov.VoteOptionFromString(client.NormalizeVoteOption(option)) + byteVoteOption, err := govtypes.VoteOptionFromString(client.NormalizeVoteOption(option)) if err != nil { return err } diff --git a/client/gov/lcd/query.go b/client/gov/lcd/query.go index af098020e..4000bc0bc 100644 --- a/client/gov/lcd/query.go +++ b/client/gov/lcd/query.go @@ -12,6 +12,7 @@ import ( "github.com/irisnet/irishub/modules/gov" sdk "github.com/irisnet/irishub/types" "github.com/pkg/errors" + govtypes "github.com/irisnet/irishub/types/gov" ) func queryProposalHandlerFn(cdc *codec.Codec, cliCtx context.CLIContext) http.HandlerFunc { @@ -126,7 +127,7 @@ func queryDepositHandlerFn(cdc *codec.Codec, cliCtx context.CLIContext) http.Han return } - var deposit gov.Deposit + var deposit govtypes.Deposit cdc.UnmarshalJSON(res, &deposit) if deposit.Empty() { res, err := cliCtx.QueryWithData("custom/gov/proposal", cdc.MustMarshalBinaryLengthPrefixed(gov.QueryProposalParams{params.ProposalID})) @@ -189,7 +190,7 @@ func queryVoteHandlerFn(cdc *codec.Codec, cliCtx context.CLIContext) http.Handle return } - var vote gov.Vote + var vote govtypes.Vote cdc.UnmarshalJSON(res, &vote) if vote.Empty() { bz, err := cdc.MarshalJSON(gov.QueryProposalParams{params.ProposalID}) @@ -280,7 +281,7 @@ func queryProposalsWithParameterFn(cdc *codec.Codec, cliCtx context.CLIContext) } if len(strProposalStatus) != 0 { - proposalStatus, err := gov.ProposalStatusFromString(client.NormalizeProposalStatus(strProposalStatus)) + proposalStatus, err := govtypes.ProposalStatusFromString(client.NormalizeProposalStatus(strProposalStatus)) if err != nil { utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return @@ -359,7 +360,7 @@ func queryParamsHandlerFn(cdc *codec.Codec, cliCtx context.CLIContext) http.Hand utils.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } - var pd gov.ParameterConfigFile + var pd govtypes.ParameterConfigFile for _, kv := range res { switch string(kv.Key) { case "Gov/govDepositProcedure": diff --git a/client/gov/lcd/sendtx.go b/client/gov/lcd/sendtx.go index 3d6bca6f5..2004bbbfd 100644 --- a/client/gov/lcd/sendtx.go +++ b/client/gov/lcd/sendtx.go @@ -11,6 +11,7 @@ import ( "github.com/irisnet/irishub/codec" "github.com/irisnet/irishub/modules/gov" sdk "github.com/irisnet/irishub/types" + govtypes "github.com/irisnet/irishub/types/gov" ) type postProposalReq struct { @@ -20,8 +21,8 @@ type postProposalReq struct { ProposalType string `json:"proposal_type"` // Type of proposal. Initial set {PlainTextProposal, SoftwareUpgradeProposal} Proposer sdk.AccAddress `json:"proposer"` // Address of the proposer InitialDeposit string `json:"initial_deposit"` // Coins to add to the proposal's deposit - Param gov.Param `json:"param"` - Usage gov.UsageType `json:"usage"` + Param govtypes.Param `json:"param"` + Usage govtypes.UsageType `json:"usage"` DestAddress sdk.AccAddress `json:"dest_address"` Percent sdk.Dec `json:"percent"` } @@ -54,7 +55,7 @@ func postProposalHandlerFn(cdc *codec.Codec, cliCtx context.CLIContext) http.Han return } - proposalType, err := gov.ProposalTypeFromString(client.NormalizeProposalType(req.ProposalType)) + proposalType, err := govtypes.ProposalTypeFromString(client.NormalizeProposalType(req.ProposalType)) if err != nil { utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return @@ -68,7 +69,7 @@ func postProposalHandlerFn(cdc *codec.Codec, cliCtx context.CLIContext) http.Han // create the message msg := gov.NewMsgSubmitProposal(req.Title, req.Description, proposalType, req.Proposer, initDepositAmount, req.Param) - if msg.ProposalType == gov.ProposalTypeTxTaxUsage { + if msg.ProposalType == govtypes.ProposalTypeTxTaxUsage { taxMsg := gov.NewMsgSubmitTaxUsageProposal(msg, req.Usage, req.DestAddress, req.Percent) err = msg.ValidateBasic() if err != nil { @@ -162,7 +163,7 @@ func voteHandlerFn(cdc *codec.Codec, cliCtx context.CLIContext) http.HandlerFunc return } - voteOption, err := gov.VoteOptionFromString(client.NormalizeVoteOption(req.Option)) + voteOption, err := govtypes.VoteOptionFromString(client.NormalizeVoteOption(req.Option)) if err != nil { utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return diff --git a/docs/cli-client/upgrade/query-signals.md b/docs/cli-client/upgrade/query-signals.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/zh/cli-client/upgrade/query-signals.md b/docs/zh/cli-client/upgrade/query-signals.md new file mode 100644 index 000000000..e69de29bb diff --git a/modules/gov/codec.go b/modules/gov/codec.go index 1bf29b31e..ab984e462 100644 --- a/modules/gov/codec.go +++ b/modules/gov/codec.go @@ -2,7 +2,6 @@ package gov import ( "github.com/irisnet/irishub/codec" - "github.com/irisnet/irishub/modules/gov/params" ) // Register concrete types on codec codec @@ -13,19 +12,6 @@ func RegisterCodec(cdc *codec.Codec) { cdc.RegisterConcrete(MsgSubmitSoftwareUpgradeProposal{}, "gov/MsgSubmitSoftwareUpgradeProposal", nil) cdc.RegisterConcrete(MsgDeposit{}, "cosmos-sdk/MsgDeposit", nil) cdc.RegisterConcrete(MsgVote{}, "cosmos-sdk/MsgVote", nil) - - cdc.RegisterInterface((*Proposal)(nil), nil) - cdc.RegisterConcrete(&TextProposal{}, "gov/TextProposal", nil) - - //////////////////// iris begin /////////////////////////// - cdc.RegisterConcrete(&govparams.DepositProcedure{}, "cosmos-sdk/DepositProcedure", nil) - cdc.RegisterConcrete(&govparams.TallyingProcedure{}, "cosmos-sdk/TallyingProcedure", nil) - cdc.RegisterConcrete(&govparams.VotingProcedure{}, "cosmos-sdk/VotingProcedure", nil) - cdc.RegisterConcrete(&ParameterProposal{}, "gov/ParameterProposal", nil) - cdc.RegisterConcrete(&SoftwareUpgradeProposal{}, "gov/SoftwareUpgradeProposal", nil) - cdc.RegisterConcrete(&HaltProposal{}, "gov/TerminatorProposal", nil) - cdc.RegisterConcrete(&TaxUsageProposal{}, "gov/TaxUsageProposal", nil) - //////////////////// iris end /////////////////////////// } var msgCdc = codec.New() diff --git a/modules/gov/execute.go b/modules/gov/execute.go new file mode 100644 index 000000000..da5ffbe10 --- /dev/null +++ b/modules/gov/execute.go @@ -0,0 +1,89 @@ +package gov + +import ( + "fmt" + "github.com/irisnet/irishub/modules/params" + "github.com/irisnet/irishub/types/common" + sdk "github.com/irisnet/irishub/types" + govtypes "github.com/irisnet/irishub/types/gov" + protocolKeeper "github.com/irisnet/irishub/app/protocol/keeper" +) + + +func Execute(ctx sdk.Context, k Keeper, p govtypes.Proposal) (err error){ + switch p.GetProposalType(){ + case govtypes.ProposalTypeParameterChange: + return ParameterProposalExecute(ctx, k, p.(*govtypes.ParameterProposal)) + case govtypes.ProposalTypeSoftwareHalt: + return HaltProposalExecute(ctx, k) + case govtypes.ProposalTypeTxTaxUsage: + return TaxUsageProposalExecute(ctx,k, p.(*govtypes.TaxUsageProposal)) + case govtypes.ProposalTypeSoftwareUpgrade: + return SoftwareUpgradeProposalExecute(ctx, k, p.(*govtypes.SoftwareUpgradeProposal)) + } + return nil +} + +func TaxUsageProposalExecute(ctx sdk.Context, k Keeper, p *govtypes.TaxUsageProposal) (err error) { + burn := false + if p.Usage == govtypes.UsageTypeBurn { + burn = true + } + k.dk.AllocateFeeTax(ctx, p.DestAddress, p.Percent, burn) + return +} + +func ParameterProposalExecute(ctx sdk.Context, k Keeper, pp *govtypes.ParameterProposal) (err error) { + + logger := ctx.Logger().With("module", "x/gov") + logger.Info("Execute ParameterProposal begin", "info", fmt.Sprintf("current height:%d", ctx.BlockHeight())) + if pp.Param.Op == govtypes.Update { + params.ParamMapping[pp.Param.Key].Update(ctx, pp.Param.Value) + } else if pp.Param.Op == govtypes.Insert { + //Todo: insert + } + return +} + +func SoftwareUpgradeProposalExecute(ctx sdk.Context, k Keeper, sp *govtypes.SoftwareUpgradeProposal) error { + + logger := ctx.Logger().With("module", "x/gov") + + if _, ok := k.pk.GetUpgradeConfig(ctx); ok { + logger.Info("Execute SoftwareProposal Failure", "info", + fmt.Sprintf("Software Upgrade Switch Period is in process. current height:%d", ctx.BlockHeight())) + return nil + } + if !k.pk.IsValidProtocolVersion(ctx, sp.Version) { + logger.Info("Execute SoftwareProposal Failure", "info", + fmt.Sprintf("version [%v] in SoftwareUpgradeProposal isn't valid ", sp.ProposalID)) + return nil + } + if uint64(ctx.BlockHeight())+1 >= sp.SwitchHeight { + logger.Info("Execute SoftwareProposal Failure", "info", + fmt.Sprintf("switch height must be more than blockHeight + 1")) + return nil + } + + k.pk.SetUpgradeConfig(ctx, + protocolKeeper.UpgradeConfig{sp.ProposalID, + common.ProtocolDefinition{sp.Version, sp.Software, sp.SwitchHeight}}) + + logger.Info("Execute SoftwareProposal Success", "info", + fmt.Sprintf("current height:%d", ctx.BlockHeight())) + + return nil +} + +func HaltProposalExecute(ctx sdk.Context, k Keeper) error { + logger := ctx.Logger().With("module", "x/gov") + + if k.GetTerminatorHeight(ctx) == -1 { + k.SetTerminatorHeight(ctx, ctx.BlockHeight()+k.GetTerminatorPeriod(ctx)) + logger.Info("Execute TerminatorProposal begin", "info", fmt.Sprintf("Terminator height:%d", k.GetTerminatorHeight(ctx))) + } else { + logger.Info("Terminator Period is in process.", "info", fmt.Sprintf("Terminator height:%d", k.GetTerminatorHeight(ctx))) + + } + return nil +} \ No newline at end of file diff --git a/modules/gov/genesis.go b/modules/gov/genesis.go index fbf80f32b..cf5f50b2c 100644 --- a/modules/gov/genesis.go +++ b/modules/gov/genesis.go @@ -3,10 +3,11 @@ package gov import ( "fmt" sdk "github.com/irisnet/irishub/types" - "github.com/irisnet/irishub/modules/gov/params" + "github.com/irisnet/irishub/types/gov/params" "github.com/irisnet/irishub/types" "time" "github.com/irisnet/irishub/modules/params" + govtypes "github.com/irisnet/irishub/types/gov" ) // GenesisState - all gov state that must be provided at genesis @@ -15,7 +16,7 @@ type GenesisState struct { StartingProposalID uint64 `json:"starting_proposalID"` Deposits []DepositWithMetadata `json:"deposits"` Votes []VoteWithMetadata `json:"votes"` - Proposals []Proposal `json:"proposals"` + Proposals []govtypes.Proposal `json:"proposals"` DepositProcedure govparams.DepositProcedure `json:"deposit_period"` VotingProcedure govparams.VotingProcedure `json:"voting_period"` TallyingProcedure govparams.TallyingProcedure `json:"tallying_procedure"` @@ -23,13 +24,13 @@ type GenesisState struct { type DepositWithMetadata struct { ProposalID uint64 `json:"proposal_id"` - Deposit Deposit `json:"deposit"` + Deposit govtypes.Deposit `json:"deposit"` } // VoteWithMetadata (just for genesis) type VoteWithMetadata struct { ProposalID uint64 `json:"proposal_id"` - Vote Vote `json:"vote"` + Vote govtypes.Vote `json:"vote"` } func NewGenesisState(startingProposalID uint64, dp govparams.DepositProcedure, vp govparams.VotingProcedure, tp govparams.TallyingProcedure) GenesisState { @@ -81,18 +82,18 @@ func ExportGenesis(ctx sdk.Context, k Keeper) GenesisState { var deposits []DepositWithMetadata var votes []VoteWithMetadata - proposals := k.GetProposalsFiltered(ctx, nil, nil, StatusNil, 0) + proposals := k.GetProposalsFiltered(ctx, nil, nil, govtypes.StatusNil, 0) for _, proposal := range proposals { proposalID := proposal.GetProposalID() depositsIterator := k.GetDeposits(ctx, proposalID) for ; depositsIterator.Valid(); depositsIterator.Next() { - var deposit Deposit + var deposit govtypes.Deposit k.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), &deposit) deposits = append(deposits, DepositWithMetadata{proposalID, deposit}) } votesIterator := k.GetVotes(ctx, proposalID) for ; votesIterator.Valid(); votesIterator.Next() { - var vote Vote + var vote govtypes.Vote k.cdc.MustUnmarshalBinaryLengthPrefixed(votesIterator.Value(), &vote) votes = append(votes, VoteWithMetadata{proposalID, vote}) } diff --git a/modules/gov/handler.go b/modules/gov/handler.go index 25af27068..40b5df6af 100644 --- a/modules/gov/handler.go +++ b/modules/gov/handler.go @@ -7,8 +7,9 @@ import ( "github.com/irisnet/irishub/modules/gov/tags" "strconv" "encoding/json" - "github.com/irisnet/irishub/modules/gov/params" + "github.com/irisnet/irishub/types/gov/params" tmstate "github.com/tendermint/tendermint/state" + govtypes "github.com/irisnet/irishub/types/gov" ) // Handle all "gov" type messages. @@ -34,10 +35,10 @@ func NewHandler(keeper Keeper) sdk.Handler { func handleMsgSubmitProposal(ctx sdk.Context, keeper Keeper, msg MsgSubmitProposal) sdk.Result { //////////////////// iris begin /////////////////////////// - if msg.ProposalType == ProposalTypeSoftwareHalt { + if msg.ProposalType == govtypes.ProposalTypeSoftwareHalt { _, found := keeper.gk.GetProfiler(ctx, msg.Proposer) if !found { - return ErrNotProfiler(keeper.codespace, msg.Proposer).Result() + return govtypes.ErrNotProfiler(keeper.codespace, msg.Proposer).Result() } } proposal := keeper.NewProposal(ctx, msg.Title, msg.Description, msg.ProposalType, msg.Param) @@ -52,8 +53,8 @@ func handleMsgSubmitProposal(ctx sdk.Context, keeper Keeper, msg MsgSubmitPropos proposalIDBytes := []byte(strconv.FormatUint(proposal.GetProposalID(), 10)) var paramBytes []byte - if msg.ProposalType == ProposalTypeParameterChange { - paramBytes, _ = json.Marshal(proposal.(*ParameterProposal).Param) + if msg.ProposalType == govtypes.ProposalTypeParameterChange { + paramBytes, _ = json.Marshal(proposal.(*govtypes.ParameterProposal).Param) } //////////////////// iris end ///////////////////////////// resTags := sdk.NewTags( @@ -76,10 +77,10 @@ func handleMsgSubmitProposal(ctx sdk.Context, keeper Keeper, msg MsgSubmitPropos } func handleMsgSubmitTxTaxUsageProposal(ctx sdk.Context, keeper Keeper, msg MsgSubmitTxTaxUsageProposal) sdk.Result { - if msg.Usage != UsageTypeBurn { + if msg.Usage != govtypes.UsageTypeBurn { _, found := keeper.gk.GetTrustee(ctx, msg.DestAddress) if !found { - return ErrNotTrustee(keeper.codespace, msg.DestAddress).Result() + return govtypes.ErrNotTrustee(keeper.codespace, msg.DestAddress).Result() } } @@ -99,7 +100,7 @@ func handleMsgSubmitTxTaxUsageProposal(ctx sdk.Context, keeper Keeper, msg MsgSu tags.Percent, []byte(msg.Percent.String()), ) - if msg.Usage != UsageTypeBurn { + if msg.Usage != govtypes.UsageTypeBurn { resTags = resTags.AppendTag(tags.DestAddress, []byte(msg.DestAddress.String())) } @@ -116,20 +117,20 @@ func handleMsgSubmitTxTaxUsageProposal(ctx sdk.Context, keeper Keeper, msg MsgSu func handleMsgSubmitSoftwareUpgradeProposal(ctx sdk.Context, keeper Keeper, msg MsgSubmitSoftwareUpgradeProposal) sdk.Result { if !keeper.pk.IsValidProtocolVersion(ctx, msg.Version) { - return ErrCodeInvalidVersion(keeper.codespace, msg.Version).Result() + return govtypes.ErrCodeInvalidVersion(keeper.codespace, msg.Version).Result() } if uint64(ctx.BlockHeight()) > msg.SwitchHeight { - return ErrCodeInvalidSwitchHeight(keeper.codespace,uint64(ctx.BlockHeight()),msg.SwitchHeight).Result() + return govtypes.ErrCodeInvalidSwitchHeight(keeper.codespace,uint64(ctx.BlockHeight()),msg.SwitchHeight).Result() } _, found := keeper.gk.GetProfiler(ctx, msg.Proposer) if !found { - return ErrNotProfiler(keeper.codespace, msg.Proposer).Result() + return govtypes.ErrNotProfiler(keeper.codespace, msg.Proposer).Result() } if _ , ok := keeper.pk.GetUpgradeConfig(ctx) ; ok { - return ErrSwitchPeriodInProcess(keeper.codespace).Result() + return govtypes.ErrSwitchPeriodInProcess(keeper.codespace).Result() } proposal := keeper.NewSoftwareUpgradeProposal(ctx, msg) @@ -248,12 +249,12 @@ func EndBlocker(ctx sdk.Context, keeper Keeper) (resTags sdk.Tags) { var action []byte if passes { keeper.RefundDeposits(ctx, activeProposal.GetProposalID()) - activeProposal.SetStatus(StatusPassed) + activeProposal.SetStatus(govtypes.StatusPassed) action = tags.ActionProposalPassed - activeProposal.Execute(ctx, keeper) + Execute(ctx, keeper,activeProposal) } else { keeper.DeleteDeposits(ctx, activeProposal.GetProposalID()) - activeProposal.SetStatus(StatusRejected) + activeProposal.SetStatus(govtypes.StatusRejected) action = tags.ActionProposalRejected } activeProposal.SetTallyResult(tallyResults) diff --git a/modules/gov/keeper.go b/modules/gov/keeper.go index 83858a7e3..7955649f1 100644 --- a/modules/gov/keeper.go +++ b/modules/gov/keeper.go @@ -4,13 +4,14 @@ import ( "github.com/irisnet/irishub/codec" sdk "github.com/irisnet/irishub/types" "github.com/irisnet/irishub/modules/bank" - "github.com/irisnet/irishub/modules/gov/params" + "github.com/irisnet/irishub/types/gov/params" "github.com/tendermint/tendermint/crypto" "time" "github.com/irisnet/irishub/modules/params" "github.com/irisnet/irishub/modules/distribution" "github.com/irisnet/irishub/modules/guardian" protocolKeeper "github.com/irisnet/irishub/app/protocol/keeper" + govtypes "github.com/irisnet/irishub/types/gov" ) // nolint @@ -67,13 +68,13 @@ func NewKeeper(cdc *codec.Codec, key sdk.StoreKey, dk distribution.Keeper, ck ba // Proposals //////////////////// iris begin /////////////////////////// -func (keeper Keeper) NewProposal(ctx sdk.Context, title string, description string, proposalType ProposalKind, param Param) Proposal { +func (keeper Keeper) NewProposal(ctx sdk.Context, title string, description string, proposalType govtypes.ProposalKind, param govtypes.Param) govtypes.Proposal { switch proposalType { - case ProposalTypeText: + case govtypes.ProposalTypeText: return keeper.NewTextProposal(ctx, title, description, proposalType) - case ProposalTypeParameterChange: + case govtypes.ProposalTypeParameterChange: return keeper.NewParametersProposal(ctx, title, description, proposalType, param) - case ProposalTypeSoftwareHalt: + case govtypes.ProposalTypeSoftwareHalt: return keeper.NewHaltProposal(ctx, title, description, proposalType) } return nil @@ -85,18 +86,18 @@ func (keeper Keeper) NewProposal(ctx sdk.Context, title string, description stri // Proposals // Creates a NewProposal -func (keeper Keeper) NewTextProposal(ctx sdk.Context, title string, description string, proposalType ProposalKind) Proposal { +func (keeper Keeper) NewTextProposal(ctx sdk.Context, title string, description string, proposalType govtypes.ProposalKind) govtypes.Proposal { proposalID, err := keeper.getNewProposalID(ctx) if err != nil { return nil } - var proposal Proposal = &TextProposal{ + var proposal govtypes.Proposal = &govtypes.TextProposal{ ProposalID: proposalID, Title: title, Description: description, ProposalType: proposalType, - Status: StatusDepositPeriod, - TallyResult: EmptyTallyResult(), + Status: govtypes.StatusDepositPeriod, + TallyResult: govtypes.EmptyTallyResult(), TotalDeposit: sdk.Coins{}, SubmitTime: ctx.BlockHeader().Time, } @@ -108,25 +109,25 @@ func (keeper Keeper) NewTextProposal(ctx sdk.Context, title string, description } //////////////////// iris begin /////////////////////////// -func (keeper Keeper) NewParametersProposal(ctx sdk.Context, title string, description string, proposalType ProposalKind, param Param) Proposal { +func (keeper Keeper) NewParametersProposal(ctx sdk.Context, title string, description string, proposalType govtypes.ProposalKind, param govtypes.Param) govtypes.Proposal { proposalID, err := keeper.getNewProposalID(ctx) if err != nil { return nil } - var textProposal = TextProposal{ + var textProposal = govtypes.TextProposal{ ProposalID: proposalID, Title: title, Description: description, ProposalType: proposalType, - Status: StatusDepositPeriod, - TallyResult: EmptyTallyResult(), + Status: govtypes.StatusDepositPeriod, + TallyResult: govtypes.EmptyTallyResult(), TotalDeposit: sdk.Coins{}, SubmitTime: ctx.BlockHeader().Time, } param.Value = params.ParamMapping[param.Key].ToJson(param.Value) - var proposal Proposal = &ParameterProposal{ + var proposal govtypes.Proposal = &govtypes.ParameterProposal{ textProposal, param, } @@ -138,22 +139,22 @@ func (keeper Keeper) NewParametersProposal(ctx sdk.Context, title string, descri return proposal } -func (keeper Keeper) NewHaltProposal(ctx sdk.Context, title string, description string, proposalType ProposalKind) Proposal { +func (keeper Keeper) NewHaltProposal(ctx sdk.Context, title string, description string, proposalType govtypes.ProposalKind) govtypes.Proposal { proposalID, err := keeper.getNewProposalID(ctx) if err != nil { return nil } - var textProposal = TextProposal{ + var textProposal = govtypes.TextProposal{ ProposalID: proposalID, Title: title, Description: description, ProposalType: proposalType, - Status: StatusDepositPeriod, - TallyResult: EmptyTallyResult(), + Status: govtypes.StatusDepositPeriod, + TallyResult: govtypes.EmptyTallyResult(), TotalDeposit: sdk.Coins{}, SubmitTime: ctx.BlockHeader().Time, } - var proposal Proposal = &HaltProposal{ + var proposal govtypes.Proposal = &govtypes.HaltProposal{ textProposal, } @@ -164,22 +165,22 @@ func (keeper Keeper) NewHaltProposal(ctx sdk.Context, title string, description return proposal } -func (keeper Keeper) NewUsageProposal(ctx sdk.Context, msg MsgSubmitTxTaxUsageProposal) Proposal { +func (keeper Keeper) NewUsageProposal(ctx sdk.Context, msg MsgSubmitTxTaxUsageProposal) govtypes.Proposal { proposalID, err := keeper.getNewProposalID(ctx) if err != nil { return nil } - var textProposal = TextProposal{ + var textProposal = govtypes.TextProposal{ ProposalID: proposalID, Title: msg.Title, Description: msg.Description, ProposalType: msg.ProposalType, - Status: StatusDepositPeriod, - TallyResult: EmptyTallyResult(), + Status: govtypes.StatusDepositPeriod, + TallyResult: govtypes.EmptyTallyResult(), TotalDeposit: sdk.Coins{}, SubmitTime: ctx.BlockHeader().Time, } - var proposal Proposal = &TaxUsageProposal{ + var proposal govtypes.Proposal = &govtypes.TaxUsageProposal{ textProposal, msg.Usage, msg.DestAddress, @@ -189,22 +190,22 @@ func (keeper Keeper) NewUsageProposal(ctx sdk.Context, msg MsgSubmitTxTaxUsagePr return proposal } -func (keeper Keeper) NewSoftwareUpgradeProposal(ctx sdk.Context, msg MsgSubmitSoftwareUpgradeProposal) Proposal { +func (keeper Keeper) NewSoftwareUpgradeProposal(ctx sdk.Context, msg MsgSubmitSoftwareUpgradeProposal) govtypes.Proposal { proposalID, err := keeper.getNewProposalID(ctx) if err != nil { return nil } - var textProposal = TextProposal{ + var textProposal = govtypes.TextProposal{ ProposalID: proposalID, Title: msg.Title, Description: msg.Description, ProposalType: msg.ProposalType, - Status: StatusDepositPeriod, - TallyResult: EmptyTallyResult(), + Status: govtypes.StatusDepositPeriod, + TallyResult: govtypes.EmptyTallyResult(), TotalDeposit: sdk.Coins{}, SubmitTime: ctx.BlockHeader().Time, } - var proposal Proposal = &SoftwareUpgradeProposal{ + var proposal govtypes.Proposal = &govtypes.SoftwareUpgradeProposal{ textProposal, msg.Version, msg.Software, @@ -214,7 +215,7 @@ func (keeper Keeper) NewSoftwareUpgradeProposal(ctx sdk.Context, msg MsgSubmitSo return proposal } -func (keeper Keeper) saveProposal(ctx sdk.Context, proposal Proposal) { +func (keeper Keeper) saveProposal(ctx sdk.Context, proposal govtypes.Proposal) { depositPeriod := govparams.GetDepositProcedure(ctx).MaxDepositPeriod proposal.SetDepositEndTime(proposal.GetSubmitTime().Add(depositPeriod)) keeper.SetProposal(ctx, proposal) @@ -224,21 +225,21 @@ func (keeper Keeper) saveProposal(ctx sdk.Context, proposal Proposal) { //////////////////// iris end ///////////////////////////// // Get Proposal from store by ProposalID -func (keeper Keeper) GetProposal(ctx sdk.Context, proposalID uint64) Proposal { +func (keeper Keeper) GetProposal(ctx sdk.Context, proposalID uint64) govtypes.Proposal { store := ctx.KVStore(keeper.storeKey) bz := store.Get(KeyProposal(proposalID)) if bz == nil { return nil } - var proposal Proposal + var proposal govtypes.Proposal keeper.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &proposal) return proposal } // Implements sdk.AccountKeeper. -func (keeper Keeper) SetProposal(ctx sdk.Context, proposal Proposal) { +func (keeper Keeper) SetProposal(ctx sdk.Context, proposal govtypes.Proposal) { store := ctx.KVStore(keeper.storeKey) bz := keeper.cdc.MustMarshalBinaryLengthPrefixed(proposal) store.Set(KeyProposal(proposal.GetProposalID()), bz) @@ -254,14 +255,14 @@ func (keeper Keeper) DeleteProposal(ctx sdk.Context, proposalID uint64) { } // Get Proposal from store by ProposalID -func (keeper Keeper) GetProposalsFiltered(ctx sdk.Context, voterAddr sdk.AccAddress, depositorAddr sdk.AccAddress, status ProposalStatus, numLatest uint64) []Proposal { +func (keeper Keeper) GetProposalsFiltered(ctx sdk.Context, voterAddr sdk.AccAddress, depositorAddr sdk.AccAddress, status govtypes.ProposalStatus, numLatest uint64) []govtypes.Proposal { maxProposalID, err := keeper.peekCurrentProposalID(ctx) if err != nil { return nil } - matchingProposals := []Proposal{} + matchingProposals := []govtypes.Proposal{} if numLatest == 0 || maxProposalID < numLatest { numLatest = maxProposalID @@ -287,7 +288,7 @@ func (keeper Keeper) GetProposalsFiltered(ctx sdk.Context, voterAddr sdk.AccAddr continue } - if validProposalStatus(status) { + if govtypes.ValidProposalStatus(status) { if proposal.GetStatus() != status { continue } @@ -302,7 +303,7 @@ func (keeper Keeper) setInitialProposalID(ctx sdk.Context, proposalID uint64) sd store := ctx.KVStore(keeper.storeKey) bz := store.Get(KeyNextProposalID) if bz != nil { - return ErrInvalidGenesis(keeper.codespace, "Initial ProposalID already set") + return govtypes.ErrInvalidGenesis(keeper.codespace, "Initial ProposalID already set") } bz = keeper.cdc.MustMarshalBinaryLengthPrefixed(proposalID) store.Set(KeyNextProposalID, bz) @@ -324,7 +325,7 @@ func (keeper Keeper) getNewProposalID(ctx sdk.Context) (proposalID uint64, err s store := ctx.KVStore(keeper.storeKey) bz := store.Get(KeyNextProposalID) if bz == nil { - return 0, ErrInvalidGenesis(keeper.codespace, "InitialProposalID never set") + return 0, govtypes.ErrInvalidGenesis(keeper.codespace, "InitialProposalID never set") } keeper.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &proposalID) bz = keeper.cdc.MustMarshalBinaryLengthPrefixed(proposalID + 1) @@ -337,17 +338,17 @@ func (keeper Keeper) peekCurrentProposalID(ctx sdk.Context) (proposalID uint64, store := ctx.KVStore(keeper.storeKey) bz := store.Get(KeyNextProposalID) if bz == nil { - return 0, ErrInvalidGenesis(keeper.codespace, "InitialProposalID never set") + return 0, govtypes.ErrInvalidGenesis(keeper.codespace, "InitialProposalID never set") } keeper.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &proposalID) return proposalID, nil } -func (keeper Keeper) activateVotingPeriod(ctx sdk.Context, proposal Proposal) { +func (keeper Keeper) activateVotingPeriod(ctx sdk.Context, proposal govtypes.Proposal) { proposal.SetVotingStartTime(ctx.BlockHeader().Time) votingPeriod := govparams.GetVotingProcedure(ctx).VotingPeriod proposal.SetVotingEndTime(proposal.GetVotingStartTime().Add(votingPeriod)) - proposal.SetStatus(StatusVotingPeriod) + proposal.SetStatus(govtypes.StatusVotingPeriod) keeper.SetProposal(ctx, proposal) keeper.RemoveFromInactiveProposalQueue(ctx, proposal.GetDepositEndTime(), proposal.GetProposalID()) @@ -358,20 +359,20 @@ func (keeper Keeper) activateVotingPeriod(ctx sdk.Context, proposal Proposal) { // Votes // Adds a vote on a specific proposal -func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, option VoteOption) sdk.Error { +func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, option govtypes.VoteOption) sdk.Error { proposal := keeper.GetProposal(ctx, proposalID) if proposal == nil { - return ErrUnknownProposal(keeper.codespace, proposalID) + return govtypes.ErrUnknownProposal(keeper.codespace, proposalID) } - if proposal.GetStatus() != StatusVotingPeriod { - return ErrInactiveProposal(keeper.codespace, proposalID) + if proposal.GetStatus() != govtypes.StatusVotingPeriod { + return govtypes.ErrInactiveProposal(keeper.codespace, proposalID) } - if !validVoteOption(option) { - return ErrInvalidVote(keeper.codespace, option) + if !govtypes.ValidVoteOption(option) { + return govtypes.ErrInvalidVote(keeper.codespace, option) } - vote := Vote{ + vote := govtypes.Vote{ ProposalID: proposalID, Voter: voterAddr, Option: option, @@ -382,18 +383,18 @@ func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.A } // Gets the vote of a specific voter on a specific proposal -func (keeper Keeper) GetVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress) (Vote, bool) { +func (keeper Keeper) GetVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress) (govtypes.Vote, bool) { store := ctx.KVStore(keeper.storeKey) bz := store.Get(KeyVote(proposalID, voterAddr)) if bz == nil { - return Vote{}, false + return govtypes.Vote{}, false } - var vote Vote + var vote govtypes.Vote keeper.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &vote) return vote, true } -func (keeper Keeper) setVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, vote Vote) { +func (keeper Keeper) setVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, vote govtypes.Vote) { store := ctx.KVStore(keeper.storeKey) bz := keeper.cdc.MustMarshalBinaryLengthPrefixed(vote) store.Set(KeyVote(proposalID, voterAddr), bz) @@ -414,18 +415,18 @@ func (keeper Keeper) deleteVote(ctx sdk.Context, proposalID uint64, voterAddr sd // Deposits // Gets the deposit of a specific depositor on a specific proposal -func (keeper Keeper) GetDeposit(ctx sdk.Context, proposalID uint64, depositorAddr sdk.AccAddress) (Deposit, bool) { +func (keeper Keeper) GetDeposit(ctx sdk.Context, proposalID uint64, depositorAddr sdk.AccAddress) (govtypes.Deposit, bool) { store := ctx.KVStore(keeper.storeKey) bz := store.Get(KeyDeposit(proposalID, depositorAddr)) if bz == nil { - return Deposit{}, false + return govtypes.Deposit{}, false } - var deposit Deposit + var deposit govtypes.Deposit keeper.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &deposit) return deposit, true } -func (keeper Keeper) setDeposit(ctx sdk.Context, proposalID uint64, depositorAddr sdk.AccAddress, deposit Deposit) { +func (keeper Keeper) setDeposit(ctx sdk.Context, proposalID uint64, depositorAddr sdk.AccAddress, deposit govtypes.Deposit) { store := ctx.KVStore(keeper.storeKey) bz := keeper.cdc.MustMarshalBinaryLengthPrefixed(deposit) store.Set(KeyDeposit(proposalID, depositorAddr), bz) @@ -437,12 +438,12 @@ func (keeper Keeper) AddDeposit(ctx sdk.Context, proposalID uint64, depositorAdd // Checks to see if proposal exists proposal := keeper.GetProposal(ctx, proposalID) if proposal == nil { - return ErrUnknownProposal(keeper.codespace, proposalID), false + return govtypes.ErrUnknownProposal(keeper.codespace, proposalID), false } // Check if proposal is still depositable - if (proposal.GetStatus() != StatusDepositPeriod) && (proposal.GetStatus() != StatusVotingPeriod) { - return ErrAlreadyFinishedProposal(keeper.codespace, proposalID), false + if (proposal.GetStatus() != govtypes.StatusDepositPeriod) && (proposal.GetStatus() != govtypes.StatusVotingPeriod) { + return govtypes.ErrAlreadyFinishedProposal(keeper.codespace, proposalID), false } // Send coins from depositor's account to DepositedCoinsAccAddr account @@ -458,7 +459,7 @@ func (keeper Keeper) AddDeposit(ctx sdk.Context, proposalID uint64, depositorAdd // Check if deposit tipped proposal into voting period // Active voting period if so activatedVotingPeriod := false - if proposal.GetStatus() == StatusDepositPeriod && proposal.GetTotalDeposit().IsAllGTE(govparams.GetDepositProcedure(ctx).MinDeposit) { + if proposal.GetStatus() == govtypes.StatusDepositPeriod && proposal.GetTotalDeposit().IsAllGTE(govparams.GetDepositProcedure(ctx).MinDeposit) { keeper.activateVotingPeriod(ctx, proposal) activatedVotingPeriod = true } @@ -466,7 +467,7 @@ func (keeper Keeper) AddDeposit(ctx sdk.Context, proposalID uint64, depositorAdd // Add or update deposit object currDeposit, found := keeper.GetDeposit(ctx, proposalID, depositorAddr) if !found { - newDeposit := Deposit{depositorAddr, proposalID, depositAmount} + newDeposit := govtypes.Deposit{depositorAddr, proposalID, depositAmount} keeper.setDeposit(ctx, proposalID, depositorAddr, newDeposit) } else { currDeposit.Amount = currDeposit.Amount.Plus(depositAmount) @@ -488,7 +489,7 @@ func (keeper Keeper) RefundDeposits(ctx sdk.Context, proposalID uint64) { depositsIterator := keeper.GetDeposits(ctx, proposalID) for ; depositsIterator.Valid(); depositsIterator.Next() { - deposit := &Deposit{} + deposit := &govtypes.Deposit{} keeper.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), deposit) _, err := keeper.ck.SendCoins(ctx, DepositedCoinsAccAddr, deposit.Depositor, deposit.Amount) @@ -508,7 +509,7 @@ func (keeper Keeper) DeleteDeposits(ctx sdk.Context, proposalID uint64) { depositsIterator := keeper.GetDeposits(ctx, proposalID) for ; depositsIterator.Valid(); depositsIterator.Next() { - deposit := &Deposit{} + deposit := &govtypes.Deposit{} keeper.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), deposit) _, err := keeper.ck.SendCoins(ctx, DepositedCoinsAccAddr, BurnedDepositCoinsAccAddr, deposit.Amount) @@ -562,3 +563,39 @@ func (keeper Keeper) RemoveFromInactiveProposalQueue(ctx sdk.Context, endTime ti store := ctx.KVStore(keeper.storeKey) store.Delete(KeyInactiveProposalQueueProposal(endTime, proposalID)) } + +func (keeper Keeper) GetTerminatorHeight(ctx sdk.Context) int64 { + store := ctx.KVStore(keeper.storeKey) + bz := store.Get(KeyTerminatorHeight) + if bz == nil { + return -1 + } + var height int64 + keeper.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &height) + + return height +} + +func (keeper Keeper) SetTerminatorHeight(ctx sdk.Context, height int64) { + store := ctx.KVStore(keeper.storeKey) + bz := keeper.cdc.MustMarshalBinaryLengthPrefixed(height) + store.Set(KeyTerminatorHeight, bz) +} + +func (keeper Keeper) GetTerminatorPeriod(ctx sdk.Context) int64 { + store := ctx.KVStore(keeper.storeKey) + bz := store.Get(KeyTerminatorPeriod) + if bz == nil { + return -1 + } + var height int64 + keeper.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &height) + + return height +} + +func (keeper Keeper) SetTerminatorPeriod(ctx sdk.Context, height int64) { + store := ctx.KVStore(keeper.storeKey) + bz := keeper.cdc.MustMarshalBinaryLengthPrefixed(height) + store.Set(KeyTerminatorPeriod, bz) +} \ No newline at end of file diff --git a/modules/gov/keeper_keys.go b/modules/gov/keeper_keys.go index e4332834f..cdc53cc34 100644 --- a/modules/gov/keeper_keys.go +++ b/modules/gov/keeper_keys.go @@ -77,3 +77,9 @@ func KeyInactiveProposalQueueProposal(endTime time.Time, proposalID uint64) []by sdk.Uint64ToBigEndian(proposalID), }, KeyDelimiter) } + +// Key for getting a the next available proposalID from the store +var ( + KeyTerminatorHeight = []byte("TerminatorHeight") + KeyTerminatorPeriod = []byte("TerminatorPeriod") +) \ No newline at end of file diff --git a/modules/gov/msgs.go b/modules/gov/msgs.go index 57887f086..4e900730c 100644 --- a/modules/gov/msgs.go +++ b/modules/gov/msgs.go @@ -5,6 +5,7 @@ import ( sdk "github.com/irisnet/irishub/types" "github.com/irisnet/irishub/modules/params" + govtypes "github.com/irisnet/irishub/types/gov" ) // name to idetify transaction types @@ -17,15 +18,15 @@ var _, _, _, _ sdk.Msg = MsgSubmitProposal{}, MsgSubmitTxTaxUsageProposal{}, Msg type MsgSubmitProposal struct { Title string `json:"title"` // Title of the proposal Description string `json:"description"` // Description of the proposal - ProposalType ProposalKind `json:"proposal_type"` // Type of proposal. Initial set {PlainTextProposal, SoftwareUpgradeProposal} + ProposalType govtypes.ProposalKind `json:"proposal_type"` // Type of proposal. Initial set {PlainTextProposal, SoftwareUpgradeProposal} Proposer sdk.AccAddress `json:"proposer"` // Address of the proposer InitialDeposit sdk.Coins `json:"initial_deposit"` // Initial deposit paid by sender. Must be strictly positive. //////////////////// iris begin /////////////////////////// - Param Param + Param govtypes.Param //////////////////// iris end ///////////////////////////// } -func NewMsgSubmitProposal(title string, description string, proposalType ProposalKind, proposer sdk.AccAddress, initialDeposit sdk.Coins, param Param) MsgSubmitProposal { +func NewMsgSubmitProposal(title string, description string, proposalType govtypes.ProposalKind, proposer sdk.AccAddress, initialDeposit sdk.Coins, param govtypes.Param) MsgSubmitProposal { return MsgSubmitProposal{ Title: title, Description: description, @@ -45,13 +46,13 @@ func (msg MsgSubmitProposal) Type() string { return "submit_proposal" } // Implements Msg. func (msg MsgSubmitProposal) ValidateBasic() sdk.Error { if len(msg.Title) == 0 { - return ErrInvalidTitle(DefaultCodespace, msg.Title) // TODO: Proper Error + return govtypes.ErrInvalidTitle(govtypes.DefaultCodespace, msg.Title) // TODO: Proper Error } if len(msg.Description) == 0 { - return ErrInvalidDescription(DefaultCodespace, msg.Description) // TODO: Proper Error + return govtypes.ErrInvalidDescription(govtypes.DefaultCodespace, msg.Description) // TODO: Proper Error } - if !validProposalType(msg.ProposalType) { - return ErrInvalidProposalType(DefaultCodespace, msg.ProposalType) + if !govtypes.ValidProposalType(msg.ProposalType) { + return govtypes.ErrInvalidProposalType(govtypes.DefaultCodespace, msg.ProposalType) } if len(msg.Proposer) == 0 { return sdk.ErrInvalidAddress(msg.Proposer.String()) @@ -63,16 +64,16 @@ func (msg MsgSubmitProposal) ValidateBasic() sdk.Error { return sdk.ErrInvalidCoins(msg.InitialDeposit.String()) } //////////////////// iris begin /////////////////////////// - if msg.ProposalType == ProposalTypeParameterChange { + if msg.ProposalType == govtypes.ProposalTypeParameterChange { - if msg.Param.Op != Update && msg.Param.Op != Insert { - return ErrInvalidParamOp(DefaultCodespace, msg.Param.Op) + if msg.Param.Op != govtypes.Update && msg.Param.Op != govtypes.Insert { + return govtypes.ErrInvalidParamOp(govtypes.DefaultCodespace, msg.Param.Op) } if p, ok := params.ParamMapping[msg.Param.Key]; ok { return p.Valid(msg.Param.Value) } else { - return ErrInvalidParam(DefaultCodespace) + return govtypes.ErrInvalidParam(govtypes.DefaultCodespace) } } //////////////////// iris end ///////////////////////////// @@ -136,12 +137,12 @@ func (msg MsgSubmitSoftwareUpgradeProposal) GetSignBytes() []byte { type MsgSubmitTxTaxUsageProposal struct { MsgSubmitProposal - Usage UsageType `json:"usage"` + Usage govtypes.UsageType `json:"usage"` DestAddress sdk.AccAddress `json:"dest_address"` Percent sdk.Dec `json:"percent"` } -func NewMsgSubmitTaxUsageProposal(msgSubmitProposal MsgSubmitProposal, usage UsageType, destAddress sdk.AccAddress, percent sdk.Dec) MsgSubmitTxTaxUsageProposal { +func NewMsgSubmitTaxUsageProposal(msgSubmitProposal MsgSubmitProposal, usage govtypes.UsageType, destAddress sdk.AccAddress, percent sdk.Dec) MsgSubmitTxTaxUsageProposal { return MsgSubmitTxTaxUsageProposal{ MsgSubmitProposal: msgSubmitProposal, Usage: usage, @@ -155,14 +156,14 @@ func (msg MsgSubmitTxTaxUsageProposal) ValidateBasic() sdk.Error { if err != nil { return err } - if !validUsageType(msg.Usage) { - return ErrInvalidUsageType(DefaultCodespace, msg.Usage) + if !govtypes.ValidUsageType(msg.Usage) { + return govtypes.ErrInvalidUsageType(govtypes.DefaultCodespace, msg.Usage) } - if msg.Usage != UsageTypeBurn && len(msg.DestAddress) == 0 { + if msg.Usage != govtypes.UsageTypeBurn && len(msg.DestAddress) == 0 { return sdk.ErrInvalidAddress(msg.DestAddress.String()) } if msg.Percent.LTE(sdk.NewDec(0)) || msg.Percent.GT(sdk.NewDec(1)) { - return ErrInvalidPercent(DefaultCodespace, msg.Percent) + return govtypes.ErrInvalidPercent(govtypes.DefaultCodespace, msg.Percent) } return nil } @@ -208,7 +209,7 @@ func (msg MsgDeposit) ValidateBasic() sdk.Error { return sdk.ErrInvalidCoins(msg.Amount.String()) } if msg.ProposalID < 0 { - return ErrUnknownProposal(DefaultCodespace, msg.ProposalID) + return govtypes.ErrUnknownProposal(govtypes.DefaultCodespace, msg.ProposalID) } return nil } @@ -241,10 +242,10 @@ func (msg MsgDeposit) GetSigners() []sdk.AccAddress { type MsgVote struct { ProposalID uint64 `json:"proposal_id"` // ID of the proposal Voter sdk.AccAddress `json:"voter"` // address of the voter - Option VoteOption `json:"option"` // option from OptionSet chosen by the voter + Option govtypes.VoteOption `json:"option"` // option from OptionSet chosen by the voter } -func NewMsgVote(voter sdk.AccAddress, proposalID uint64, option VoteOption) MsgVote { +func NewMsgVote(voter sdk.AccAddress, proposalID uint64, option govtypes.VoteOption) MsgVote { return MsgVote{ ProposalID: proposalID, Voter: voter, @@ -263,10 +264,10 @@ func (msg MsgVote) ValidateBasic() sdk.Error { return sdk.ErrInvalidAddress(msg.Voter.String()) } if msg.ProposalID < 0 { - return ErrUnknownProposal(DefaultCodespace, msg.ProposalID) + return govtypes.ErrUnknownProposal(govtypes.DefaultCodespace, msg.ProposalID) } - if !validVoteOption(msg.Option) { - return ErrInvalidVote(DefaultCodespace, msg.Option) + if !govtypes.ValidVoteOption(msg.Option) { + return govtypes.ErrInvalidVote(govtypes.DefaultCodespace, msg.Option) } return nil } diff --git a/modules/gov/proposal_halt.go b/modules/gov/proposal_halt.go deleted file mode 100644 index 50df177cb..000000000 --- a/modules/gov/proposal_halt.go +++ /dev/null @@ -1,67 +0,0 @@ -package gov - -import ( - "fmt" - sdk "github.com/irisnet/irishub/types" -) - -var _ Proposal = (*HaltProposal)(nil) - -type HaltProposal struct { - TextProposal -} - -func (sp *HaltProposal) Execute(ctx sdk.Context, k Keeper) error { - logger := ctx.Logger().With("module", "x/gov") - - if k.GetTerminatorHeight(ctx) == -1 { - k.SetTerminatorHeight(ctx, ctx.BlockHeight()+k.GetTerminatorPeriod(ctx)) - logger.Info("Execute TerminatorProposal begin", "info", fmt.Sprintf("Terminator height:%d", k.GetTerminatorHeight(ctx))) - } else { - logger.Info("Terminator Period is in process.", "info", fmt.Sprintf("Terminator height:%d", k.GetTerminatorHeight(ctx))) - - } - return nil -} - -// Key for getting a the next available proposalID from the store -var ( - KeyTerminatorHeight = []byte("TerminatorHeight") - KeyTerminatorPeriod = []byte("TerminatorPeriod") -) - -func (keeper Keeper) GetTerminatorHeight(ctx sdk.Context) int64 { - store := ctx.KVStore(keeper.storeKey) - bz := store.Get(KeyTerminatorHeight) - if bz == nil { - return -1 - } - var height int64 - keeper.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &height) - - return height -} - -func (keeper Keeper) SetTerminatorHeight(ctx sdk.Context, height int64) { - store := ctx.KVStore(keeper.storeKey) - bz := keeper.cdc.MustMarshalBinaryLengthPrefixed(height) - store.Set(KeyTerminatorHeight, bz) -} - -func (keeper Keeper) GetTerminatorPeriod(ctx sdk.Context) int64 { - store := ctx.KVStore(keeper.storeKey) - bz := store.Get(KeyTerminatorPeriod) - if bz == nil { - return -1 - } - var height int64 - keeper.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &height) - - return height -} - -func (keeper Keeper) SetTerminatorPeriod(ctx sdk.Context, height int64) { - store := ctx.KVStore(keeper.storeKey) - bz := keeper.cdc.MustMarshalBinaryLengthPrefixed(height) - store.Set(KeyTerminatorPeriod, bz) -} diff --git a/modules/gov/proposal_params.go b/modules/gov/proposal_params.go deleted file mode 100644 index 60d7672f5..000000000 --- a/modules/gov/proposal_params.go +++ /dev/null @@ -1,38 +0,0 @@ -package gov - -import ( - "fmt" - sdk "github.com/irisnet/irishub/types" - "github.com/irisnet/irishub/modules/params" -) - -const ( - Insert string = "insert" - Update string = "update" -) - -type Param struct { - Key string `json:"key"` - Value string `json:"value"` - Op string `json:"op"` -} - -// Implements Proposal Interface -var _ Proposal = (*ParameterProposal)(nil) - -type ParameterProposal struct { - TextProposal - Param Param `json:"params"` -} - -func (pp *ParameterProposal) Execute(ctx sdk.Context, k Keeper) (err error) { - - logger := ctx.Logger().With("module", "x/gov") - logger.Info("Execute ParameterProposal begin", "info", fmt.Sprintf("current height:%d", ctx.BlockHeight())) - if pp.Param.Op == Update { - params.ParamMapping[pp.Param.Key].Update(ctx, pp.Param.Value) - } else if pp.Param.Op == Insert { - //Todo: insert - } - return -} diff --git a/modules/gov/proposal_upgrade.go b/modules/gov/proposal_upgrade.go deleted file mode 100644 index 879a15509..000000000 --- a/modules/gov/proposal_upgrade.go +++ /dev/null @@ -1,47 +0,0 @@ -package gov - -import ( - "fmt" - protocolKeeper "github.com/irisnet/irishub/app/protocol/keeper" - sdk "github.com/irisnet/irishub/types" - "github.com/irisnet/irishub/types/common" -) - -var _ Proposal = (*SoftwareUpgradeProposal)(nil) - -type SoftwareUpgradeProposal struct { - TextProposal - Version uint64 - Software string - SwitchHeight uint64 -} - -func (sp *SoftwareUpgradeProposal) Execute(ctx sdk.Context, k Keeper) error { - - logger := ctx.Logger().With("module", "x/gov") - - if _, ok := k.pk.GetUpgradeConfig(ctx); ok { - logger.Info("Execute SoftwareProposal Failure", "info", - fmt.Sprintf("Software Upgrade Switch Period is in process. current height:%d", ctx.BlockHeight())) - return nil - } - if !k.pk.IsValidProtocolVersion(ctx, sp.Version) { - logger.Info("Execute SoftwareProposal Failure", "info", - fmt.Sprintf("version [%v] in SoftwareUpgradeProposal isn't valid ", sp.ProposalID)) - return nil - } - if uint64(ctx.BlockHeight())+1 >= sp.SwitchHeight { - logger.Info("Execute SoftwareProposal Failure", "info", - fmt.Sprintf("switch height must be more than blockHeight + 1")) - return nil - } - - k.pk.SetUpgradeConfig(ctx, - protocolKeeper.UpgradeConfig{sp.ProposalID, - common.ProtocolDefinition{sp.Version, sp.Software, sp.SwitchHeight}}) - - logger.Info("Execute SoftwareProposal Success", "info", - fmt.Sprintf("current height:%d", ctx.BlockHeight())) - - return nil -} diff --git a/modules/gov/queryable.go b/modules/gov/queryable.go index fca9bb314..aa10bca36 100644 --- a/modules/gov/queryable.go +++ b/modules/gov/queryable.go @@ -5,6 +5,7 @@ import ( sdk "github.com/irisnet/irishub/types" abci "github.com/tendermint/tendermint/abci/types" "time" + govtypes "github.com/irisnet/irishub/types/gov" ) // query endpoints supported by the governance Querier @@ -45,10 +46,10 @@ type ProposalOutput struct { ProposalID uint64 `json:"proposal_id"` // ID of the proposal Title string `json:"title"` // Title of the proposal Description string `json:"description"` // Description of the proposal - ProposalType ProposalKind `json:"proposal_type"` // Type of proposal. Initial set {PlainTextProposal, SoftwareUpgradeProposal} + ProposalType govtypes.ProposalKind `json:"proposal_type"` // Type of proposal. Initial set {PlainTextProposal, SoftwareUpgradeProposal} - Status ProposalStatus `json:"proposal_status"` // Status of the Proposal {Pending, Active, Passed, Rejected} - TallyResult TallyResult `json:"tally_result"` // Result of Tallys + Status govtypes.ProposalStatus `json:"proposal_status"` // Status of the Proposal {Pending, Active, Passed, Rejected} + TallyResult govtypes.TallyResult `json:"tally_result"` // Result of Tallys SubmitTime time.Time `json:"submit_time"` // Time of the block where TxGovSubmitProposal was included DepositEndTime time.Time `json:"deposit_end_time"` // Time that the Proposal would expire if deposit amount isn't met @@ -56,12 +57,12 @@ type ProposalOutput struct { VotingStartTime time.Time `json:"voting_start_time"` // Time of the block where MinDeposit was reached. -1 if MinDeposit is not reached VotingEndTime time.Time `json:"voting_end_time"` // Time that the VotingPeriod for this proposal will end and votes will be tallied - Param Param `json:"param"` + Param govtypes.Param `json:"param"` } type ProposalOutputs []ProposalOutput -func ConvertProposalToProposalOutput(proposal Proposal) ProposalOutput { +func ConvertProposalToProposalOutput(proposal govtypes.Proposal) ProposalOutput { proposalOutput := ProposalOutput{ ProposalID: proposal.GetProposalID(), @@ -78,16 +79,16 @@ func ConvertProposalToProposalOutput(proposal Proposal) ProposalOutput { VotingStartTime: proposal.GetVotingStartTime(), VotingEndTime: proposal.GetVotingEndTime(), - Param: Param{}, + Param: govtypes.Param{}, } - if proposal.GetProposalType() == ProposalTypeParameterChange { - proposalOutput.Param = proposal.(*ParameterProposal).Param + if proposal.GetProposalType() == govtypes.ProposalTypeParameterChange { + proposalOutput.Param = proposal.(*govtypes.ParameterProposal).Param } return proposalOutput } -func ConvertProposalsToProposalOutputs(proposals []Proposal) ProposalOutputs { +func ConvertProposalsToProposalOutputs(proposals []govtypes.Proposal) ProposalOutputs { var proposalOutputs ProposalOutputs for _, proposal := range proposals { @@ -111,7 +112,7 @@ func queryProposal(ctx sdk.Context, path []string, req abci.RequestQuery, keeper proposal := keeper.GetProposal(ctx, params.ProposalID) if proposal == nil { - return nil, ErrUnknownProposal(DefaultCodespace, params.ProposalID) + return nil, govtypes.ErrUnknownProposal(govtypes.DefaultCodespace, params.ProposalID) } proposalOutput := ConvertProposalToProposalOutput(proposal) @@ -139,16 +140,16 @@ func queryDeposit(ctx sdk.Context, path []string, req abci.RequestQuery, keeper proposal := keeper.GetProposal(ctx, params.ProposalID) if proposal == nil { - return nil, ErrUnknownProposal(DefaultCodespace, params.ProposalID) + return nil, govtypes.ErrUnknownProposal(govtypes.DefaultCodespace, params.ProposalID) } - if proposal.GetStatus() == StatusPassed || proposal.GetStatus() == StatusRejected { - return nil, ErrCodeDepositDeleted(DefaultCodespace, params.ProposalID) + if proposal.GetStatus() == govtypes.StatusPassed || proposal.GetStatus() == govtypes.StatusRejected { + return nil, govtypes.ErrCodeDepositDeleted(govtypes.DefaultCodespace, params.ProposalID) } deposit, bool := keeper.GetDeposit(ctx, params.ProposalID, params.Depositor) if !bool { - return nil, ErrCodeDepositNotExisted(DefaultCodespace, params.Depositor, params.ProposalID) + return nil, govtypes.ErrCodeDepositNotExisted(govtypes.DefaultCodespace, params.Depositor, params.ProposalID) } bz, err2 := codec.MarshalJSONIndent(keeper.cdc, deposit) @@ -174,16 +175,16 @@ func queryVote(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Kee proposal := keeper.GetProposal(ctx, params.ProposalID) if proposal == nil { - return nil, ErrUnknownProposal(DefaultCodespace, params.ProposalID) + return nil, govtypes.ErrUnknownProposal(govtypes.DefaultCodespace, params.ProposalID) } - if proposal.GetStatus() == StatusPassed || proposal.GetStatus() == StatusRejected { - return nil, ErrCodeVoteDeleted(DefaultCodespace, params.ProposalID) + if proposal.GetStatus() == govtypes.StatusPassed || proposal.GetStatus() == govtypes.StatusRejected { + return nil, govtypes.ErrCodeVoteDeleted(govtypes.DefaultCodespace, params.ProposalID) } vote, bool := keeper.GetVote(ctx, params.ProposalID, params.Voter) if !bool { - return nil, ErrCodeVoteNotExisted(DefaultCodespace, params.Voter, params.ProposalID) + return nil, govtypes.ErrCodeVoteNotExisted(govtypes.DefaultCodespace, params.Voter, params.ProposalID) } bz, err2 := codec.MarshalJSONIndent(keeper.cdc, vote) @@ -208,18 +209,18 @@ func queryDeposits(ctx sdk.Context, path []string, req abci.RequestQuery, keeper proposal := keeper.GetProposal(ctx, params.ProposalID) if proposal == nil { - return nil, ErrUnknownProposal(DefaultCodespace, params.ProposalID) + return nil, govtypes.ErrUnknownProposal(govtypes.DefaultCodespace, params.ProposalID) } - if proposal.GetStatus() == StatusPassed || proposal.GetStatus() == StatusRejected { - return nil, ErrCodeDepositDeleted(DefaultCodespace, params.ProposalID) + if proposal.GetStatus() == govtypes.StatusPassed || proposal.GetStatus() == govtypes.StatusRejected { + return nil, govtypes.ErrCodeDepositDeleted(govtypes.DefaultCodespace, params.ProposalID) } - var deposits []Deposit + var deposits []govtypes.Deposit depositsIterator := keeper.GetDeposits(ctx, params.ProposalID) defer depositsIterator.Close() for ; depositsIterator.Valid(); depositsIterator.Next() { - deposit := Deposit{} + deposit := govtypes.Deposit{} keeper.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), &deposit) deposits = append(deposits, deposit) } @@ -247,18 +248,18 @@ func queryVotes(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Ke proposal := keeper.GetProposal(ctx, params.ProposalID) if proposal == nil { - return nil, ErrUnknownProposal(DefaultCodespace, params.ProposalID) + return nil, govtypes.ErrUnknownProposal(govtypes.DefaultCodespace, params.ProposalID) } - if proposal.GetStatus() == StatusPassed || proposal.GetStatus() == StatusRejected { - return nil, ErrCodeVoteDeleted(DefaultCodespace, params.ProposalID) + if proposal.GetStatus() == govtypes.StatusPassed || proposal.GetStatus() == govtypes.StatusRejected { + return nil, govtypes.ErrCodeVoteDeleted(govtypes.DefaultCodespace, params.ProposalID) } - var votes []Vote + var votes []govtypes.Vote votesIterator := keeper.GetVotes(ctx, params.ProposalID) defer votesIterator.Close() for ; votesIterator.Valid(); votesIterator.Next() { - vote := Vote{} + vote := govtypes.Vote{} keeper.cdc.MustUnmarshalBinaryLengthPrefixed(votesIterator.Value(), &vote) votes = append(votes, vote) } @@ -277,7 +278,7 @@ func queryVotes(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Ke type QueryProposalsParams struct { Voter sdk.AccAddress Depositor sdk.AccAddress - ProposalStatus ProposalStatus + ProposalStatus govtypes.ProposalStatus Limit uint64 } @@ -317,14 +318,14 @@ func queryTally(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Ke proposal := keeper.GetProposal(ctx, param.ProposalID) if proposal == nil { - return nil, ErrUnknownProposal(DefaultCodespace, param.ProposalID) + return nil, govtypes.ErrUnknownProposal(govtypes.DefaultCodespace, param.ProposalID) } - var tallyResult TallyResult + var tallyResult govtypes.TallyResult - if proposal.GetStatus() == StatusDepositPeriod { - tallyResult = EmptyTallyResult() - } else if proposal.GetStatus() == StatusPassed || proposal.GetStatus() == StatusRejected { + if proposal.GetStatus() == govtypes.StatusDepositPeriod { + tallyResult = govtypes.EmptyTallyResult() + } else if proposal.GetStatus() == govtypes.StatusPassed || proposal.GetStatus() == govtypes.StatusRejected { tallyResult = proposal.GetTallyResult() } else { _, tallyResult = tally(ctx, keeper, proposal) diff --git a/modules/gov/simulation/msgs.go b/modules/gov/simulation/msgs.go index f873ec5b9..681cc0832 100644 --- a/modules/gov/simulation/msgs.go +++ b/modules/gov/simulation/msgs.go @@ -11,6 +11,7 @@ import ( "github.com/irisnet/irishub/modules/mock/baseapp" "github.com/irisnet/irishub/modules/mock/simulation" + govtypes "github.com/irisnet/irishub/types/gov" ) const ( @@ -113,14 +114,15 @@ func simulateHandleMsgSubmitProposal(msg gov.MsgSubmitProposal, sk stake.Keeper, func simulationCreateMsgSubmitProposal(r *rand.Rand, sender simulation.Account) (msg gov.MsgSubmitProposal, err error) { deposit := randomDeposit(r) - param := gov.Param{ + param := govtypes.Param{ Key: "test", Value: "value", + Op: "insert", } msg = gov.NewMsgSubmitProposal( simulation.RandStringOfLength(r, 5), simulation.RandStringOfLength(r, 5), - gov.ProposalTypeText, + govtypes.ProposalTypeSoftwareHalt, sender.Address, deposit, param, @@ -217,16 +219,16 @@ func randomProposalID(r *rand.Rand, k gov.Keeper, ctx sdk.Context) (proposalID i } // Pick a random voting option -func randomVotingOption(r *rand.Rand) gov.VoteOption { +func randomVotingOption(r *rand.Rand) govtypes.VoteOption { switch r.Intn(4) { case 0: - return gov.OptionYes + return govtypes.OptionYes case 1: - return gov.OptionAbstain + return govtypes.OptionAbstain case 2: - return gov.OptionNo + return govtypes.OptionNo case 3: - return gov.OptionNoWithVeto + return govtypes.OptionNoWithVeto } panic("should not happen") } diff --git a/modules/gov/simulation/sim_test.go b/modules/gov/simulation/sim_test.go index 2861d4857..7bd81d997 100644 --- a/modules/gov/simulation/sim_test.go +++ b/modules/gov/simulation/sim_test.go @@ -16,6 +16,7 @@ import ( distr "github.com/irisnet/irishub/modules/distribution" "github.com/irisnet/irishub/modules/guardian" protocolKeeper "github.com/irisnet/irishub/app/protocol/keeper" + govtypes "github.com/irisnet/irishub/types/gov" ) // TestGovWithRandomMessages @@ -62,7 +63,7 @@ func TestGovWithRandomMessages(t *testing.T) { guardianKeeper, stakeKeeper, protocolKeeper, - gov.DefaultCodespace, + govtypes.DefaultCodespace, ) mapp.Router().AddRoute("gov", []*sdk.KVStoreKey{govKey, mapp.KeyAccount, stakeKey, paramKey}, gov.NewHandler(govKeeper)) diff --git a/modules/gov/tally.go b/modules/gov/tally.go index 3b8009b5e..1f92ba8e5 100644 --- a/modules/gov/tally.go +++ b/modules/gov/tally.go @@ -2,7 +2,8 @@ package gov import ( sdk "github.com/irisnet/irishub/types" - "github.com/irisnet/irishub/modules/gov/params" + "github.com/irisnet/irishub/types/gov/params" + govtypes "github.com/irisnet/irishub/types/gov" ) // validatorGovInfo used for tallying @@ -11,15 +12,15 @@ type validatorGovInfo struct { Power sdk.Dec // Power of a Validator DelegatorShares sdk.Dec // Total outstanding delegator shares Minus sdk.Dec // Minus of validator, used to compute validator's voting power - Vote VoteOption // Vote of the validator + Vote govtypes.VoteOption // Vote of the validator } -func tally(ctx sdk.Context, keeper Keeper, proposal Proposal) (passes bool, tallyResults TallyResult) { - results := make(map[VoteOption]sdk.Dec) - results[OptionYes] = sdk.ZeroDec() - results[OptionAbstain] = sdk.ZeroDec() - results[OptionNo] = sdk.ZeroDec() - results[OptionNoWithVeto] = sdk.ZeroDec() +func tally(ctx sdk.Context, keeper Keeper, proposal govtypes.Proposal) (passes bool, tallyResults govtypes.TallyResult) { + results := make(map[govtypes.VoteOption]sdk.Dec) + results[govtypes.OptionYes] = sdk.ZeroDec() + results[govtypes.OptionAbstain] = sdk.ZeroDec() + results[govtypes.OptionNo] = sdk.ZeroDec() + results[govtypes.OptionNoWithVeto] = sdk.ZeroDec() totalVotingPower := sdk.ZeroDec() systemVotingPower := sdk.ZeroDec() @@ -31,7 +32,7 @@ func tally(ctx sdk.Context, keeper Keeper, proposal Proposal) (passes bool, tall Power: validator.GetPower(), DelegatorShares: validator.GetDelegatorShares(), Minus: sdk.ZeroDec(), - Vote: OptionEmpty, + Vote: govtypes.OptionEmpty, } systemVotingPower = systemVotingPower.Add(validator.GetPower()) return false @@ -41,7 +42,7 @@ func tally(ctx sdk.Context, keeper Keeper, proposal Proposal) (passes bool, tall votesIterator := keeper.GetVotes(ctx, proposal.GetProposalID()) defer votesIterator.Close() for ; votesIterator.Valid(); votesIterator.Next() { - vote := &Vote{} + vote := &govtypes.Vote{} keeper.cdc.MustUnmarshalBinaryLengthPrefixed(votesIterator.Value(), vote) // if validator, just record it in the map @@ -75,7 +76,7 @@ func tally(ctx sdk.Context, keeper Keeper, proposal Proposal) (passes bool, tall // iterate over the validators again to tally their voting power for _, val := range currValidators { - if val.Vote == OptionEmpty { + if val.Vote == govtypes.OptionEmpty { continue } @@ -91,15 +92,15 @@ func tally(ctx sdk.Context, keeper Keeper, proposal Proposal) (passes bool, tall tallyingProcedure := govparams.GetTallyingProcedure(ctx) //////////////////// iris end ///////////////////////////// - tallyResults = TallyResult{ - Yes: results[OptionYes], - Abstain: results[OptionAbstain], - No: results[OptionNo], - NoWithVeto: results[OptionNoWithVeto], + tallyResults = govtypes.TallyResult{ + Yes: results[govtypes.OptionYes], + Abstain: results[govtypes.OptionAbstain], + No: results[govtypes.OptionNo], + NoWithVeto: results[govtypes.OptionNoWithVeto], } // If no one votes, proposal fails - if totalVotingPower.Sub(results[OptionAbstain]).Equal(sdk.ZeroDec()) { + if totalVotingPower.Sub(results[govtypes.OptionAbstain]).Equal(sdk.ZeroDec()) { return false, tallyResults } //////////////////// iris begin /////////////////////////// @@ -110,12 +111,12 @@ func tally(ctx sdk.Context, keeper Keeper, proposal Proposal) (passes bool, tall //////////////////// iris end /////////////////////////// // If more than 1/3 of voters veto, proposal fails - if results[OptionNoWithVeto].Quo(totalVotingPower).GT(tallyingProcedure.Veto) { + if results[govtypes.OptionNoWithVeto].Quo(totalVotingPower).GT(tallyingProcedure.Veto) { return false, tallyResults } // If more than 1/2 of non-abstaining voters vote Yes, proposal passes - if results[OptionYes].Quo(totalVotingPower.Sub(results[OptionAbstain])).GT(tallyingProcedure.Threshold) { + if results[govtypes.OptionYes].Quo(totalVotingPower.Sub(results[govtypes.OptionAbstain])).GT(tallyingProcedure.Threshold) { return true, tallyResults } // If more than 1/2 of non-abstaining voters vote No, proposal fails diff --git a/modules/gov/test_common.go b/modules/gov/test_common.go index eec12f953..73eef78b7 100644 --- a/modules/gov/test_common.go +++ b/modules/gov/test_common.go @@ -15,7 +15,7 @@ import ( "github.com/irisnet/irishub/modules/bank" "github.com/irisnet/irishub/modules/mock" "github.com/irisnet/irishub/modules/stake" - "github.com/irisnet/irishub/modules/gov/params" + "github.com/irisnet/irishub/types/gov/params" "github.com/irisnet/irishub/types" stakeTypes "github.com/irisnet/irishub/modules/stake/types" "github.com/irisnet/irishub/modules/distribution" @@ -23,6 +23,7 @@ import ( "github.com/irisnet/irishub/modules/auth" "github.com/irisnet/irishub/modules/guardian" protocolKeeper "github.com/irisnet/irishub/app/protocol/keeper" + govtypes "github.com/irisnet/irishub/types/gov" ) // initialize the mock application for this module @@ -30,7 +31,7 @@ func getMockApp(t *testing.T, numGenAccs int) (*mock.App, Keeper, stake.Keeper, mapp := mock.NewApp() stake.RegisterCodec(mapp.Cdc) - RegisterCodec(mapp.Cdc) + govtypes.RegisterCodec(mapp.Cdc) keyGov := sdk.NewKVStoreKey("gov") keyDistr := sdk.NewKVStoreKey("distr") @@ -53,9 +54,9 @@ func getMockApp(t *testing.T, numGenAccs int) (*mock.App, Keeper, stake.Keeper, mapp.KeyStake, mapp.TkeyStake, mapp.BankKeeper, mapp.ParamsKeeper.Subspace(stake.DefaultParamspace), stake.DefaultCodespace) - dk := distribution.NewKeeper(mapp.Cdc, keyDistr, paramsKeeper.Subspace(distribution.DefaultParamspace), ck, sk, feeCollectionKeeper, DefaultCodespace) + dk := distribution.NewKeeper(mapp.Cdc, keyDistr, paramsKeeper.Subspace(distribution.DefaultParamspace), ck, sk, feeCollectionKeeper, govtypes.DefaultCodespace) guardianKeeper := guardian.NewKeeper(mapp.Cdc, sdk.NewKVStoreKey("guardian"), guardian.DefaultCodespace) - gk := NewKeeper(mapp.Cdc, keyGov, dk, ck, guardianKeeper, sk, pk, DefaultCodespace) + gk := NewKeeper(mapp.Cdc, keyGov, dk, ck, guardianKeeper, sk, pk, govtypes.DefaultCodespace) mapp.Router().AddRoute("gov", []*sdk.KVStoreKey{keyGov}, NewHandler(gk)) diff --git a/modules/mock/app.go b/modules/mock/app.go index 491918199..91ae1bb30 100644 --- a/modules/mock/app.go +++ b/modules/mock/app.go @@ -10,7 +10,7 @@ import ( "github.com/irisnet/irishub/modules/arbitration/params" "github.com/irisnet/irishub/modules/auth" "github.com/irisnet/irishub/modules/bank" - "github.com/irisnet/irishub/modules/gov/params" + "github.com/irisnet/irishub/types/gov/params" "github.com/irisnet/irishub/modules/params" "github.com/irisnet/irishub/modules/service/params" stakeTypes "github.com/irisnet/irishub/modules/stake/types" diff --git a/tools/prometheus/governance/metrics.go b/tools/prometheus/governance/metrics.go index fbaee76ae..a51e7976f 100644 --- a/tools/prometheus/governance/metrics.go +++ b/tools/prometheus/governance/metrics.go @@ -12,6 +12,7 @@ import ( "github.com/spf13/viper" "log" "time" + govtypes "github.com/irisnet/irishub/types/gov" ) // TODO @@ -102,18 +103,18 @@ func (gov *Metrics) RecordMetrics(ctx context.CLIContext, cdc *codec.Codec) { //-------------------------help functions-------------------------------------- -func getAllInactiveProposalsID(cdc *codec.Codec, ctx context.CLIContext) (proposals gov.ProposalQueue, err error) { +func getAllInactiveProposalsID(cdc *codec.Codec, ctx context.CLIContext) (proposals govtypes.ProposalQueue, err error) { if res, err := ctx.QueryStore(gov.PrefixInactiveProposalQueue, storeName); err != nil { - return gov.ProposalQueue{}, err + return govtypes.ProposalQueue{}, err } else { err = cdc.UnmarshalBinaryLengthPrefixed(res, &proposals) return proposals, err } } -func getAllActiveProposalsID(cdc *codec.Codec, ctx context.CLIContext) (proposals gov.ProposalQueue, err error) { +func getAllActiveProposalsID(cdc *codec.Codec, ctx context.CLIContext) (proposals govtypes.ProposalQueue, err error) { if res, err := ctx.QueryStore(gov.PrefixActiveProposalQueue, storeName); len(res) == 0 || err != nil { - return gov.ProposalQueue{}, err + return govtypes.ProposalQueue{}, err } else { err = cdc.UnmarshalBinaryLengthPrefixed(res, &proposals) return proposals, err @@ -121,22 +122,22 @@ func getAllActiveProposalsID(cdc *codec.Codec, ctx context.CLIContext) (proposal } -func getProposal(ID int64, cdc *codec.Codec, ctx context.CLIContext) (*gov.Proposal, error) { +func getProposal(ID int64, cdc *codec.Codec, ctx context.CLIContext) (*govtypes.Proposal, error) { if res, err := ctx.QueryStore(gov.KeyProposal(uint64(ID)), storeName); err != nil { return nil, err } else { - var proposal *gov.Proposal + var proposal *govtypes.Proposal err = cdc.UnmarshalBinaryLengthPrefixed(res, proposal) return proposal, err } } -func getVote(proposalID int64, voterAddr sdk.AccAddress, cdc *codec.Codec, ctx context.CLIContext) (vote gov.Vote, err error) { +func getVote(proposalID int64, voterAddr sdk.AccAddress, cdc *codec.Codec, ctx context.CLIContext) (vote govtypes.Vote, err error) { if res, err := ctx.QueryStore(gov.KeyVote(uint64(proposalID), voterAddr), storeName); err != nil { - return gov.Vote{}, err + return govtypes.Vote{}, err } else { if len(res) == 0 { - return gov.Vote{}, fmt.Errorf("cannot find the vote that %s vote for proposal %d", voterAddr.String(), proposalID) + return govtypes.Vote{}, fmt.Errorf("cannot find the vote that %s vote for proposal %d", voterAddr.String(), proposalID) } err = cdc.UnmarshalBinaryLengthPrefixed(res, &vote) return vote, err diff --git a/types/gov/codec.go b/types/gov/codec.go new file mode 100644 index 000000000..91d6a0c09 --- /dev/null +++ b/types/gov/codec.go @@ -0,0 +1,25 @@ +package gov + +import ( + "github.com/irisnet/irishub/codec" + "github.com/irisnet/irishub/types/gov/params" +) + +// Register concrete types on codec codec +func RegisterCodec(cdc *codec.Codec) { + + cdc.RegisterInterface((*Proposal)(nil), nil) + cdc.RegisterConcrete(&TextProposal{}, "gov/TextProposal", nil) + + //////////////////// iris begin /////////////////////////// + cdc.RegisterConcrete(&govparams.DepositProcedure{}, "cosmos-sdk/DepositProcedure", nil) + cdc.RegisterConcrete(&govparams.TallyingProcedure{}, "cosmos-sdk/TallyingProcedure", nil) + cdc.RegisterConcrete(&govparams.VotingProcedure{}, "cosmos-sdk/VotingProcedure", nil) + cdc.RegisterConcrete(&ParameterProposal{}, "gov/ParameterProposal", nil) + cdc.RegisterConcrete(&SoftwareUpgradeProposal{}, "gov/SoftwareUpgradeProposal", nil) + cdc.RegisterConcrete(&HaltProposal{}, "gov/TerminatorProposal", nil) + cdc.RegisterConcrete(&TaxUsageProposal{}, "gov/TaxUsageProposal", nil) + //////////////////// iris end /////////////////////////// +} + +var msgCdc = codec.New() diff --git a/modules/gov/config_file.go b/types/gov/config_file.go similarity index 96% rename from modules/gov/config_file.go rename to types/gov/config_file.go index e644ff3da..9ce8f918a 100644 --- a/modules/gov/config_file.go +++ b/types/gov/config_file.go @@ -1,14 +1,14 @@ package gov import ( - "fmt" "encoding/json" - sdk "github.com/irisnet/irishub/types" - "path" + "fmt" "github.com/irisnet/irishub/codec" - cmn "github.com/tendermint/tendermint/libs/common" - "github.com/irisnet/irishub/modules/gov/params" "github.com/irisnet/irishub/modules/params" + sdk "github.com/irisnet/irishub/types" + "github.com/irisnet/irishub/types/gov/params" + cmn "github.com/tendermint/tendermint/libs/common" + "path" ) type ParameterConfigFile struct { @@ -29,7 +29,7 @@ func (pd *ParameterConfigFile) ReadFile(cdc *codec.Codec, pathStr string) error err = cdc.UnmarshalJSON(jsonBytes, &pd) return err } -func (pd *ParameterConfigFile) WriteFile(cdc *codec.Codec, res []sdk.KVPair , pathStr string) error { +func (pd *ParameterConfigFile) WriteFile(cdc *codec.Codec, res []sdk.KVPair, pathStr string) error { for _, kv := range res { switch string(kv.Key) { case "Gov/govDepositProcedure": @@ -50,7 +50,6 @@ func (pd *ParameterConfigFile) WriteFile(cdc *codec.Codec, res []sdk.KVPair , pa } } - output, err := cdc.MarshalJSONIndent(pd, "", " ") if err != nil { diff --git a/modules/gov/depositsvotes.go b/types/gov/depositsvotes.go similarity index 93% rename from modules/gov/depositsvotes.go rename to types/gov/depositsvotes.go index e2260bbcd..e0014a427 100644 --- a/modules/gov/depositsvotes.go +++ b/types/gov/depositsvotes.go @@ -11,7 +11,7 @@ import ( // Vote type Vote struct { Voter sdk.AccAddress `json:"voter"` // address of the voter - ProposalID uint64 `json:"proposal_id"` // proposalID of the proposal + ProposalID uint64 `json:"proposal_id"` // proposalID of the proposal Option VoteOption `json:"option"` // option from OptionSet chosen by the voter } @@ -29,7 +29,7 @@ func (voteA Vote) Empty() bool { // Deposit type Deposit struct { Depositor sdk.AccAddress `json:"depositor"` // Address of the depositor - ProposalID uint64 `json:"proposal_id"` // proposalID of the proposal + ProposalID uint64 `json:"proposal_id"` // proposalID of the proposal Amount sdk.Coins `json:"amount"` // Deposit amount } @@ -73,7 +73,7 @@ func VoteOptionFromString(str string) (VoteOption, error) { } // Is defined VoteOption -func validVoteOption(option VoteOption) bool { +func ValidVoteOption(option VoteOption) bool { if option == OptionYes || option == OptionAbstain || option == OptionNo || diff --git a/modules/gov/errors.go b/types/gov/errors.go similarity index 100% rename from modules/gov/errors.go rename to types/gov/errors.go diff --git a/modules/gov/params/gov_params.go b/types/gov/params/gov_params.go similarity index 100% rename from modules/gov/params/gov_params.go rename to types/gov/params/gov_params.go diff --git a/modules/gov/params/gov_params_test.go b/types/gov/params/gov_params_test.go similarity index 100% rename from modules/gov/params/gov_params_test.go rename to types/gov/params/gov_params_test.go diff --git a/modules/gov/params/util.go b/types/gov/params/util.go similarity index 100% rename from modules/gov/params/util.go rename to types/gov/params/util.go diff --git a/types/gov/proposal_halt.go b/types/gov/proposal_halt.go new file mode 100644 index 000000000..e960497a2 --- /dev/null +++ b/types/gov/proposal_halt.go @@ -0,0 +1,7 @@ +package gov + +var _ Proposal = (*HaltProposal)(nil) + +type HaltProposal struct { + TextProposal +} diff --git a/types/gov/proposal_params.go b/types/gov/proposal_params.go new file mode 100644 index 000000000..873ea8118 --- /dev/null +++ b/types/gov/proposal_params.go @@ -0,0 +1,20 @@ +package gov + +const ( + Insert string = "insert" + Update string = "update" +) + +type Param struct { + Key string `json:"key"` + Value string `json:"value"` + Op string `json:"op"` +} + +// Implements Proposal Interface +var _ Proposal = (*ParameterProposal)(nil) + +type ParameterProposal struct { + TextProposal + Param Param `json:"params"` +} diff --git a/modules/gov/proposal_taxusage.go b/types/gov/proposal_taxusage.go similarity index 89% rename from modules/gov/proposal_taxusage.go rename to types/gov/proposal_taxusage.go index de5861629..8a5bb161a 100644 --- a/modules/gov/proposal_taxusage.go +++ b/types/gov/proposal_taxusage.go @@ -1,10 +1,10 @@ package gov import ( + "encoding/json" "fmt" sdk "github.com/irisnet/irishub/types" "github.com/pkg/errors" - "encoding/json" ) type UsageType byte @@ -30,7 +30,7 @@ func UsageTypeFromString(str string) (UsageType, error) { } // is defined UsageType? -func validUsageType(ut UsageType) bool { +func ValidUsageType(ut UsageType) bool { if ut == UsageTypeBurn || ut == UsageTypeDistribute || ut == UsageTypeGrant { @@ -105,12 +105,3 @@ type TaxUsageProposal struct { DestAddress sdk.AccAddress Percent sdk.Dec } - -func (p *TaxUsageProposal) Execute(ctx sdk.Context, k Keeper) (err error) { - burn := false - if p.Usage == UsageTypeBurn { - burn = true - } - k.dk.AllocateFeeTax(ctx, p.DestAddress, p.Percent, burn) - return -} diff --git a/types/gov/proposal_upgrade.go b/types/gov/proposal_upgrade.go new file mode 100644 index 000000000..36ea0bbe8 --- /dev/null +++ b/types/gov/proposal_upgrade.go @@ -0,0 +1,10 @@ +package gov + +var _ Proposal = (*SoftwareUpgradeProposal)(nil) + +type SoftwareUpgradeProposal struct { + TextProposal + Version uint64 + Software string + SwitchHeight uint64 +} diff --git a/modules/gov/proposals.go b/types/gov/proposals.go similarity index 95% rename from modules/gov/proposals.go rename to types/gov/proposals.go index 5a45631dc..b7c2482cf 100644 --- a/modules/gov/proposals.go +++ b/types/gov/proposals.go @@ -45,9 +45,6 @@ type Proposal interface { GetVotingEndTime() time.Time SetVotingEndTime(time.Time) - //////////////////// iris begin /////////////////////////// - Execute(ctx sdk.Context, k Keeper) error - //////////////////// iris end /////////////////////////// } // checks if two proposals are equal @@ -120,11 +117,6 @@ func (tp *TextProposal) SetVotingEndTime(votingEndTime time.Time) { tp.VotingEndTime = votingEndTime } -//////////////////// iris begin /////////////////////////// -func (pp *TextProposal) Execute(ctx sdk.Context, k Keeper) (err error) { return nil } - -//////////////////// iris end ///////////////////////////// - //----------------------------------------------------------- // ProposalQueue type ProposalQueue []uint64 @@ -168,11 +160,11 @@ func ProposalTypeFromString(str string) (ProposalKind, error) { } // is defined ProposalType? -func validProposalType(pt ProposalKind) bool { +func ValidProposalType(pt ProposalKind) bool { if pt == ProposalTypeText || pt == ProposalTypeParameterChange || pt == ProposalTypeSoftwareUpgrade || - //////////////////// iris begin ///////////////////////////// + //////////////////// iris begin ///////////////////////////// pt == ProposalTypeSoftwareHalt || pt == ProposalTypeTxTaxUsage { //////////////////// iris end ///////////////////////////// @@ -279,7 +271,7 @@ func ProposalStatusFromString(str string) (ProposalStatus, error) { } // is defined ProposalType? -func validProposalStatus(status ProposalStatus) bool { +func ValidProposalStatus(status ProposalStatus) bool { if status == StatusDepositPeriod || status == StatusVotingPeriod || status == StatusPassed ||