diff --git a/modules/gov/errors.go b/modules/gov/errors.go index 0825e00f8..a59672b21 100644 --- a/modules/gov/errors.go +++ b/modules/gov/errors.go @@ -21,6 +21,10 @@ const ( CodeInvalidVote sdk.CodeType = 9 CodeInvalidGenesis sdk.CodeType = 10 CodeInvalidProposalStatus sdk.CodeType = 11 + CodeInvalidMinDeposit sdk.CodeType = 100 + CodeInvalidMinDepositDenom sdk.CodeType = 101 + CodeInvalidMinDepositAmount sdk.CodeType = 102 + CodeInvalidDepositPeriod sdk.CodeType = 103 ) //---------------------------------------- @@ -46,7 +50,7 @@ func ErrAddressNotStaked(codespace sdk.CodespaceType, address sdk.AccAddress) sd return sdk.NewError(codespace, CodeAddressNotStaked, fmt.Sprintf("Address %s is not staked and is thus ineligible to vote", address)) } -func ErrInvalidTitle(codespace sdk.CodespaceType, title string) sdk.Error { +func ErrInvalidTitle(codespace sdk.CodespaceType, title string) sdk.Error { return sdk.NewError(codespace, CodeInvalidTitle, fmt.Sprintf("Proposal Title '%s' is not valid", title)) } diff --git a/modules/gov/msgs_test.go b/modules/gov/msgs_test.go index 6d2b8bb38..19abe85d6 100644 --- a/modules/gov/msgs_test.go +++ b/modules/gov/msgs_test.go @@ -39,8 +39,10 @@ func TestMsgSubmitProposal(t *testing.T) { {"Test Proposal", "the purpose of this proposal is to test", ProposalTypeText, addrs[0], coinsMulti, true}, } + var params Params + for i, tc := range tests { - msg := NewMsgSubmitProposal(tc.title, tc.description, tc.proposalType, tc.proposerAddr, tc.initialDeposit) + msg := NewMsgSubmitProposal(tc.title, tc.description, tc.proposalType, tc.proposerAddr, tc.initialDeposit, params) if tc.expectPass { require.Nil(t, msg.ValidateBasic(), "test: %v", i) } else { diff --git a/modules/gov/params/gov_params.go b/modules/gov/params/gov_params.go new file mode 100644 index 000000000..deda1e77e --- /dev/null +++ b/modules/gov/params/gov_params.go @@ -0,0 +1,84 @@ +package govparams + +import ( + "encoding/json" + "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/params" + "github.com/irisnet/irishub/modules/gov" +) + +var DepositProcedureParameter DepositProcedureParam + +type DepositProcedureParam struct { + Value gov.DepositProcedure + psetter params.Setter + pgetter params.Getter +} + +func (param *DepositProcedureParam) InitGenesis(genesisState interface{}) { + if value, ok := genesisState.(gov.DepositProcedure); ok { + param.Value = value + } else { + param.Value = gov.DepositProcedure{ + MinDeposit: sdk.Coins{sdk.NewInt64Coin("iris", 10)}, + MaxDepositPeriod: 1440} + } +} + +func (param *DepositProcedureParam) SetReadWriter(setter params.Setter) { + param.psetter = setter + param.pgetter = setter.Getter +} + +func (param *DepositProcedureParam) GetStoreKey() string { + return "Gov/gov/depositProcedure" + +} + +func (param *DepositProcedureParam) SaveValue(ctx sdk.Context) { + param.psetter.Set(ctx, param.GetStoreKey(), param.Value) +} + +func (param *DepositProcedureParam) LoadValue(ctx sdk.Context) bool { + err := param.pgetter.Get(ctx, param.GetStoreKey(), ¶m.Value) + if err != nil { + return false + } + return true +} + +func (param *DepositProcedureParam) ToJson() string { + jsonBytes, _ := json.Marshal(param.Value) + return string(jsonBytes) +} + +func (param *DepositProcedureParam) Update(ctx sdk.Context, jsonStr string) { + if err := json.Unmarshal([]byte(jsonStr), ¶m.Value); err == nil { + param.SaveValue(ctx) + } +} + +func (param *DepositProcedureParam) Valid(jsonStr string) sdk.Error { + + var err error + + if err = json.Unmarshal([]byte(jsonStr), ¶m.Value); err == nil { + + if param.Value.MinDeposit[0].Denom != "iris" { + return sdk.NewError(gov.DefaultCodespace, gov.CodeInvalidMinDepositDenom, fmt.Sprintf("It should be iris ")) + } + + if param.Value.MinDeposit[0].Amount.GT(sdk.NewInt(10)) && param.Value.MinDeposit[0].Amount.LT(sdk.NewInt(20000)) { + return sdk.NewError(gov.DefaultCodespace, gov.CodeInvalidMinDepositAmount, fmt.Sprintf("MinDepositAmount should be larger than 10 and less than 20000")) + } + + if param.Value.MaxDepositPeriod > 20 && param.Value.MaxDepositPeriod < 20000 { + return sdk.NewError(gov.DefaultCodespace, gov.CodeInvalidDepositPeriod, fmt.Sprintf("MaxDepositPeriod should be larger than 20 and less than 20000")) + } + + return nil + + } + return sdk.NewError(gov.DefaultCodespace, gov.CodeInvalidMinDeposit, fmt.Sprintf("Json is not valid")) +} diff --git a/modules/gov/params/gov_params_test.go b/modules/gov/params/gov_params_test.go new file mode 100644 index 000000000..a7e93e95a --- /dev/null +++ b/modules/gov/params/gov_params_test.go @@ -0,0 +1,61 @@ +package govparams + +import ( + "github.com/cosmos/cosmos-sdk/store" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/params" + "github.com/irisnet/irishub/modules/gov" + "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" + dbm "github.com/tendermint/tendermint/libs/db" + "github.com/tendermint/tendermint/libs/log" + "testing" +) + +func defaultContext(key sdk.StoreKey) sdk.Context { + db := dbm.NewMemDB() + cms := store.NewCommitMultiStore(db) + cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) + cms.LoadLatestVersion() + ctx := sdk.NewContext(cms, abci.Header{}, false, log.NewNopLogger()) + return ctx +} + +func TestDepositProcedureParam(t *testing.T) { + skey := sdk.NewKVStoreKey("params") + ctx := defaultContext(skey) + paramKeeper := params.NewKeeper(wire.NewCodec(), skey) + + p1 := gov.DepositProcedure{ + MinDeposit: sdk.Coins{sdk.NewInt64Coin("iris", 10)}, + MaxDepositPeriod: 1440} + + p2 := gov.DepositProcedure{ + MinDeposit: sdk.Coins{sdk.NewInt64Coin("iris", 30)}, + MaxDepositPeriod: 1440} + + DepositProcedureParameter.SetReadWriter(paramKeeper.Setter()) + find := DepositProcedureParameter.LoadValue(ctx) + require.Equal(t, find, false) + + DepositProcedureParameter.InitGenesis(nil) + require.Equal(t, p1, DepositProcedureParameter.Value) + + require.Equal(t, DepositProcedureParameter.ToJson(), "{\"min_deposit\":[{\"denom\":\"iris\",\"amount\":\"10\"}],\"max_deposit_period\":1440}") + DepositProcedureParameter.Update(ctx, "{\"min_deposit\":[{\"denom\":\"iris\",\"amount\":\"30\"}],\"max_deposit_period\":1440}") + require.NotEqual(t, p1, DepositProcedureParameter.Value) + require.Equal(t, p2, DepositProcedureParameter.Value) + + result := DepositProcedureParameter.Valid("{\"min_deposit\":[{\"denom\":\"atom\",\"amount\":\"30\"}],\"max_deposit_period\":1440}") + require.Error(t, result) + + DepositProcedureParameter.InitGenesis(p2) + require.Equal(t, p2, DepositProcedureParameter.Value) + DepositProcedureParameter.InitGenesis(p1) + require.Equal(t, p1, DepositProcedureParameter.Value) + + DepositProcedureParameter.LoadValue(ctx) + require.Equal(t, p2, DepositProcedureParameter.Value) + +} diff --git a/modules/parameter/parameter.go b/modules/parameter/parameter.go index 0f4e5cb60..2e87e2057 100644 --- a/modules/parameter/parameter.go +++ b/modules/parameter/parameter.go @@ -1,15 +1,17 @@ package parameter -import( - sdk "github.com/cosmos/cosmos-sdk/types" +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/params" ) type Parameter interface { - - InitGenesis() + InitGenesis(interface{}) GetStoreKey() string + SetReadWriter(setter params.Setter) + SaveValue(ctx sdk.Context) LoadValue(ctx sdk.Context) bool @@ -20,7 +22,6 @@ type SignalParameter interface { } type GovParameter interface { - Parameter Valid(json string) error @@ -28,15 +29,12 @@ type GovParameter interface { Update(ctx sdk.Context, json string) ToJson() string - } type GovArrayParameter interface { - GovParameter LoadValueByKey(ctx sdk.Context, key string) bool Insert(ctx sdk.Context, json string) - -} +} \ No newline at end of file