From c37da4cf49c8be04287d7fde64b7a4f8f4ebd174 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Thu, 28 Nov 2019 09:59:27 +0800 Subject: [PATCH 01/17] refactor mint module --- app/app.go | 4 +- config/config.go | 5 +- go.mod | 1 + modules/mint/abci.go | 37 ++-- modules/mint/alias.go | 34 ++++ modules/mint/client/cli/query.go | 57 +++++++ modules/mint/client/rest/query.go | 38 +++++ modules/mint/client/rest/rest.go | 12 ++ modules/mint/expected_keepers.go | 10 -- modules/mint/genesis.go | 47 +----- modules/mint/internal/keeper/keeper.go | 87 ++++++++++ modules/mint/internal/keeper/querier.go | 33 ++++ modules/mint/internal/keeper/querier_test.go | 80 +++++++++ modules/mint/internal/types/codec.go | 19 +++ modules/mint/internal/types/errors.go | 8 + modules/mint/internal/types/events.go | 9 + .../mint/internal/types/expected_keepers.go | 17 ++ modules/mint/internal/types/genesis.go | 37 ++++ modules/mint/internal/types/keys.go | 23 +++ modules/mint/{ => internal/types}/minter.go | 12 +- .../mint/{ => internal/types}/minter_test.go | 7 +- modules/mint/internal/types/params.go | 62 +++++++ modules/mint/keeper.go | 57 ------- modules/mint/module.go | 159 ++++++++++++++++++ modules/mint/params.go | 107 ------------ modules/mint/simulation/decoder.go | 24 +++ modules/mint/simulation/decoder_test.go | 50 ++++++ modules/mint/simulation/genesis.go | 40 +++++ modules/mint/simulation/params.go | 23 +++ modules/mint/tags/tags.go | 8 - modules/mint/wire.go | 18 -- 31 files changed, 854 insertions(+), 271 deletions(-) create mode 100644 modules/mint/alias.go create mode 100644 modules/mint/client/cli/query.go create mode 100644 modules/mint/client/rest/query.go create mode 100644 modules/mint/client/rest/rest.go delete mode 100644 modules/mint/expected_keepers.go create mode 100644 modules/mint/internal/keeper/keeper.go create mode 100644 modules/mint/internal/keeper/querier.go create mode 100644 modules/mint/internal/keeper/querier_test.go create mode 100644 modules/mint/internal/types/codec.go create mode 100644 modules/mint/internal/types/errors.go create mode 100644 modules/mint/internal/types/events.go create mode 100644 modules/mint/internal/types/expected_keepers.go create mode 100644 modules/mint/internal/types/genesis.go create mode 100644 modules/mint/internal/types/keys.go rename modules/mint/{ => internal/types}/minter.go (86%) rename modules/mint/{ => internal/types}/minter_test.go (78%) create mode 100644 modules/mint/internal/types/params.go delete mode 100644 modules/mint/keeper.go create mode 100644 modules/mint/module.go delete mode 100644 modules/mint/params.go create mode 100644 modules/mint/simulation/decoder.go create mode 100644 modules/mint/simulation/decoder_test.go create mode 100644 modules/mint/simulation/genesis.go create mode 100644 modules/mint/simulation/params.go delete mode 100644 modules/mint/tags/tags.go delete mode 100644 modules/mint/wire.go diff --git a/app/app.go b/app/app.go index 8b97f738e..ba2686fd7 100644 --- a/app/app.go +++ b/app/app.go @@ -18,12 +18,12 @@ import ( "github.com/cosmos/cosmos-sdk/x/evidence" "github.com/cosmos/cosmos-sdk/x/genutil" "github.com/cosmos/cosmos-sdk/x/gov" - "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/params" paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cosmos/cosmos-sdk/x/supply" + "github.com/irisnet/irishub/modules/mint" abci "github.com/tendermint/tendermint/abci/types" cmn "github.com/tendermint/tendermint/libs/common" "github.com/tendermint/tendermint/libs/log" @@ -156,7 +156,7 @@ func NewIrisApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest b stakingKeeper := staking.NewKeeper( app.cdc, keys[staking.StoreKey], app.supplyKeeper, stakingSubspace, staking.DefaultCodespace, ) - app.mintKeeper = mint.NewKeeper(app.cdc, keys[mint.StoreKey], mintSubspace, &stakingKeeper, app.supplyKeeper, auth.FeeCollectorName) + app.mintKeeper = mint.NewKeeper(app.cdc, keys[mint.StoreKey], mintSubspace, app.bankKeeper, app.supplyKeeper, auth.FeeCollectorName) app.distrKeeper = distr.NewKeeper(app.cdc, keys[distr.StoreKey], distrSubspace, &stakingKeeper, app.supplyKeeper, distr.DefaultCodespace, auth.FeeCollectorName, app.ModuleAccountAddrs()) app.slashingKeeper = slashing.NewKeeper( diff --git a/config/config.go b/config/config.go index 0cb46bf47..89cfcfa60 100644 --- a/config/config.go +++ b/config/config.go @@ -1,8 +1,9 @@ package config const ( - Testnet = "testnet" - Mainnet = "mainnet" + Testnet = "testnet" + Mainnet = "mainnet" + StakeDenom = "iris-atto" ) // Can be configured through environment variables diff --git a/go.mod b/go.mod index f5b2dcb25..745691d75 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ require ( github.com/cosmos/cosmos-sdk v0.34.4-0.20191108144056-d81d46192a0c github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d // indirect github.com/golang/mock v1.3.1 // indirect + github.com/gorilla/mux v1.7.3 github.com/onsi/ginkgo v1.8.0 // indirect github.com/onsi/gomega v1.5.0 // indirect github.com/otiai10/copy v1.0.2 diff --git a/modules/mint/abci.go b/modules/mint/abci.go index 5f41a9b1d..07e555b0c 100644 --- a/modules/mint/abci.go +++ b/modules/mint/abci.go @@ -1,22 +1,21 @@ package mint import ( - "github.com/irisnet/irishub/app/v1/mint/tags" - sdk "github.com/irisnet/irishub/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/irisnet/irishub/modules/mint/internal/types" ) // Called every block, process inflation on the first block of every hour -func BeginBlocker(ctx sdk.Context, k Keeper) sdk.Tags { +func BeginBlocker(ctx sdk.Context, k Keeper) { ctx = ctx.WithLogger(ctx.Logger().With("handler", "beginBlock").With("module", "iris/mint")) logger := ctx.Logger() // Get block BFT time and block height blockTime := ctx.BlockHeader().Time - blockHeight := ctx.BlockHeader().Height minter := k.GetMinter(ctx) - if blockHeight <= 1 { // don't inflate token in the first block + if ctx.BlockHeader().Height <= 1 { // don't inflate token in the first block minter.LastUpdate = blockTime k.SetMinter(ctx, minter) - return nil + return } // Calculate block mint amount @@ -27,18 +26,28 @@ func BeginBlocker(ctx sdk.Context, k Keeper) sdk.Tags { mintedCoin := minter.BlockProvision(annualProvisions) logger.Info("Mint result", "block_provisions", mintedCoin.String(), "time", blockTime.String()) - // Increase loosen token and add minted coin to feeCollector - k.bk.IncreaseLoosenToken(ctx, sdk.Coins{mintedCoin}) - k.fk.AddCollectedFees(ctx, sdk.Coins{mintedCoin}) + mintedCoins := sdk.NewCoins(mintedCoin) + // mint coins to submodule account + if err := k.MintCoins(ctx, mintedCoins); err != nil { + panic(err) + } + + // send the minted coins to the fee collector account + if err := k.AddCollectedFees(ctx, mintedCoins); err != nil { + panic(err) + } // Update last block BFT time lastInflationTime := minter.LastUpdate minter.LastUpdate = blockTime k.SetMinter(ctx, minter) - // Add tags - return sdk.NewTags( - tags.LastInflationTime, []byte(lastInflationTime.String()), - tags.InflationTime, []byte(blockTime.String()), - tags.MintCoin, []byte(mintedCoin.String()), + + ctx.EventManager().EmitEvent( + sdk.NewEvent( + types.EventTypeMint, + sdk.NewAttribute(types.AttributeKeyLastInflationTime, lastInflationTime.String()), + sdk.NewAttribute(types.AttributeKeyInflationTime, blockTime.String()), + sdk.NewAttribute(types.AttributeKeyMintCoin, mintedCoin.Amount.String()), + ), ) } diff --git a/modules/mint/alias.go b/modules/mint/alias.go new file mode 100644 index 000000000..1ec478780 --- /dev/null +++ b/modules/mint/alias.go @@ -0,0 +1,34 @@ +package mint + +import ( + "github.com/irisnet/irishub/modules/mint/internal/keeper" + "github.com/irisnet/irishub/modules/mint/internal/types" +) + +const ( + ModuleName = types.ModuleName + DefaultParamspace = types.DefaultParamspace + StoreKey = types.StoreKey + QuerierRoute = types.QuerierRoute +) + +var ( + // functions aliases + NewKeeper = keeper.NewKeeper + NewQuerier = keeper.NewQuerier + NewGenesisState = types.NewGenesisState + DefaultGenesisState = types.DefaultGenesisState + ValidateGenesis = types.ValidateGenesis + RegisterCodec = types.RegisterCodec + DefaultParams = types.DefaultParams + + // variable aliases + ModuleCdc = types.ModuleCdc +) + +type ( + Keeper = keeper.Keeper + GenesisState = types.GenesisState + Minter = types.Minter + Params = types.Params +) diff --git a/modules/mint/client/cli/query.go b/modules/mint/client/cli/query.go new file mode 100644 index 000000000..6c1fe0bcc --- /dev/null +++ b/modules/mint/client/cli/query.go @@ -0,0 +1,57 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/context" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/irisnet/irishub/modules/mint/internal/types" +) + +// GetQueryCmd returns the cli query commands for the minting module. +func GetQueryCmd(cdc *codec.Codec) *cobra.Command { + mintingQueryCmd := &cobra.Command{ + Use: types.ModuleName, + Short: "Querying commands for the minting module", + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + mintingQueryCmd.AddCommand( + client.GetCommands( + GetCmdQueryParams(cdc), + )..., + ) + + return mintingQueryCmd +} + +// GetCmdQueryParams implements a command to return the current minting +// parameters. +func GetCmdQueryParams(cdc *codec.Codec) *cobra.Command { + return &cobra.Command{ + Use: "params", + Short: "Query the current minting parameters", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + cliCtx := context.NewCLIContext().WithCodec(cdc) + + route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryParameters) + res, _, err := cliCtx.QueryWithData(route, nil) + if err != nil { + return err + } + + var params types.Params + if err := cdc.UnmarshalJSON(res, ¶ms); err != nil { + return err + } + + return cliCtx.PrintOutput(params) + }, + } +} diff --git a/modules/mint/client/rest/query.go b/modules/mint/client/rest/query.go new file mode 100644 index 000000000..72721f32b --- /dev/null +++ b/modules/mint/client/rest/query.go @@ -0,0 +1,38 @@ +package rest + +import ( + "fmt" + "net/http" + + "github.com/cosmos/cosmos-sdk/client/context" + "github.com/cosmos/cosmos-sdk/types/rest" + "github.com/gorilla/mux" + "github.com/irisnet/irishub/modules/mint/internal/types" +) + +func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router) { + r.HandleFunc( + "/mint/parameters", + queryParamsHandlerFn(cliCtx), + ).Methods("GET") +} + +func queryParamsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryParameters) + + cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) + if !ok { + return + } + + res, height, err := cliCtx.QueryWithData(route, nil) + if err != nil { + rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + return + } + + cliCtx = cliCtx.WithHeight(height) + rest.PostProcessResponse(w, cliCtx, res) + } +} diff --git a/modules/mint/client/rest/rest.go b/modules/mint/client/rest/rest.go new file mode 100644 index 000000000..556e14685 --- /dev/null +++ b/modules/mint/client/rest/rest.go @@ -0,0 +1,12 @@ +package rest + +import ( + "github.com/gorilla/mux" + + "github.com/cosmos/cosmos-sdk/client/context" +) + +// RegisterRoutes registers minting module REST handlers on the provided router. +func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router) { + registerQueryRoutes(cliCtx, r) +} diff --git a/modules/mint/expected_keepers.go b/modules/mint/expected_keepers.go deleted file mode 100644 index bd5ab3cd6..000000000 --- a/modules/mint/expected_keepers.go +++ /dev/null @@ -1,10 +0,0 @@ -package mint - -import ( - sdk "github.com/irisnet/irishub/types" -) - -// expected fee collection keeper interface -type FeeKeeper interface { - AddCollectedFees(sdk.Context, sdk.Coins) sdk.Coins -} diff --git a/modules/mint/genesis.go b/modules/mint/genesis.go index 942155566..0a177786d 100644 --- a/modules/mint/genesis.go +++ b/modules/mint/genesis.go @@ -1,59 +1,18 @@ package mint import ( - sdk "github.com/irisnet/irishub/types" + sdk "github.com/cosmos/cosmos-sdk/types" ) -// GenesisState - all distribution state that must be provided at genesis -type GenesisState struct { - Minter Minter `json:"minter"` // minter object - Params Params `json:"params"` // inflation params -} - -func NewGenesisState(minter Minter, params Params) GenesisState { - return GenesisState{ - Minter: minter, - Params: params, - } -} - -// get raw genesis raw message for testing -func DefaultGenesisState() GenesisState { - return GenesisState{ - Minter: InitialMinter(), - Params: DefaultParams(), - } -} - -// new mint genesis +// InitGenesis new mint genesis func InitGenesis(ctx sdk.Context, keeper Keeper, data GenesisState) { - if err := ValidateGenesis(data); err != nil { - panic(err.Error()) - } - keeper.SetMinter(ctx, data.Minter) keeper.SetParamSet(ctx, data.Params) } -// ExportGenesis returns a GenesisState for a given context and keeper. The -// GenesisState will contain the pool, and validator/delegator distribution info's +// ExportGenesis returns a GenesisState for a given context and keeper. func ExportGenesis(ctx sdk.Context, keeper Keeper) GenesisState { - minter := keeper.GetMinter(ctx) params := keeper.GetParamSet(ctx) return NewGenesisState(minter, params) } - -// ValidateGenesis validates the provided staking genesis state to ensure the -// expected invariants holds. (i.e. params in correct bounds, no duplicate validators) -func ValidateGenesis(data GenesisState) error { - err := validateParams(data.Params) - if err != nil { - return err - } - err = validateMinter(data.Minter) - if err != nil { - return err - } - return nil -} diff --git a/modules/mint/internal/keeper/keeper.go b/modules/mint/internal/keeper/keeper.go new file mode 100644 index 000000000..56a29d638 --- /dev/null +++ b/modules/mint/internal/keeper/keeper.go @@ -0,0 +1,87 @@ +package keeper + +import ( + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/params" + "github.com/irisnet/irishub/modules/mint/internal/types" +) + +// keeper of the stake store +type Keeper struct { + storeKey sdk.StoreKey + cdc *codec.Codec + paramSpace params.Subspace + bk bank.Keeper + supplyKeeper types.SupplyKeeper + feeCollectorName string +} + +func NewKeeper(cdc *codec.Codec, key sdk.StoreKey, + paramSpace params.Subspace, bk bank.Keeper, supplyKeeper types.SupplyKeeper, feeCollectorName string) Keeper { + + keeper := Keeper{ + storeKey: key, + cdc: cdc, + paramSpace: paramSpace.WithKeyTable(types.ParamKeyTable()), + bk: bk, + supplyKeeper: supplyKeeper, + feeCollectorName: feeCollectorName, + } + return keeper +} + +//____________________________________________________________________ +// Keys + +var ( + minterKey = []byte{0x00} // the one key to use for the keeper store +) + +//______________________________________________________________________ + +// get the minter +func (k Keeper) GetMinter(ctx sdk.Context) (minter types.Minter) { + store := ctx.KVStore(k.storeKey) + b := store.Get(minterKey) + if b == nil { + panic("Stored minter should not have been nil") + } + k.cdc.MustUnmarshalBinaryLengthPrefixed(b, &minter) + return +} + +// MintCoins implements an alias call to the underlying supply keeper's +// MintCoins to be used in BeginBlocker. +func (k Keeper) MintCoins(ctx sdk.Context, newCoins sdk.Coins) sdk.Error { + if newCoins.Empty() { + // skip as no coins need to be minted + return nil + } + return k.supplyKeeper.MintCoins(ctx, types.ModuleName, newCoins) +} + +// set inflation params from the global param store +func (k Keeper) AddCollectedFees(ctx sdk.Context, coins sdk.Coins) sdk.Error { + return k.supplyKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleName, k.feeCollectorName, coins) +} + +// set the minter +func (k Keeper) SetMinter(ctx sdk.Context, minter types.Minter) { + store := ctx.KVStore(k.storeKey) + b := k.cdc.MustMarshalBinaryLengthPrefixed(minter) + store.Set(minterKey, b) +} + +// get inflation params from the global param store +func (k Keeper) GetParamSet(ctx sdk.Context) types.Params { + var params types.Params + k.paramSpace.GetParamSet(ctx, ¶ms) + return params +} + +// set inflation params from the global param store +func (k Keeper) SetParamSet(ctx sdk.Context, params types.Params) { + k.paramSpace.SetParamSet(ctx, ¶ms) +} diff --git a/modules/mint/internal/keeper/querier.go b/modules/mint/internal/keeper/querier.go new file mode 100644 index 000000000..40bf9082a --- /dev/null +++ b/modules/mint/internal/keeper/querier.go @@ -0,0 +1,33 @@ +package keeper + +import ( + "fmt" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/irisnet/irishub/modules/mint/internal/types" + abci "github.com/tendermint/tendermint/abci/types" +) + +// NewQuerier returns a minting Querier handler. +func NewQuerier(k Keeper) sdk.Querier { + return func(ctx sdk.Context, path []string, _ abci.RequestQuery) ([]byte, sdk.Error) { + switch path[0] { + case types.QueryParameters: + return queryParams(ctx, k) + default: + return nil, sdk.ErrUnknownRequest(fmt.Sprintf("unknown minting query endpoint: %s", path[0])) + } + } +} + +func queryParams(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) { + params := k.GetParamSet(ctx) + + res, err := codec.MarshalJSONIndent(k.cdc, params) + if err != nil { + return nil, sdk.ErrInternal(sdk.AppendMsgToErr("failed to marshal JSON", err.Error())) + } + + return res, nil +} diff --git a/modules/mint/internal/keeper/querier_test.go b/modules/mint/internal/keeper/querier_test.go new file mode 100644 index 000000000..4d10e92bf --- /dev/null +++ b/modules/mint/internal/keeper/querier_test.go @@ -0,0 +1,80 @@ +package keeper_test + +//import ( +// "testing" +// +// "github.com/stretchr/testify/require" +// +// sdk "github.com/cosmos/cosmos-sdk/types" +// keep "github.com/irisnet/irishub/modules/mint/internal/keeper" +// "github.com/irisnet/irishub/modules/mint/internal/types" +// +// abci "github.com/tendermint/tendermint/abci/types" +//) +// +//func TestNewQuerier(t *testing.T) { +// app, ctx := createTestApp(true) +// querier := keep.NewQuerier(app.MintKeeper) +// +// query := abci.RequestQuery{ +// Path: "", +// Data: []byte{}, +// } +// +// _, err := querier(ctx, []string{types.QueryParameters}, query) +// require.NoError(t, err) +// +// _, err = querier(ctx, []string{types.QueryInflation}, query) +// require.NoError(t, err) +// +// _, err = querier(ctx, []string{types.QueryAnnualProvisions}, query) +// require.NoError(t, err) +// +// _, err = querier(ctx, []string{"foo"}, query) +// require.Error(t, err) +//} +// +//func TestQueryParams(t *testing.T) { +// app, ctx := createTestApp(true) +// querier := keep.NewQuerier(app.MintKeeper) +// +// var params types.Params +// +// res, sdkErr := querier(ctx, []string{types.QueryParameters}, abci.RequestQuery{}) +// require.NoError(t, sdkErr) +// +// err := app.Codec().UnmarshalJSON(res, ¶ms) +// require.NoError(t, err) +// +// require.Equal(t, app.MintKeeper.GetParams(ctx), params) +//} +// +//func TestQueryInflation(t *testing.T) { +// app, ctx := createTestApp(true) +// querier := keep.NewQuerier(app.MintKeeper) +// +// var inflation sdk.Dec +// +// res, sdkErr := querier(ctx, []string{types.QueryInflation}, abci.RequestQuery{}) +// require.NoError(t, sdkErr) +// +// err := app.Codec().UnmarshalJSON(res, &inflation) +// require.NoError(t, err) +// +// require.Equal(t, app.MintKeeper.GetMinter(ctx).Inflation, inflation) +//} +// +//func TestQueryAnnualProvisions(t *testing.T) { +// app, ctx := createTestApp(true) +// querier := keep.NewQuerier(app.MintKeeper) +// +// var annualProvisions sdk.Dec +// +// res, sdkErr := querier(ctx, []string{types.QueryAnnualProvisions}, abci.RequestQuery{}) +// require.NoError(t, sdkErr) +// +// err := app.Codec().UnmarshalJSON(res, &annualProvisions) +// require.NoError(t, err) +// +// require.Equal(t, app.MintKeeper.GetMinter(ctx).AnnualProvisions, annualProvisions) +//} diff --git a/modules/mint/internal/types/codec.go b/modules/mint/internal/types/codec.go new file mode 100644 index 000000000..5640d4ad7 --- /dev/null +++ b/modules/mint/internal/types/codec.go @@ -0,0 +1,19 @@ +package types + +import ( + "github.com/cosmos/cosmos-sdk/codec" +) + +// generic sealed codec to be used throughout this module +var ModuleCdc *codec.Codec + +func init() { + ModuleCdc = codec.New() + RegisterCodec(ModuleCdc) + ModuleCdc.Seal() +} + +// Register concrete types on codec codec +func RegisterCodec(cdc *codec.Codec) { + cdc.RegisterConcrete(&Params{}, "irishub/mint/Params", nil) +} diff --git a/modules/mint/internal/types/errors.go b/modules/mint/internal/types/errors.go new file mode 100644 index 000000000..36e5e02dd --- /dev/null +++ b/modules/mint/internal/types/errors.go @@ -0,0 +1,8 @@ +package types + +import sdk "github.com/cosmos/cosmos-sdk/types" + +const ( + //mint + CodeInvalidMintInflation sdk.CodeType = 400 +) diff --git a/modules/mint/internal/types/events.go b/modules/mint/internal/types/events.go new file mode 100644 index 000000000..b94de37d1 --- /dev/null +++ b/modules/mint/internal/types/events.go @@ -0,0 +1,9 @@ +package types + +const ( + EventTypeMint = ModuleName + + AttributeKeyLastInflationTime = "last-inflation-time" + AttributeKeyInflationTime = "inflation-time" + AttributeKeyMintCoin = "mint-coin" +) diff --git a/modules/mint/internal/types/expected_keepers.go b/modules/mint/internal/types/expected_keepers.go new file mode 100644 index 000000000..d63dbba93 --- /dev/null +++ b/modules/mint/internal/types/expected_keepers.go @@ -0,0 +1,17 @@ +package types // noalias + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/supply/exported" +) + +// SupplyKeeper defines the expected supply keeper +type SupplyKeeper interface { + GetModuleAddress(name string) sdk.AccAddress + + SetModuleAccount(sdk.Context, exported.ModuleAccountI) + + SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) sdk.Error + SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, recipientModule string, amt sdk.Coins) sdk.Error + MintCoins(ctx sdk.Context, name string, amt sdk.Coins) sdk.Error +} diff --git a/modules/mint/internal/types/genesis.go b/modules/mint/internal/types/genesis.go new file mode 100644 index 000000000..b56c0f1a0 --- /dev/null +++ b/modules/mint/internal/types/genesis.go @@ -0,0 +1,37 @@ +package types + +// GenesisState - all distribution state that must be provided at genesis +type GenesisState struct { + Minter Minter `json:"minter"` // minter object + Params Params `json:"params"` // inflation params +} + +func NewGenesisState(minter Minter, params Params) GenesisState { + return GenesisState{ + Minter: minter, + Params: params, + } +} + +// get raw genesis raw message for testing +func DefaultGenesisState() GenesisState { + return GenesisState{ + Minter: InitialMinter(), + Params: DefaultParams(), + } +} + +// +// ValidateGenesis validates the provided staking genesis state to ensure the +// expected invariants holds. (i.e. params in correct bounds, no duplicate validators) +func ValidateGenesis(data GenesisState) error { + err := validateParams(data.Params) + if err != nil { + return err + } + err = validateMinter(data.Minter) + if err != nil { + return err + } + return nil +} diff --git a/modules/mint/internal/types/keys.go b/modules/mint/internal/types/keys.go new file mode 100644 index 000000000..49530fe8b --- /dev/null +++ b/modules/mint/internal/types/keys.go @@ -0,0 +1,23 @@ +package types + +// the one key to use for the keeper store +var MinterKey = []byte{0x00} + +// nolint +const ( + // module name + ModuleName = "mint" + + // default paramspace for params keeper + DefaultParamspace = ModuleName + + // StoreKey is the default store key for mint + StoreKey = ModuleName + + // QuerierRoute is the querier route for the minting store. + QuerierRoute = StoreKey + + // Query endpoints supported by the minting querier + QueryParameters = "parameters" + QueryInflation = "inflation" +) diff --git a/modules/mint/minter.go b/modules/mint/internal/types/minter.go similarity index 86% rename from modules/mint/minter.go rename to modules/mint/internal/types/minter.go index d9d893b77..d2bbe2d91 100644 --- a/modules/mint/minter.go +++ b/modules/mint/internal/types/minter.go @@ -1,17 +1,19 @@ -package mint +package types import ( "fmt" "time" - stakeTypes "github.com/irisnet/irishub/app/v1/stake/types" - sdk "github.com/irisnet/irishub/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/irisnet/irishub/config" ) const ( blocksPerYear = 60 * 60 * 8766 / 5 // 5 second a block, 8766 = 365.25 * 24 ) +var initialIssue = sdk.NewIntWithDecimal(20, 8) + // current inflation state type Minter struct { LastUpdate time.Time `json:"last_update"` // time which the last update was made to the minter @@ -32,8 +34,8 @@ func NewMinter(lastUpdate time.Time, mintDenom string, inflationBase sdk.Int) Mi func InitialMinter() Minter { return NewMinter( time.Unix(0, 0), - stakeTypes.StakeDenom, - sdk.InitialIssue.Mul(sdk.NewIntWithDecimal(1, 18)), // 2*(10^9)iris, 2*(10^9)*(10^18)iris-atto + config.StakeDenom, + initialIssue.Mul(sdk.NewIntWithDecimal(1, 18)), // 20*(10^8)iris, 20*(10^8)*(10^18)iris-atto ) } diff --git a/modules/mint/minter_test.go b/modules/mint/internal/types/minter_test.go similarity index 78% rename from modules/mint/minter_test.go rename to modules/mint/internal/types/minter_test.go index 8e6bb6edd..04a2de3dc 100644 --- a/modules/mint/minter_test.go +++ b/modules/mint/internal/types/minter_test.go @@ -1,16 +1,15 @@ -package mint +package types import ( "testing" "time" - stakeTypes "github.com/irisnet/irishub/app/v1/stake/types" - sdk "github.com/irisnet/irishub/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" ) func TestNextInflation(t *testing.T) { - minter := NewMinter(time.Now(), stakeTypes.StakeDenom, sdk.NewIntWithDecimal(100, 18)) + minter := NewMinter(time.Now(), "iris", sdk.NewIntWithDecimal(100, 18)) tests := []struct { params Params }{ diff --git a/modules/mint/internal/types/params.go b/modules/mint/internal/types/params.go new file mode 100644 index 000000000..5db49d699 --- /dev/null +++ b/modules/mint/internal/types/params.go @@ -0,0 +1,62 @@ +package types + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/params" +) + +var _ params.ParamSet = (*Params)(nil) + +// default paramspace for params keeper +const ( + DefaultParamSpace = "mint" +) + +//Parameter store key +var ( + // params store for inflation params + KeyInflation = []byte("Inflation") +) + +// ParamTable for mint module +func ParamKeyTable() params.KeyTable { + return params.NewKeyTable().RegisterParamSet(&Params{}) +} + +// mint parameters +type Params struct { + Inflation sdk.Dec `json:"inflation"` // inflation rate +} + +func (p *Params) ParamSetPairs() params.ParamSetPairs { + return params.ParamSetPairs{ + {KeyInflation, &p.Inflation}, + } +} + +func (p Params) String() string { + return fmt.Sprintf(`Mint Params: + mint/Inflation: %s`, + p.Inflation.String()) +} + +// Implements params.ParamStruct +func (p *Params) GetParamSpace() string { + return DefaultParamSpace +} + +// default minting module parameters +func DefaultParams() Params { + return Params{ + Inflation: sdk.NewDecWithPrec(4, 2), + } +} + +func validateParams(p Params) error { + if p.Inflation.GT(sdk.NewDecWithPrec(2, 1)) || p.Inflation.LT(sdk.ZeroDec()) { + return sdk.NewError(params.DefaultCodespace, CodeInvalidMintInflation, fmt.Sprintf("Mint Inflation [%s] should be between [0, 0.2] ", p.Inflation.String())) + } + return nil +} diff --git a/modules/mint/keeper.go b/modules/mint/keeper.go deleted file mode 100644 index a1be03ac0..000000000 --- a/modules/mint/keeper.go +++ /dev/null @@ -1,57 +0,0 @@ -package mint - -import ( - "github.com/irisnet/irishub/app/v1/bank" - "github.com/irisnet/irishub/app/v1/params" - "github.com/irisnet/irishub/codec" - sdk "github.com/irisnet/irishub/types" -) - -// keeper of the stake store -type Keeper struct { - storeKey sdk.StoreKey - cdc *codec.Codec - paramSpace params.Subspace - bk bank.Keeper - fk FeeKeeper -} - -func NewKeeper(cdc *codec.Codec, key sdk.StoreKey, - paramSpace params.Subspace, bk bank.Keeper, fk FeeKeeper) Keeper { - - keeper := Keeper{ - storeKey: key, - cdc: cdc, - paramSpace: paramSpace.WithTypeTable(ParamTypeTable()), - bk: bk, - fk: fk, - } - return keeper -} - -//____________________________________________________________________ -// Keys - -var ( - minterKey = []byte{0x00} // the one key to use for the keeper store -) - -//______________________________________________________________________ - -// get the minter -func (k Keeper) GetMinter(ctx sdk.Context) (minter Minter) { - store := ctx.KVStore(k.storeKey) - b := store.Get(minterKey) - if b == nil { - panic("Stored minter should not have been nil") - } - k.cdc.MustUnmarshalBinaryLengthPrefixed(b, &minter) - return -} - -// set the minter -func (k Keeper) SetMinter(ctx sdk.Context, minter Minter) { - store := ctx.KVStore(k.storeKey) - b := k.cdc.MustMarshalBinaryLengthPrefixed(minter) - store.Set(minterKey, b) -} diff --git a/modules/mint/module.go b/modules/mint/module.go new file mode 100644 index 000000000..a2bcfe9f6 --- /dev/null +++ b/modules/mint/module.go @@ -0,0 +1,159 @@ +package mint + +import ( + "encoding/json" + "math/rand" + + "github.com/cosmos/cosmos-sdk/client/context" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + sim "github.com/cosmos/cosmos-sdk/x/simulation" + "github.com/gorilla/mux" + "github.com/irisnet/irishub/modules/mint/client/cli" + "github.com/irisnet/irishub/modules/mint/client/rest" + "github.com/irisnet/irishub/modules/mint/simulation" + "github.com/spf13/cobra" + abci "github.com/tendermint/tendermint/abci/types" +) + +var ( + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModuleSimulation{} +) + +// AppModuleBasic defines the basic application module used by the mint module. +type AppModuleBasic struct{} + +var _ module.AppModuleBasic = AppModuleBasic{} + +// Name returns the mint module's name. +func (AppModuleBasic) Name() string { + return ModuleName +} + +// RegisterCodec registers the mint module's types for the given codec. +func (AppModuleBasic) RegisterCodec(cdc *codec.Codec) { + RegisterCodec(cdc) +} + +// DefaultGenesis returns default genesis state as raw bytes for the mint +// module. +func (AppModuleBasic) DefaultGenesis() json.RawMessage { + return ModuleCdc.MustMarshalJSON(DefaultGenesisState()) +} + +// ValidateGenesis performs genesis state validation for the mint module. +func (AppModuleBasic) ValidateGenesis(bz json.RawMessage) error { + var data GenesisState + err := ModuleCdc.UnmarshalJSON(bz, &data) + if err != nil { + return err + } + return ValidateGenesis(data) +} + +// RegisterRESTRoutes registers the REST routes for the mint module. +func (AppModuleBasic) RegisterRESTRoutes(ctx context.CLIContext, rtr *mux.Router) { + rest.RegisterRoutes(ctx, rtr) +} + +// GetTxCmd returns no root tx command for the mint module. +func (AppModuleBasic) GetTxCmd(_ *codec.Codec) *cobra.Command { return nil } + +// GetQueryCmd returns the root query command for the mint module. +func (AppModuleBasic) GetQueryCmd(cdc *codec.Codec) *cobra.Command { + return cli.GetQueryCmd(cdc) + +} + +//____________________________________________________________________________ + +// AppModuleSimulation defines the module simulation functions used by the mint module. +type AppModuleSimulation struct{} + +// RegisterStoreDecoder registers a decoder for mint module's types. +func (AppModuleSimulation) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { + sdr[StoreKey] = simulation.DecodeStore +} + +// GenerateGenesisState creates a randomized GenState of the mint module. +func (AppModuleSimulation) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// RandomizedParams creates randomized mint param changes for the simulator. +func (AppModuleSimulation) RandomizedParams(r *rand.Rand) []sim.ParamChange { + return simulation.ParamChanges(r) +} + +//____________________________________________________________________________ + +// AppModule implements an application module for the mint module. +type AppModule struct { + AppModuleBasic + AppModuleSimulation + + keeper Keeper +} + +// NewAppModule creates a new AppModule object +func NewAppModule(keeper Keeper) AppModule { + return AppModule{ + AppModuleBasic: AppModuleBasic{}, + AppModuleSimulation: AppModuleSimulation{}, + keeper: keeper, + } +} + +// Name returns the mint module's name. +func (AppModule) Name() string { + return ModuleName +} + +// RegisterInvariants registers the mint module invariants. +func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} + +// Route returns the message routing key for the mint module. +func (AppModule) Route() string { return "" } + +// NewHandler returns an sdk.Handler for the mint module. +func (am AppModule) NewHandler() sdk.Handler { return nil } + +// QuerierRoute returns the mint module's querier route name. +func (AppModule) QuerierRoute() string { + return QuerierRoute +} + +// NewQuerierHandler returns the mint module sdk.Querier. +func (am AppModule) NewQuerierHandler() sdk.Querier { + return NewQuerier(am.keeper) +} + +// InitGenesis performs genesis initialization for the mint module. It returns +// no validator updates. +func (am AppModule) InitGenesis(ctx sdk.Context, data json.RawMessage) []abci.ValidatorUpdate { + var genesisState GenesisState + ModuleCdc.MustUnmarshalJSON(data, &genesisState) + InitGenesis(ctx, am.keeper, genesisState) + return []abci.ValidatorUpdate{} +} + +// ExportGenesis returns the exported genesis state as raw bytes for the mint +// module. +func (am AppModule) ExportGenesis(ctx sdk.Context) json.RawMessage { + gs := ExportGenesis(ctx, am.keeper) + return ModuleCdc.MustMarshalJSON(gs) +} + +// BeginBlock returns the begin blocker for the mint module. +func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) { + BeginBlocker(ctx, am.keeper) +} + +// EndBlock returns the end blocker for the mint module. It returns no validator +// updates. +func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { + return []abci.ValidatorUpdate{} +} diff --git a/modules/mint/params.go b/modules/mint/params.go deleted file mode 100644 index b443bba3a..000000000 --- a/modules/mint/params.go +++ /dev/null @@ -1,107 +0,0 @@ -package mint - -import ( - "fmt" - - "github.com/irisnet/irishub/app/v1/params" - "github.com/irisnet/irishub/codec" - sdk "github.com/irisnet/irishub/types" -) - -var _ params.ParamSet = (*Params)(nil) - -// default paramspace for params keeper -const ( - DefaultParamSpace = "mint" -) - -//Parameter store key -var ( - // params store for inflation params - KeyInflation = []byte("Inflation") -) - -// ParamTable for mint module -func ParamTypeTable() params.TypeTable { - return params.NewTypeTable().RegisterParamSet(&Params{}) -} - -// mint parameters -type Params struct { - Inflation sdk.Dec `json:"inflation"` // inflation rate -} - -func (p Params) String() string { - return fmt.Sprintf(`Mint Params: - mint/Inflation: %s`, - p.Inflation.String()) -} - -// Implements params.ParamStruct -func (p *Params) GetParamSpace() string { - return DefaultParamSpace -} - -func (p *Params) KeyValuePairs() params.KeyValuePairs { - return params.KeyValuePairs{ - {KeyInflation, &p.Inflation}, - } -} - -func (p *Params) Validate(key string, value string) (interface{}, sdk.Error) { - switch key { - case string(KeyInflation): - inflation, err := sdk.NewDecFromStr(value) - if err != nil { - return nil, params.ErrInvalidString(value) - } - if inflation.GT(sdk.NewDecWithPrec(2, 1)) || inflation.LT(sdk.NewDecWithPrec(0, 0)) { - return nil, sdk.NewError(params.DefaultCodespace, params.CodeInvalidMintInflation, fmt.Sprintf("Mint Inflation [%s] should be between [0, 0.2] ", value)) - } - return inflation, nil - default: - return nil, sdk.NewError(params.DefaultCodespace, params.CodeInvalidKey, fmt.Sprintf("%s is not found", key)) - } -} - -func (p *Params) StringFromBytes(cdc *codec.Codec, key string, bytes []byte) (string, error) { - switch key { - case string(KeyInflation): - err := cdc.UnmarshalJSON(bytes, &p.Inflation) - return p.Inflation.String(), err - default: - return "", fmt.Errorf("%s is not existed", key) - } -} - -func (p *Params) ReadOnly() bool { - return false -} - -// default minting module parameters -func DefaultParams() Params { - return Params{ - Inflation: sdk.NewDecWithPrec(4, 2), - } -} - -func validateParams(p Params) error { - if p.Inflation.GT(sdk.NewDecWithPrec(2, 1)) || p.Inflation.LT(sdk.ZeroDec()) { - return sdk.NewError(params.DefaultCodespace, params.CodeInvalidMintInflation, fmt.Sprintf("Mint Inflation [%s] should be between [0, 0.2] ", p.Inflation.String())) - } - return nil -} - -//______________________________________________________________________ - -// get inflation params from the global param store -func (k Keeper) GetParamSet(ctx sdk.Context) Params { - var params Params - k.paramSpace.GetParamSet(ctx, ¶ms) - return params -} - -// set inflation params from the global param store -func (k Keeper) SetParamSet(ctx sdk.Context, params Params) { - k.paramSpace.SetParamSet(ctx, ¶ms) -} diff --git a/modules/mint/simulation/decoder.go b/modules/mint/simulation/decoder.go new file mode 100644 index 000000000..4582dd5e1 --- /dev/null +++ b/modules/mint/simulation/decoder.go @@ -0,0 +1,24 @@ +package simulation + +import ( + "bytes" + "fmt" + + cmn "github.com/tendermint/tendermint/libs/common" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/irisnet/irishub/modules/mint/internal/types" +) + +// DecodeStore unmarshals the KVPair's Value to the corresponding mint type +func DecodeStore(cdc *codec.Codec, kvA, kvB cmn.KVPair) string { + switch { + case bytes.Equal(kvA.Key, types.MinterKey): + var minterA, minterB types.Minter + cdc.MustUnmarshalBinaryLengthPrefixed(kvA.Value, &minterA) + cdc.MustUnmarshalBinaryLengthPrefixed(kvB.Value, &minterB) + return fmt.Sprintf("%v\n%v", minterA, minterB) + default: + panic(fmt.Sprintf("invalid mint key %X", kvA.Key)) + } +} diff --git a/modules/mint/simulation/decoder_test.go b/modules/mint/simulation/decoder_test.go new file mode 100644 index 000000000..b153b58a9 --- /dev/null +++ b/modules/mint/simulation/decoder_test.go @@ -0,0 +1,50 @@ +package simulation + +import ( + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/require" + + cmn "github.com/tendermint/tendermint/libs/common" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/irisnet/irishub/modules/mint/internal/types" +) + +func makeTestCodec() (cdc *codec.Codec) { + cdc = codec.New() + sdk.RegisterCodec(cdc) + return +} + +func TestDecodeStore(t *testing.T) { + cdc := makeTestCodec() + minter := types.NewMinter(time.Now().UTC(), "iris", sdk.NewIntWithDecimal(2, 9)) + + kvPairs := cmn.KVPairs{ + cmn.KVPair{Key: types.MinterKey, Value: cdc.MustMarshalBinaryLengthPrefixed(minter)}, + cmn.KVPair{Key: []byte{0x99}, Value: []byte{0x99}}, + } + tests := []struct { + name string + expectedLog string + }{ + {"Minter", fmt.Sprintf("%v\n%v", minter, minter)}, + {"other", ""}, + } + + for i, tt := range tests { + i, tt := i, tt + t.Run(tt.name, func(t *testing.T) { + switch i { + case len(tests) - 1: + require.Panics(t, func() { DecodeStore(cdc, kvPairs[i], kvPairs[i]) }, tt.name) + default: + require.Equal(t, tt.expectedLog, DecodeStore(cdc, kvPairs[i], kvPairs[i]), tt.name) + } + }) + } +} diff --git a/modules/mint/simulation/genesis.go b/modules/mint/simulation/genesis.go new file mode 100644 index 000000000..b24775be5 --- /dev/null +++ b/modules/mint/simulation/genesis.go @@ -0,0 +1,40 @@ +package simulation + +// DONTCOVER + +import ( + "fmt" + "math/rand" + + "github.com/cosmos/cosmos-sdk/codec" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/irisnet/irishub/modules/mint/internal/types" +) + +// Simulation parameter constants +const ( + Inflation = "inflation" +) + +// GenInflation randomized Inflation +func GenInflation(r *rand.Rand) sdk.Dec { + return sdk.NewDecWithPrec(int64(r.Intn(99)), 2) +} + +// RandomizedGenState generates a random GenesisState for mint +func RandomizedGenState(simState *module.SimulationState) { + // minter + var inflation sdk.Dec + simState.AppParams.GetOrGenerate( + simState.Cdc, Inflation, &inflation, simState.Rand, + func(r *rand.Rand) { inflation = GenInflation(r) }, + ) + + params := types.Params{Inflation: inflation} + mintGenesis := types.NewGenesisState(types.InitialMinter(), params) + + fmt.Printf("Selected randomly generated minting parameters:\n%s\n", codec.MustMarshalJSONIndent(simState.Cdc, mintGenesis)) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(mintGenesis) +} diff --git a/modules/mint/simulation/params.go b/modules/mint/simulation/params.go new file mode 100644 index 000000000..7e6b444eb --- /dev/null +++ b/modules/mint/simulation/params.go @@ -0,0 +1,23 @@ +package simulation + +// DONTCOVER + +import ( + "fmt" + "math/rand" + + "github.com/cosmos/cosmos-sdk/x/simulation" + "github.com/irisnet/irishub/modules/mint/internal/types" +) + +// ParamChanges defines the parameters that can be modified by param change proposals +// on the simulation +func ParamChanges(r *rand.Rand) []simulation.ParamChange { + return []simulation.ParamChange{ + simulation.NewSimParamChange(types.ModuleName, string(types.KeyInflation), "", + func(r *rand.Rand) string { + return fmt.Sprintf("\"%s\"", GenInflation(r)) + }, + ), + } +} diff --git a/modules/mint/tags/tags.go b/modules/mint/tags/tags.go deleted file mode 100644 index 67b1408ae..000000000 --- a/modules/mint/tags/tags.go +++ /dev/null @@ -1,8 +0,0 @@ -// nolint -package tags - -var ( - LastInflationTime = "last-inflation-time" - InflationTime = "inflation-time" - MintCoin = "mint-coin" -) diff --git a/modules/mint/wire.go b/modules/mint/wire.go deleted file mode 100644 index 409e06525..000000000 --- a/modules/mint/wire.go +++ /dev/null @@ -1,18 +0,0 @@ -package mint - -import ( - "github.com/irisnet/irishub/codec" -) - -// Register concrete types on codec codec -func RegisterCodec(cdc *codec.Codec) { - // Not Register mint codec in app, deprecated now - //cdc.RegisterConcrete(Minter{}, "irishub/mint/Minter", nil) - cdc.RegisterConcrete(&Params{}, "irishub/mint/Params", nil) -} - -var msgCdc = codec.New() - -func init() { - RegisterCodec(msgCdc) -} From e56e24f10594a8eac4074e50496b2559a231c872 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Thu, 28 Nov 2019 13:51:42 +0800 Subject: [PATCH 02/17] move mintDenom field of Minter to params --- modules/mint/abci.go | 7 +++---- modules/mint/internal/types/errors.go | 1 + modules/mint/internal/types/minter.go | 16 +++++----------- modules/mint/internal/types/minter_test.go | 14 +++++--------- modules/mint/internal/types/params.go | 16 +++++++++++++--- modules/mint/simulation/genesis.go | 3 ++- 6 files changed, 29 insertions(+), 28 deletions(-) diff --git a/modules/mint/abci.go b/modules/mint/abci.go index 07e555b0c..e68bd28a5 100644 --- a/modules/mint/abci.go +++ b/modules/mint/abci.go @@ -20,10 +20,9 @@ func BeginBlocker(ctx sdk.Context, k Keeper) { // Calculate block mint amount params := k.GetParamSet(ctx) - logger.Info("Mint parameters", "inflation_rate", params.Inflation.String()) - annualProvisions := minter.NextAnnualProvisions(params) - logger.Info("Calculate annual provisions", "annual_provisions", annualProvisions.String()) - mintedCoin := minter.BlockProvision(annualProvisions) + logger.Info("Mint parameters", "inflation_rate", params.Inflation.String(), "mint_denom", params.MintDenom) + + mintedCoin := minter.BlockProvision(params) logger.Info("Mint result", "block_provisions", mintedCoin.String(), "time", blockTime.String()) mintedCoins := sdk.NewCoins(mintedCoin) diff --git a/modules/mint/internal/types/errors.go b/modules/mint/internal/types/errors.go index 36e5e02dd..24c39c89a 100644 --- a/modules/mint/internal/types/errors.go +++ b/modules/mint/internal/types/errors.go @@ -5,4 +5,5 @@ import sdk "github.com/cosmos/cosmos-sdk/types" const ( //mint CodeInvalidMintInflation sdk.CodeType = 400 + CodeInvalidMintDenom sdk.CodeType = 401 ) diff --git a/modules/mint/internal/types/minter.go b/modules/mint/internal/types/minter.go index d2bbe2d91..91eb16854 100644 --- a/modules/mint/internal/types/minter.go +++ b/modules/mint/internal/types/minter.go @@ -5,7 +5,6 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/irisnet/irishub/config" ) const ( @@ -17,15 +16,13 @@ var initialIssue = sdk.NewIntWithDecimal(20, 8) // current inflation state type Minter struct { LastUpdate time.Time `json:"last_update"` // time which the last update was made to the minter - MintDenom string `json:"mint_denom"` // type of coin to mint InflationBase sdk.Int `json:"inflation_basement"` } // Create a new minter object -func NewMinter(lastUpdate time.Time, mintDenom string, inflationBase sdk.Int) Minter { +func NewMinter(lastUpdate time.Time, inflationBase sdk.Int) Minter { return Minter{ LastUpdate: lastUpdate, - MintDenom: mintDenom, InflationBase: inflationBase, } } @@ -34,7 +31,6 @@ func NewMinter(lastUpdate time.Time, mintDenom string, inflationBase sdk.Int) Mi func InitialMinter() Minter { return NewMinter( time.Unix(0, 0), - config.StakeDenom, initialIssue.Mul(sdk.NewIntWithDecimal(1, 18)), // 20*(10^8)iris, 20*(10^8)*(10^18)iris-atto ) } @@ -43,9 +39,6 @@ func validateMinter(minter Minter) error { if minter.LastUpdate.Before(time.Unix(0, 0)) { return fmt.Errorf("minter last update time(%s) should not be a time before January 1, 1970 UTC", minter.LastUpdate.String()) } - if len(minter.MintDenom) == 0 { - return fmt.Errorf("minter token denom should not be empty") - } if !minter.InflationBase.GT(sdk.ZeroInt()) { return fmt.Errorf("minter inflation basement (%s) should be positive", minter.InflationBase.String()) } @@ -58,7 +51,8 @@ func (m Minter) NextAnnualProvisions(params Params) (provisions sdk.Dec) { } // get the provisions for a block based on the annual provisions rate -func (m Minter) BlockProvision(annualProvisions sdk.Dec) sdk.Coin { - blockInflationAmount := annualProvisions.QuoInt(sdk.NewInt(blocksPerYear)) - return sdk.NewCoin(m.MintDenom, blockInflationAmount.TruncateInt()) +func (m Minter) BlockProvision(params Params) sdk.Coin { + provisions := m.NextAnnualProvisions(params) + blockInflationAmount := provisions.QuoInt(sdk.NewInt(blocksPerYear)) + return sdk.NewCoin(params.MintDenom, blockInflationAmount.TruncateInt()) } diff --git a/modules/mint/internal/types/minter_test.go b/modules/mint/internal/types/minter_test.go index 04a2de3dc..6a1e325f2 100644 --- a/modules/mint/internal/types/minter_test.go +++ b/modules/mint/internal/types/minter_test.go @@ -9,21 +9,17 @@ import ( ) func TestNextInflation(t *testing.T) { - minter := NewMinter(time.Now(), "iris", sdk.NewIntWithDecimal(100, 18)) + minter := NewMinter(time.Now(), sdk.NewIntWithDecimal(100, 18)) tests := []struct { params Params }{ - {DefaultParams()}, - {DefaultParams()}, - {DefaultParams()}, - {DefaultParams()}, - {Params{sdk.NewDecWithPrec(20, 2)}}, - {Params{sdk.NewDecWithPrec(10, 2)}}, - {Params{sdk.NewDecWithPrec(5, 2)}}, + {Params{Inflation: sdk.NewDecWithPrec(20, 2), MintDenom: "iris"}}, + {Params{Inflation: sdk.NewDecWithPrec(10, 2), MintDenom: "iris"}}, + {Params{Inflation: sdk.NewDecWithPrec(5, 2), MintDenom: "iris"}}, } for _, tc := range tests { annualProvisions := minter.NextAnnualProvisions(tc.params) - mintCoin := minter.BlockProvision(annualProvisions) + mintCoin := minter.BlockProvision(tc.params) blockProvision := annualProvisions.QuoInt(sdk.NewInt(12 * 60 * 8766)) diff --git a/modules/mint/internal/types/params.go b/modules/mint/internal/types/params.go index 5db49d699..5e57b0451 100644 --- a/modules/mint/internal/types/params.go +++ b/modules/mint/internal/types/params.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/params" + "github.com/irisnet/irishub/config" ) var _ params.ParamSet = (*Params)(nil) @@ -18,6 +19,7 @@ const ( var ( // params store for inflation params KeyInflation = []byte("Inflation") + KeyMintDenom = []byte("MintDenom") ) // ParamTable for mint module @@ -27,19 +29,22 @@ func ParamKeyTable() params.KeyTable { // mint parameters type Params struct { - Inflation sdk.Dec `json:"inflation"` // inflation rate + Inflation sdk.Dec `json:"inflation"` // inflation rate + MintDenom string `json:"mint_denom"` // type of coin to mint } func (p *Params) ParamSetPairs() params.ParamSetPairs { return params.ParamSetPairs{ {KeyInflation, &p.Inflation}, + {KeyMintDenom, &p.MintDenom}, } } func (p Params) String() string { return fmt.Sprintf(`Mint Params: - mint/Inflation: %s`, - p.Inflation.String()) + mint/Inflation: %s, + mint/MintDenom: %s`, + p.Inflation.String(), p.MintDenom) } // Implements params.ParamStruct @@ -51,6 +56,7 @@ func (p *Params) GetParamSpace() string { func DefaultParams() Params { return Params{ Inflation: sdk.NewDecWithPrec(4, 2), + MintDenom: config.StakeDenom, } } @@ -58,5 +64,9 @@ func validateParams(p Params) error { if p.Inflation.GT(sdk.NewDecWithPrec(2, 1)) || p.Inflation.LT(sdk.ZeroDec()) { return sdk.NewError(params.DefaultCodespace, CodeInvalidMintInflation, fmt.Sprintf("Mint Inflation [%s] should be between [0, 0.2] ", p.Inflation.String())) } + + if len(p.MintDenom) == 0 { + return sdk.NewError(params.DefaultCodespace, CodeInvalidMintDenom, fmt.Sprintf("Mint MintDenom [%s] should not be empty", p.MintDenom)) + } return nil } diff --git a/modules/mint/simulation/genesis.go b/modules/mint/simulation/genesis.go index b24775be5..707c4590c 100644 --- a/modules/mint/simulation/genesis.go +++ b/modules/mint/simulation/genesis.go @@ -4,6 +4,7 @@ package simulation import ( "fmt" + "github.com/irisnet/irishub/config" "math/rand" "github.com/cosmos/cosmos-sdk/codec" @@ -32,7 +33,7 @@ func RandomizedGenState(simState *module.SimulationState) { func(r *rand.Rand) { inflation = GenInflation(r) }, ) - params := types.Params{Inflation: inflation} + params := types.Params{Inflation: inflation, MintDenom: config.StakeDenom} mintGenesis := types.NewGenesisState(types.InitialMinter(), params) fmt.Printf("Selected randomly generated minting parameters:\n%s\n", codec.MustMarshalJSONIndent(simState.Cdc, mintGenesis)) From 3ed8c9feaf477e06de438813eeceb099c0d71cf4 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Thu, 28 Nov 2019 13:55:26 +0800 Subject: [PATCH 03/17] apply comment from github --- modules/mint/abci.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mint/abci.go b/modules/mint/abci.go index e68bd28a5..3b1e8f95c 100644 --- a/modules/mint/abci.go +++ b/modules/mint/abci.go @@ -12,7 +12,7 @@ func BeginBlocker(ctx sdk.Context, k Keeper) { // Get block BFT time and block height blockTime := ctx.BlockHeader().Time minter := k.GetMinter(ctx) - if ctx.BlockHeader().Height <= 1 { // don't inflate token in the first block + if ctx.BlockHeight() <= 1 { // don't inflate token in the first block minter.LastUpdate = blockTime k.SetMinter(ctx, minter) return From 2a3912b46ff1b6d9020bcdebb35100ad58e8dac4 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Thu, 28 Nov 2019 17:31:20 +0800 Subject: [PATCH 04/17] remove unless bankKeeper --- app/app.go | 2 +- modules/mint/internal/keeper/keeper.go | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/app.go b/app/app.go index ba2686fd7..72fc5753a 100644 --- a/app/app.go +++ b/app/app.go @@ -156,7 +156,7 @@ func NewIrisApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest b stakingKeeper := staking.NewKeeper( app.cdc, keys[staking.StoreKey], app.supplyKeeper, stakingSubspace, staking.DefaultCodespace, ) - app.mintKeeper = mint.NewKeeper(app.cdc, keys[mint.StoreKey], mintSubspace, app.bankKeeper, app.supplyKeeper, auth.FeeCollectorName) + app.mintKeeper = mint.NewKeeper(app.cdc, keys[mint.StoreKey], mintSubspace, app.supplyKeeper, auth.FeeCollectorName) app.distrKeeper = distr.NewKeeper(app.cdc, keys[distr.StoreKey], distrSubspace, &stakingKeeper, app.supplyKeeper, distr.DefaultCodespace, auth.FeeCollectorName, app.ModuleAccountAddrs()) app.slashingKeeper = slashing.NewKeeper( diff --git a/modules/mint/internal/keeper/keeper.go b/modules/mint/internal/keeper/keeper.go index 56a29d638..448450572 100644 --- a/modules/mint/internal/keeper/keeper.go +++ b/modules/mint/internal/keeper/keeper.go @@ -3,7 +3,6 @@ package keeper import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/params" "github.com/irisnet/irishub/modules/mint/internal/types" ) @@ -13,19 +12,17 @@ type Keeper struct { storeKey sdk.StoreKey cdc *codec.Codec paramSpace params.Subspace - bk bank.Keeper supplyKeeper types.SupplyKeeper feeCollectorName string } func NewKeeper(cdc *codec.Codec, key sdk.StoreKey, - paramSpace params.Subspace, bk bank.Keeper, supplyKeeper types.SupplyKeeper, feeCollectorName string) Keeper { + paramSpace params.Subspace, supplyKeeper types.SupplyKeeper, feeCollectorName string) Keeper { keeper := Keeper{ storeKey: key, cdc: cdc, paramSpace: paramSpace.WithKeyTable(types.ParamKeyTable()), - bk: bk, supplyKeeper: supplyKeeper, feeCollectorName: feeCollectorName, } From 74376f47e1ace7a37cf995079e4d602db10278a2 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Thu, 28 Nov 2019 18:01:39 +0800 Subject: [PATCH 05/17] repair test error --- modules/mint/simulation/decoder_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mint/simulation/decoder_test.go b/modules/mint/simulation/decoder_test.go index b153b58a9..63e58fd23 100644 --- a/modules/mint/simulation/decoder_test.go +++ b/modules/mint/simulation/decoder_test.go @@ -22,7 +22,7 @@ func makeTestCodec() (cdc *codec.Codec) { func TestDecodeStore(t *testing.T) { cdc := makeTestCodec() - minter := types.NewMinter(time.Now().UTC(), "iris", sdk.NewIntWithDecimal(2, 9)) + minter := types.NewMinter(time.Now().UTC(), sdk.NewIntWithDecimal(2, 9)) kvPairs := cmn.KVPairs{ cmn.KVPair{Key: types.MinterKey, Value: cdc.MustMarshalBinaryLengthPrefixed(minter)}, From ea5cb835c3c82993721fa236bf9bc72c6ce18f0a Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Fri, 29 Nov 2019 17:30:55 +0800 Subject: [PATCH 06/17] add unit test --- modules/mint/abci_test.go | 41 +++++++ .../mint/internal/keeper/integration_test.go | 20 +++ modules/mint/internal/keeper/keeper.go | 11 +- modules/mint/internal/keeper/keeper_test.go | 67 ++++++++++ modules/mint/internal/keeper/querier_test.go | 116 ++++++------------ simapp/app.go | 7 +- 6 files changed, 170 insertions(+), 92 deletions(-) create mode 100644 modules/mint/abci_test.go create mode 100644 modules/mint/internal/keeper/integration_test.go create mode 100644 modules/mint/internal/keeper/keeper_test.go diff --git a/modules/mint/abci_test.go b/modules/mint/abci_test.go new file mode 100644 index 000000000..f44bcaf71 --- /dev/null +++ b/modules/mint/abci_test.go @@ -0,0 +1,41 @@ +package mint_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/distribution" + "github.com/cosmos/cosmos-sdk/x/supply" + "github.com/irisnet/irishub/modules/mint" + "github.com/irisnet/irishub/modules/mint/internal/types" + "github.com/irisnet/irishub/simapp" + "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" +) + +func TestBeginBlocker(t *testing.T) { + app, ctx := createTestApp(true) + + mint.BeginBlocker(ctx, app.MintKeeper) + minter := app.MintKeeper.GetMinter(ctx) + param := app.MintKeeper.GetParamSet(ctx) + mintCoins := minter.BlockProvision(param) + + acc1 := app.SupplyKeeper.GetModuleAccount(ctx, "fee_collector") + require.Equal(t, acc1.GetCoins(), sdk.NewCoins(mintCoins)) +} + +// returns context and an app with updated mint keeper +func createTestApp(isCheckTx bool) (*simapp.SimApp, sdk.Context) { + app := simapp.Setup(isCheckTx) + + ctx := app.BaseApp.NewContext(isCheckTx, abci.Header{Height: 2}) + app.MintKeeper.SetParamSet(ctx, types.Params{ + Inflation: sdk.NewDecWithPrec(4, 2), + MintDenom: "iris", + }) + app.MintKeeper.SetMinter(ctx, types.InitialMinter()) + app.SupplyKeeper.SetSupply(ctx, supply.Supply{}) + app.DistrKeeper.SetFeePool(ctx, distribution.InitialFeePool()) + return app, ctx +} diff --git a/modules/mint/internal/keeper/integration_test.go b/modules/mint/internal/keeper/integration_test.go new file mode 100644 index 000000000..6a156831d --- /dev/null +++ b/modules/mint/internal/keeper/integration_test.go @@ -0,0 +1,20 @@ +package keeper_test + +import ( + abci "github.com/tendermint/tendermint/abci/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/irisnet/irishub/modules/mint/internal/types" + "github.com/irisnet/irishub/simapp" +) + +// returns context and an app with updated mint keeper +func createTestApp(isCheckTx bool) (*simapp.SimApp, sdk.Context) { + app := simapp.Setup(isCheckTx) + + ctx := app.BaseApp.NewContext(isCheckTx, abci.Header{}) + app.MintKeeper.SetParamSet(ctx, types.DefaultParams()) + app.MintKeeper.SetMinter(ctx, types.InitialMinter()) + + return app, ctx +} diff --git a/modules/mint/internal/keeper/keeper.go b/modules/mint/internal/keeper/keeper.go index 448450572..2ce882c4f 100644 --- a/modules/mint/internal/keeper/keeper.go +++ b/modules/mint/internal/keeper/keeper.go @@ -29,19 +29,12 @@ func NewKeeper(cdc *codec.Codec, key sdk.StoreKey, return keeper } -//____________________________________________________________________ -// Keys - -var ( - minterKey = []byte{0x00} // the one key to use for the keeper store -) - //______________________________________________________________________ // get the minter func (k Keeper) GetMinter(ctx sdk.Context) (minter types.Minter) { store := ctx.KVStore(k.storeKey) - b := store.Get(minterKey) + b := store.Get(types.MinterKey) if b == nil { panic("Stored minter should not have been nil") } @@ -68,7 +61,7 @@ func (k Keeper) AddCollectedFees(ctx sdk.Context, coins sdk.Coins) sdk.Error { func (k Keeper) SetMinter(ctx sdk.Context, minter types.Minter) { store := ctx.KVStore(k.storeKey) b := k.cdc.MustMarshalBinaryLengthPrefixed(minter) - store.Set(minterKey, b) + store.Set(types.MinterKey, b) } // get inflation params from the global param store diff --git a/modules/mint/internal/keeper/keeper_test.go b/modules/mint/internal/keeper/keeper_test.go new file mode 100644 index 000000000..6985b3478 --- /dev/null +++ b/modules/mint/internal/keeper/keeper_test.go @@ -0,0 +1,67 @@ +package keeper_test + +import ( + "testing" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/supply" + "github.com/irisnet/irishub/modules/mint/internal/types" + "github.com/stretchr/testify/require" +) + +func TestSetGetMinter(t *testing.T) { + app, ctx := createTestApp(true) + + minter := types.NewMinter(time.Now().UTC(), sdk.NewInt(100000)) + app.MintKeeper.SetMinter(ctx, minter) + expMinter := app.MintKeeper.GetMinter(ctx) + + require.Equal(t, minter, expMinter) +} + +func TestSetGetParamSet(t *testing.T) { + app, ctx := createTestApp(true) + + app.MintKeeper.SetParamSet(ctx, types.DefaultParams()) + expParamSet := app.MintKeeper.GetParamSet(ctx) + + require.Equal(t, types.DefaultParams(), expParamSet) +} + +func TestMintCoins(t *testing.T) { + app, ctx := createTestApp(true) + + app.SupplyKeeper.SetSupply(ctx, supply.Supply{}) + + mintCoins := sdk.NewCoins(sdk.NewCoin("iris", sdk.NewInt(1000))) + err := app.MintKeeper.MintCoins(ctx, mintCoins) + require.NoError(t, err) + + acc := app.SupplyKeeper.GetModuleAccount(ctx, types.ModuleName) + require.Equal(t, acc.GetCoins(), mintCoins) +} + +func TestAddCollectedFees(t *testing.T) { + app, ctx := createTestApp(true) + + app.SupplyKeeper.SetSupply(ctx, supply.Supply{}) + + mintCoins := sdk.NewCoins(sdk.NewCoin("iris", sdk.NewInt(1000))) + + err := app.MintKeeper.MintCoins(ctx, mintCoins) + require.NoError(t, err) + + acc := app.SupplyKeeper.GetModuleAccount(ctx, types.ModuleName) + require.Equal(t, acc.GetCoins(), mintCoins) + + err = app.MintKeeper.AddCollectedFees(ctx, mintCoins) + require.NoError(t, err) + + acc = app.SupplyKeeper.GetModuleAccount(ctx, types.ModuleName) + require.True(t, acc.GetCoins().Empty()) + + acc1 := app.SupplyKeeper.GetModuleAccount(ctx, "fee_collector") + require.Equal(t, acc1.GetCoins(), mintCoins) + +} diff --git a/modules/mint/internal/keeper/querier_test.go b/modules/mint/internal/keeper/querier_test.go index 4d10e92bf..e00a9c9d4 100644 --- a/modules/mint/internal/keeper/querier_test.go +++ b/modules/mint/internal/keeper/querier_test.go @@ -1,80 +1,40 @@ package keeper_test -//import ( -// "testing" -// -// "github.com/stretchr/testify/require" -// -// sdk "github.com/cosmos/cosmos-sdk/types" -// keep "github.com/irisnet/irishub/modules/mint/internal/keeper" -// "github.com/irisnet/irishub/modules/mint/internal/types" -// -// abci "github.com/tendermint/tendermint/abci/types" -//) -// -//func TestNewQuerier(t *testing.T) { -// app, ctx := createTestApp(true) -// querier := keep.NewQuerier(app.MintKeeper) -// -// query := abci.RequestQuery{ -// Path: "", -// Data: []byte{}, -// } -// -// _, err := querier(ctx, []string{types.QueryParameters}, query) -// require.NoError(t, err) -// -// _, err = querier(ctx, []string{types.QueryInflation}, query) -// require.NoError(t, err) -// -// _, err = querier(ctx, []string{types.QueryAnnualProvisions}, query) -// require.NoError(t, err) -// -// _, err = querier(ctx, []string{"foo"}, query) -// require.Error(t, err) -//} -// -//func TestQueryParams(t *testing.T) { -// app, ctx := createTestApp(true) -// querier := keep.NewQuerier(app.MintKeeper) -// -// var params types.Params -// -// res, sdkErr := querier(ctx, []string{types.QueryParameters}, abci.RequestQuery{}) -// require.NoError(t, sdkErr) -// -// err := app.Codec().UnmarshalJSON(res, ¶ms) -// require.NoError(t, err) -// -// require.Equal(t, app.MintKeeper.GetParams(ctx), params) -//} -// -//func TestQueryInflation(t *testing.T) { -// app, ctx := createTestApp(true) -// querier := keep.NewQuerier(app.MintKeeper) -// -// var inflation sdk.Dec -// -// res, sdkErr := querier(ctx, []string{types.QueryInflation}, abci.RequestQuery{}) -// require.NoError(t, sdkErr) -// -// err := app.Codec().UnmarshalJSON(res, &inflation) -// require.NoError(t, err) -// -// require.Equal(t, app.MintKeeper.GetMinter(ctx).Inflation, inflation) -//} -// -//func TestQueryAnnualProvisions(t *testing.T) { -// app, ctx := createTestApp(true) -// querier := keep.NewQuerier(app.MintKeeper) -// -// var annualProvisions sdk.Dec -// -// res, sdkErr := querier(ctx, []string{types.QueryAnnualProvisions}, abci.RequestQuery{}) -// require.NoError(t, sdkErr) -// -// err := app.Codec().UnmarshalJSON(res, &annualProvisions) -// require.NoError(t, err) -// -// require.Equal(t, app.MintKeeper.GetMinter(ctx).AnnualProvisions, annualProvisions) -//} +import ( + "testing" + + "github.com/stretchr/testify/require" + + keep "github.com/irisnet/irishub/modules/mint/internal/keeper" + "github.com/irisnet/irishub/modules/mint/internal/types" + + abci "github.com/tendermint/tendermint/abci/types" +) + +func TestNewQuerier(t *testing.T) { + app, ctx := createTestApp(true) + querier := keep.NewQuerier(app.MintKeeper) + + query := abci.RequestQuery{ + Path: "", + Data: []byte{}, + } + + _, err := querier(ctx, []string{types.QueryParameters}, query) + require.NoError(t, err) +} + +func TestQueryParams(t *testing.T) { + app, ctx := createTestApp(true) + querier := keep.NewQuerier(app.MintKeeper) + + var params types.Params + + res, sdkErr := querier(ctx, []string{types.QueryParameters}, abci.RequestQuery{}) + require.NoError(t, sdkErr) + + err := app.Codec().UnmarshalJSON(res, ¶ms) + require.NoError(t, err) + + require.Equal(t, app.MintKeeper.GetParamSet(ctx), params) +} diff --git a/simapp/app.go b/simapp/app.go index 8f679bd4f..d98d2f589 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -1,6 +1,7 @@ package simapp import ( + "github.com/irisnet/irishub/modules/mint" "io" "os" @@ -23,7 +24,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/evidence" "github.com/cosmos/cosmos-sdk/x/genutil" "github.com/cosmos/cosmos-sdk/x/gov" - "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/params" paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" "github.com/cosmos/cosmos-sdk/x/slashing" @@ -169,10 +169,7 @@ func NewSimApp( stakingKeeper := staking.NewKeeper( app.cdc, keys[staking.StoreKey], app.SupplyKeeper, app.subspaces[staking.ModuleName], staking.DefaultCodespace) - app.MintKeeper = mint.NewKeeper( - app.cdc, keys[mint.StoreKey], app.subspaces[mint.ModuleName], &stakingKeeper, - app.SupplyKeeper, auth.FeeCollectorName, - ) + app.MintKeeper = mint.NewKeeper(app.cdc, keys[mint.StoreKey], app.subspaces[mint.ModuleName], app.SupplyKeeper, auth.FeeCollectorName) app.DistrKeeper = distr.NewKeeper( app.cdc, keys[distr.StoreKey], app.subspaces[distr.ModuleName], &stakingKeeper, app.SupplyKeeper, distr.DefaultCodespace, auth.FeeCollectorName, app.ModuleAccountAddrs(), From 6806e698490e85c400901551a4612b98e5898610 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Mon, 2 Dec 2019 14:54:49 +0800 Subject: [PATCH 07/17] apply comment from github --- config/config.go | 5 ++--- modules/mint/abci_test.go | 2 +- modules/mint/internal/keeper/integration_test.go | 2 +- modules/mint/internal/keeper/keeper.go | 10 +++++----- modules/mint/internal/types/events.go | 6 +++--- modules/mint/internal/types/genesis.go | 2 +- modules/mint/internal/types/minter.go | 2 +- modules/mint/internal/types/params.go | 4 ++-- modules/mint/simulation/genesis.go | 5 ++--- 9 files changed, 18 insertions(+), 20 deletions(-) diff --git a/config/config.go b/config/config.go index 89cfcfa60..0cb46bf47 100644 --- a/config/config.go +++ b/config/config.go @@ -1,9 +1,8 @@ package config const ( - Testnet = "testnet" - Mainnet = "mainnet" - StakeDenom = "iris-atto" + Testnet = "testnet" + Mainnet = "mainnet" ) // Can be configured through environment variables diff --git a/modules/mint/abci_test.go b/modules/mint/abci_test.go index f44bcaf71..105bae33d 100644 --- a/modules/mint/abci_test.go +++ b/modules/mint/abci_test.go @@ -34,7 +34,7 @@ func createTestApp(isCheckTx bool) (*simapp.SimApp, sdk.Context) { Inflation: sdk.NewDecWithPrec(4, 2), MintDenom: "iris", }) - app.MintKeeper.SetMinter(ctx, types.InitialMinter()) + app.MintKeeper.SetMinter(ctx, types.DefaultMinter()) app.SupplyKeeper.SetSupply(ctx, supply.Supply{}) app.DistrKeeper.SetFeePool(ctx, distribution.InitialFeePool()) return app, ctx diff --git a/modules/mint/internal/keeper/integration_test.go b/modules/mint/internal/keeper/integration_test.go index 6a156831d..331520dc4 100644 --- a/modules/mint/internal/keeper/integration_test.go +++ b/modules/mint/internal/keeper/integration_test.go @@ -14,7 +14,7 @@ func createTestApp(isCheckTx bool) (*simapp.SimApp, sdk.Context) { ctx := app.BaseApp.NewContext(isCheckTx, abci.Header{}) app.MintKeeper.SetParamSet(ctx, types.DefaultParams()) - app.MintKeeper.SetMinter(ctx, types.InitialMinter()) + app.MintKeeper.SetMinter(ctx, types.DefaultMinter()) return app, ctx } diff --git a/modules/mint/internal/keeper/keeper.go b/modules/mint/internal/keeper/keeper.go index 2ce882c4f..b9ed38a71 100644 --- a/modules/mint/internal/keeper/keeper.go +++ b/modules/mint/internal/keeper/keeper.go @@ -31,7 +31,7 @@ func NewKeeper(cdc *codec.Codec, key sdk.StoreKey, //______________________________________________________________________ -// get the minter +// GetMinter returns the minter func (k Keeper) GetMinter(ctx sdk.Context) (minter types.Minter) { store := ctx.KVStore(k.storeKey) b := store.Get(types.MinterKey) @@ -52,26 +52,26 @@ func (k Keeper) MintCoins(ctx sdk.Context, newCoins sdk.Coins) sdk.Error { return k.supplyKeeper.MintCoins(ctx, types.ModuleName, newCoins) } -// set inflation params from the global param store +// AddCollectedFees set inflation params from the global param store func (k Keeper) AddCollectedFees(ctx sdk.Context, coins sdk.Coins) sdk.Error { return k.supplyKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleName, k.feeCollectorName, coins) } -// set the minter +// SetMinter set the minter func (k Keeper) SetMinter(ctx sdk.Context, minter types.Minter) { store := ctx.KVStore(k.storeKey) b := k.cdc.MustMarshalBinaryLengthPrefixed(minter) store.Set(types.MinterKey, b) } -// get inflation params from the global param store +// GetParamSet returns inflation params from the global param store func (k Keeper) GetParamSet(ctx sdk.Context) types.Params { var params types.Params k.paramSpace.GetParamSet(ctx, ¶ms) return params } -// set inflation params from the global param store +// SetParamSet set inflation params from the global param store func (k Keeper) SetParamSet(ctx sdk.Context, params types.Params) { k.paramSpace.SetParamSet(ctx, ¶ms) } diff --git a/modules/mint/internal/types/events.go b/modules/mint/internal/types/events.go index b94de37d1..2e2faf3bc 100644 --- a/modules/mint/internal/types/events.go +++ b/modules/mint/internal/types/events.go @@ -3,7 +3,7 @@ package types const ( EventTypeMint = ModuleName - AttributeKeyLastInflationTime = "last-inflation-time" - AttributeKeyInflationTime = "inflation-time" - AttributeKeyMintCoin = "mint-coin" + AttributeKeyLastInflationTime = "last_inflation_time" + AttributeKeyInflationTime = "inflation_time" + AttributeKeyMintCoin = "mint_coin" ) diff --git a/modules/mint/internal/types/genesis.go b/modules/mint/internal/types/genesis.go index b56c0f1a0..e2b2ca44a 100644 --- a/modules/mint/internal/types/genesis.go +++ b/modules/mint/internal/types/genesis.go @@ -16,7 +16,7 @@ func NewGenesisState(minter Minter, params Params) GenesisState { // get raw genesis raw message for testing func DefaultGenesisState() GenesisState { return GenesisState{ - Minter: InitialMinter(), + Minter: DefaultMinter(), Params: DefaultParams(), } } diff --git a/modules/mint/internal/types/minter.go b/modules/mint/internal/types/minter.go index 91eb16854..bb1cafd35 100644 --- a/modules/mint/internal/types/minter.go +++ b/modules/mint/internal/types/minter.go @@ -28,7 +28,7 @@ func NewMinter(lastUpdate time.Time, inflationBase sdk.Int) Minter { } // minter object for a new chain -func InitialMinter() Minter { +func DefaultMinter() Minter { return NewMinter( time.Unix(0, 0), initialIssue.Mul(sdk.NewIntWithDecimal(1, 18)), // 20*(10^8)iris, 20*(10^8)*(10^18)iris-atto diff --git a/modules/mint/internal/types/params.go b/modules/mint/internal/types/params.go index 5e57b0451..157b42228 100644 --- a/modules/mint/internal/types/params.go +++ b/modules/mint/internal/types/params.go @@ -5,7 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/params" - "github.com/irisnet/irishub/config" ) var _ params.ParamSet = (*Params)(nil) @@ -13,6 +12,7 @@ var _ params.ParamSet = (*Params)(nil) // default paramspace for params keeper const ( DefaultParamSpace = "mint" + StakeDenom = "iris-atto" ) //Parameter store key @@ -56,7 +56,7 @@ func (p *Params) GetParamSpace() string { func DefaultParams() Params { return Params{ Inflation: sdk.NewDecWithPrec(4, 2), - MintDenom: config.StakeDenom, + MintDenom: StakeDenom, } } diff --git a/modules/mint/simulation/genesis.go b/modules/mint/simulation/genesis.go index 707c4590c..634af3cb7 100644 --- a/modules/mint/simulation/genesis.go +++ b/modules/mint/simulation/genesis.go @@ -4,7 +4,6 @@ package simulation import ( "fmt" - "github.com/irisnet/irishub/config" "math/rand" "github.com/cosmos/cosmos-sdk/codec" @@ -33,8 +32,8 @@ func RandomizedGenState(simState *module.SimulationState) { func(r *rand.Rand) { inflation = GenInflation(r) }, ) - params := types.Params{Inflation: inflation, MintDenom: config.StakeDenom} - mintGenesis := types.NewGenesisState(types.InitialMinter(), params) + params := types.Params{Inflation: inflation, MintDenom: types.StakeDenom} + mintGenesis := types.NewGenesisState(types.DefaultMinter(), params) fmt.Printf("Selected randomly generated minting parameters:\n%s\n", codec.MustMarshalJSONIndent(simState.Cdc, mintGenesis)) simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(mintGenesis) From 2222cb11ebd1ec0d0b3fbb600a11a044c479476a Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Mon, 2 Dec 2019 15:04:47 +0800 Subject: [PATCH 08/17] rename constant --- modules/mint/internal/types/params.go | 4 ++-- modules/mint/simulation/genesis.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/mint/internal/types/params.go b/modules/mint/internal/types/params.go index 157b42228..3a239eb24 100644 --- a/modules/mint/internal/types/params.go +++ b/modules/mint/internal/types/params.go @@ -12,7 +12,7 @@ var _ params.ParamSet = (*Params)(nil) // default paramspace for params keeper const ( DefaultParamSpace = "mint" - StakeDenom = "iris-atto" + MintDenom = "iris-atto" ) //Parameter store key @@ -56,7 +56,7 @@ func (p *Params) GetParamSpace() string { func DefaultParams() Params { return Params{ Inflation: sdk.NewDecWithPrec(4, 2), - MintDenom: StakeDenom, + MintDenom: MintDenom, } } diff --git a/modules/mint/simulation/genesis.go b/modules/mint/simulation/genesis.go index 634af3cb7..47bc7f327 100644 --- a/modules/mint/simulation/genesis.go +++ b/modules/mint/simulation/genesis.go @@ -32,7 +32,7 @@ func RandomizedGenState(simState *module.SimulationState) { func(r *rand.Rand) { inflation = GenInflation(r) }, ) - params := types.Params{Inflation: inflation, MintDenom: types.StakeDenom} + params := types.Params{Inflation: inflation, MintDenom: types.MintDenom} mintGenesis := types.NewGenesisState(types.DefaultMinter(), params) fmt.Printf("Selected randomly generated minting parameters:\n%s\n", codec.MustMarshalJSONIndent(simState.Cdc, mintGenesis)) From 62e60eee4d388a5d5a1651271907a6a32488893e Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Thu, 5 Dec 2019 10:52:47 +0800 Subject: [PATCH 09/17] apply comment from github --- modules/mint/internal/keeper/keeper.go | 2 +- modules/mint/internal/types/params.go | 9 +-------- simapp/app.go | 11 +++++------ 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/modules/mint/internal/keeper/keeper.go b/modules/mint/internal/keeper/keeper.go index b9ed38a71..b6783464b 100644 --- a/modules/mint/internal/keeper/keeper.go +++ b/modules/mint/internal/keeper/keeper.go @@ -7,7 +7,7 @@ import ( "github.com/irisnet/irishub/modules/mint/internal/types" ) -// keeper of the stake store +// keeper of the mint store type Keeper struct { storeKey sdk.StoreKey cdc *codec.Codec diff --git a/modules/mint/internal/types/params.go b/modules/mint/internal/types/params.go index 3a239eb24..c896835f7 100644 --- a/modules/mint/internal/types/params.go +++ b/modules/mint/internal/types/params.go @@ -12,7 +12,7 @@ var _ params.ParamSet = (*Params)(nil) // default paramspace for params keeper const ( DefaultParamSpace = "mint" - MintDenom = "iris-atto" + MintDenom = sdk.DefaultBondDenom ) //Parameter store key @@ -40,13 +40,6 @@ func (p *Params) ParamSetPairs() params.ParamSetPairs { } } -func (p Params) String() string { - return fmt.Sprintf(`Mint Params: - mint/Inflation: %s, - mint/MintDenom: %s`, - p.Inflation.String(), p.MintDenom) -} - // Implements params.ParamStruct func (p *Params) GetParamSpace() string { return DefaultParamSpace diff --git a/simapp/app.go b/simapp/app.go index d98d2f589..0416e46b4 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -1,15 +1,9 @@ package simapp import ( - "github.com/irisnet/irishub/modules/mint" "io" "os" - abci "github.com/tendermint/tendermint/abci/types" - cmn "github.com/tendermint/tendermint/libs/common" - "github.com/tendermint/tendermint/libs/log" - dbm "github.com/tendermint/tm-db" - bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" @@ -29,6 +23,11 @@ import ( "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cosmos/cosmos-sdk/x/supply" + "github.com/irisnet/irishub/modules/mint" + abci "github.com/tendermint/tendermint/abci/types" + cmn "github.com/tendermint/tendermint/libs/common" + "github.com/tendermint/tendermint/libs/log" + dbm "github.com/tendermint/tm-db" ) const appName = "SimApp" From 522c2d44a03f877b0525fec2b6a476583bd4f7ec Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Thu, 5 Dec 2019 11:00:22 +0800 Subject: [PATCH 10/17] apply comment from github --- go.mod | 3 ++- modules/mint/internal/types/params.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 745691d75..82b201909 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ require ( github.com/btcsuite/btcd v0.0.0-20190807005414-4063feeff79a // indirect github.com/cosmos/cosmos-sdk v0.34.4-0.20191108144056-d81d46192a0c github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d // indirect + github.com/go-kit/kit v0.9.0 github.com/golang/mock v1.3.1 // indirect github.com/gorilla/mux v1.7.3 github.com/onsi/ginkgo v1.8.0 // indirect @@ -11,7 +12,7 @@ require ( github.com/otiai10/copy v1.0.2 github.com/otiai10/curr v0.0.0-20190513014714-f5a3d24e5776 // indirect github.com/pkg/errors v0.8.1 - github.com/prometheus/client_golang v1.1.0 // indirect + github.com/prometheus/client_golang v1.1.0 github.com/rakyll/statik v0.1.6 github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962 // indirect github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa diff --git a/modules/mint/internal/types/params.go b/modules/mint/internal/types/params.go index c896835f7..23ae8418f 100644 --- a/modules/mint/internal/types/params.go +++ b/modules/mint/internal/types/params.go @@ -29,8 +29,8 @@ func ParamKeyTable() params.KeyTable { // mint parameters type Params struct { - Inflation sdk.Dec `json:"inflation"` // inflation rate - MintDenom string `json:"mint_denom"` // type of coin to mint + Inflation sdk.Dec `json:"inflation" yaml:"inflation"` // inflation rate + MintDenom string `json:"mint_denom" yaml:"mint_denom"` // type of coin to mint } func (p *Params) ParamSetPairs() params.ParamSetPairs { From 3ebf2fba49f8d8f1d815259ce497b94bbadcb1ee Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Thu, 5 Dec 2019 11:17:29 +0800 Subject: [PATCH 11/17] apply comment from github --- modules/mint/internal/keeper/keeper.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/mint/internal/keeper/keeper.go b/modules/mint/internal/keeper/keeper.go index b6783464b..ccbed05b4 100644 --- a/modules/mint/internal/keeper/keeper.go +++ b/modules/mint/internal/keeper/keeper.go @@ -19,6 +19,11 @@ type Keeper struct { func NewKeeper(cdc *codec.Codec, key sdk.StoreKey, paramSpace params.Subspace, supplyKeeper types.SupplyKeeper, feeCollectorName string) Keeper { + // ensure mint module account is set + if addr := supplyKeeper.GetModuleAddress(types.ModuleName); addr == nil { + panic("the mint module account has not been set") + } + keeper := Keeper{ storeKey: key, cdc: cdc, From fd18b2dd267bc331a4cc73dc80d20abf59a3b288 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Thu, 5 Dec 2019 11:46:06 +0800 Subject: [PATCH 12/17] add mint_test.go --- cli_test/mint_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 cli_test/mint_test.go diff --git a/cli_test/mint_test.go b/cli_test/mint_test.go new file mode 100644 index 000000000..b791fb62b --- /dev/null +++ b/cli_test/mint_test.go @@ -0,0 +1,39 @@ +package clitest + +import ( + "fmt" + "github.com/cosmos/cosmos-sdk/tests" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/irisnet/irishub/app" + "github.com/irisnet/irishub/modules/mint" + "github.com/stretchr/testify/require" + "testing" +) + +func TestMintGetParams(t *testing.T) { + t.Parallel() + f := InitFixtures(t) + + // start iris server + proc := f.GDStart() + defer proc.Stop(false) + + params := f.QueryMintParams() + require.Equal(t, sdk.NewDecWithPrec(4, 2), params.Inflation) + require.Equal(t, sdk.DefaultBondDenom, params.MintDenom) + + // Cleanup testing directories + f.Cleanup() +} + +// QueryMintParams is iriscli query mint params +func (f *Fixtures) QueryMintParams() mint.Params { + cmd := fmt.Sprintf("%s query mint params %s", f.IriscliBinary, f.Flags()) + res, errStr := tests.ExecuteT(f.T, cmd, "") + require.Empty(f.T, errStr) + cdc := app.MakeCodec() + var params mint.Params + err := cdc.UnmarshalJSON([]byte(res), ¶ms) + require.NoError(f.T, err) + return params +} From 86a2bfce486a276df046c424cb162a5818c51396 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Thu, 5 Dec 2019 13:37:32 +0800 Subject: [PATCH 13/17] repair test error --- lcd_test/helpers.go | 29 ++--------------------------- lcd_test/lcd_test.go | 16 ++-------------- 2 files changed, 4 insertions(+), 41 deletions(-) diff --git a/lcd_test/helpers.go b/lcd_test/helpers.go index 0d3196430..98108b06d 100644 --- a/lcd_test/helpers.go +++ b/lcd_test/helpers.go @@ -28,9 +28,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/crisis" distr "github.com/cosmos/cosmos-sdk/x/distribution" "github.com/cosmos/cosmos-sdk/x/genutil" - "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cosmos/cosmos-sdk/x/supply" + "github.com/irisnet/irishub/modules/mint" tmcfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto" @@ -255,15 +255,7 @@ func defaultGenesis(config *tmcfg.Config, nValidators int, initAddrs []sdk.AccAd // mint genesis (none set within genesisState) mintData := mint.DefaultGenesisState() - inflationMin := sdk.ZeroDec() - if minting { - inflationMin = sdk.MustNewDecFromStr("10000.0") - mintData.Params.InflationMax = sdk.MustNewDecFromStr("15000.0") - } else { - mintData.Params.InflationMax = inflationMin - } - mintData.Minter.Inflation = inflationMin - mintData.Params.InflationMin = inflationMin + mintDataBz := cdc.MustMarshalJSON(mintData) genesisState[mint.ModuleName] = mintDataBz @@ -275,23 +267,6 @@ func defaultGenesis(config *tmcfg.Config, nValidators int, initAddrs []sdk.AccAd crisisDataBz = cdc.MustMarshalJSON(crisisData) genesisState[crisis.ModuleName] = crisisDataBz - //// double check inflation is set according to the minting boolean flag - if minting { - if !(mintData.Params.InflationMax.Equal(sdk.MustNewDecFromStr("15000.0")) && - mintData.Minter.Inflation.Equal(sdk.MustNewDecFromStr("10000.0")) && - mintData.Params.InflationMin.Equal(sdk.MustNewDecFromStr("10000.0"))) { - err = errors.New("Mint parameters does not correspond to their defaults") - return - } - } else { - if !(mintData.Params.InflationMax.Equal(sdk.ZeroDec()) && - mintData.Minter.Inflation.Equal(sdk.ZeroDec()) && - mintData.Params.InflationMin.Equal(sdk.ZeroDec())) { - err = errors.New("Mint parameters not equal to decimal 0") - return - } - } - appState, err := codec.MarshalJSONIndent(cdc, genesisState) if err != nil { return diff --git a/lcd_test/lcd_test.go b/lcd_test/lcd_test.go index 96cf1f717..720351bb4 100644 --- a/lcd_test/lcd_test.go +++ b/lcd_test/lcd_test.go @@ -11,7 +11,7 @@ import ( "testing" "time" - "github.com/cosmos/cosmos-sdk/x/mint" + "github.com/irisnet/irishub/modules/mint" "github.com/stretchr/testify/require" @@ -1072,23 +1072,11 @@ func TestMintingQueries(t *testing.T) { require.NoError(t, err) defer cleanup() - res, body := Request(t, port, "GET", "/minting/parameters", nil) + res, body := Request(t, port, "GET", "/mint/parameters", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var params mint.Params require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), ¶ms)) - - res, body = Request(t, port, "GET", "/minting/inflation", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var inflation sdk.Dec - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &inflation)) - - res, body = Request(t, port, "GET", "/minting/annual-provisions", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var annualProvisions sdk.Dec - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &annualProvisions)) } func TestAccountBalanceQuery(t *testing.T) { From f5d3d1ac941d8ee41d50d7a462606f003743a686 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Thu, 5 Dec 2019 14:48:32 +0800 Subject: [PATCH 14/17] add unit test --- app/sim_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/sim_test.go b/app/sim_test.go index a1aead831..724161603 100644 --- a/app/sim_test.go +++ b/app/sim_test.go @@ -23,7 +23,6 @@ import ( distrsim "github.com/cosmos/cosmos-sdk/x/distribution/simulation" "github.com/cosmos/cosmos-sdk/x/gov" govsim "github.com/cosmos/cosmos-sdk/x/gov/simulation" - "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/params" paramsim "github.com/cosmos/cosmos-sdk/x/params/simulation" "github.com/cosmos/cosmos-sdk/x/simulation" @@ -32,6 +31,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/staking" stakingsim "github.com/cosmos/cosmos-sdk/x/staking/simulation" "github.com/cosmos/cosmos-sdk/x/supply" + "github.com/irisnet/irishub/modules/mint" ) func init() { From ac05b6877d47ffeacc149b957c0b454c82c50e7c Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Fri, 6 Dec 2019 13:44:34 +0800 Subject: [PATCH 15/17] replace testing with suite --- .../mint/internal/keeper/integration_test.go | 20 ----- modules/mint/internal/keeper/keeper_test.go | 79 +++++++++++-------- modules/mint/internal/keeper/querier_test.go | 32 +++----- 3 files changed, 60 insertions(+), 71 deletions(-) delete mode 100644 modules/mint/internal/keeper/integration_test.go diff --git a/modules/mint/internal/keeper/integration_test.go b/modules/mint/internal/keeper/integration_test.go deleted file mode 100644 index 331520dc4..000000000 --- a/modules/mint/internal/keeper/integration_test.go +++ /dev/null @@ -1,20 +0,0 @@ -package keeper_test - -import ( - abci "github.com/tendermint/tendermint/abci/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/irisnet/irishub/modules/mint/internal/types" - "github.com/irisnet/irishub/simapp" -) - -// returns context and an app with updated mint keeper -func createTestApp(isCheckTx bool) (*simapp.SimApp, sdk.Context) { - app := simapp.Setup(isCheckTx) - - ctx := app.BaseApp.NewContext(isCheckTx, abci.Header{}) - app.MintKeeper.SetParamSet(ctx, types.DefaultParams()) - app.MintKeeper.SetMinter(ctx, types.DefaultMinter()) - - return app, ctx -} diff --git a/modules/mint/internal/keeper/keeper_test.go b/modules/mint/internal/keeper/keeper_test.go index 6985b3478..19629d8d0 100644 --- a/modules/mint/internal/keeper/keeper_test.go +++ b/modules/mint/internal/keeper/keeper_test.go @@ -7,61 +7,76 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/supply" "github.com/irisnet/irishub/modules/mint/internal/types" + "github.com/irisnet/irishub/simapp" "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + abci "github.com/tendermint/tendermint/abci/types" ) -func TestSetGetMinter(t *testing.T) { - app, ctx := createTestApp(true) +type KeeperTestSuite struct { + suite.Suite - minter := types.NewMinter(time.Now().UTC(), sdk.NewInt(100000)) - app.MintKeeper.SetMinter(ctx, minter) - expMinter := app.MintKeeper.GetMinter(ctx) + ctx sdk.Context + app *simapp.SimApp +} - require.Equal(t, minter, expMinter) +func (suite *KeeperTestSuite) SetupTest() { + app := simapp.Setup(false) + ctx := app.BaseApp.NewContext(false, abci.Header{}) + app.MintKeeper.SetParamSet(ctx, types.DefaultParams()) + app.MintKeeper.SetMinter(ctx, types.DefaultMinter()) + suite.app = app + suite.ctx = ctx } -func TestSetGetParamSet(t *testing.T) { - app, ctx := createTestApp(true) +func TestKeeperTestSuite(t *testing.T) { + suite.Run(t, new(KeeperTestSuite)) +} - app.MintKeeper.SetParamSet(ctx, types.DefaultParams()) - expParamSet := app.MintKeeper.GetParamSet(ctx) +func (suite *KeeperTestSuite) TestSetGetMinter() { + minter := types.NewMinter(time.Now().UTC(), sdk.NewInt(100000)) + suite.app.MintKeeper.SetMinter(suite.ctx, minter) + expMinter := suite.app.MintKeeper.GetMinter(suite.ctx) - require.Equal(t, types.DefaultParams(), expParamSet) + require.Equal(suite.T(), minter, expMinter) } -func TestMintCoins(t *testing.T) { - app, ctx := createTestApp(true) +func (suite *KeeperTestSuite) TestSetGetParamSet() { + suite.app.MintKeeper.SetParamSet(suite.ctx, types.DefaultParams()) + expParamSet := suite.app.MintKeeper.GetParamSet(suite.ctx) + + require.Equal(suite.T(), types.DefaultParams(), expParamSet) +} - app.SupplyKeeper.SetSupply(ctx, supply.Supply{}) +func (suite *KeeperTestSuite) TestMintCoins() { + suite.app.SupplyKeeper.SetSupply(suite.ctx, supply.Supply{}) mintCoins := sdk.NewCoins(sdk.NewCoin("iris", sdk.NewInt(1000))) - err := app.MintKeeper.MintCoins(ctx, mintCoins) - require.NoError(t, err) + err := suite.app.MintKeeper.MintCoins(suite.ctx, mintCoins) + require.NoError(suite.T(), err) - acc := app.SupplyKeeper.GetModuleAccount(ctx, types.ModuleName) - require.Equal(t, acc.GetCoins(), mintCoins) + acc := suite.app.SupplyKeeper.GetModuleAccount(suite.ctx, types.ModuleName) + require.Equal(suite.T(), acc.GetCoins(), mintCoins) } -func TestAddCollectedFees(t *testing.T) { - app, ctx := createTestApp(true) - - app.SupplyKeeper.SetSupply(ctx, supply.Supply{}) +func (suite *KeeperTestSuite) TestAddCollectedFees() { + suite.app.SupplyKeeper.SetSupply(suite.ctx, supply.Supply{}) mintCoins := sdk.NewCoins(sdk.NewCoin("iris", sdk.NewInt(1000))) - err := app.MintKeeper.MintCoins(ctx, mintCoins) - require.NoError(t, err) + err := suite.app.MintKeeper.MintCoins(suite.ctx, mintCoins) + require.NoError(suite.T(), err) - acc := app.SupplyKeeper.GetModuleAccount(ctx, types.ModuleName) - require.Equal(t, acc.GetCoins(), mintCoins) + acc := suite.app.SupplyKeeper.GetModuleAccount(suite.ctx, types.ModuleName) + require.Equal(suite.T(), acc.GetCoins(), mintCoins) - err = app.MintKeeper.AddCollectedFees(ctx, mintCoins) - require.NoError(t, err) + err = suite.app.MintKeeper.AddCollectedFees(suite.ctx, mintCoins) + require.NoError(suite.T(), err) - acc = app.SupplyKeeper.GetModuleAccount(ctx, types.ModuleName) - require.True(t, acc.GetCoins().Empty()) + acc = suite.app.SupplyKeeper.GetModuleAccount(suite.ctx, types.ModuleName) + require.True(suite.T(), acc.GetCoins().Empty()) - acc1 := app.SupplyKeeper.GetModuleAccount(ctx, "fee_collector") - require.Equal(t, acc1.GetCoins(), mintCoins) + acc1 := suite.app.SupplyKeeper.GetModuleAccount(suite.ctx, "fee_collector") + require.Equal(suite.T(), acc1.GetCoins(), mintCoins) } diff --git a/modules/mint/internal/keeper/querier_test.go b/modules/mint/internal/keeper/querier_test.go index e00a9c9d4..c9427d190 100644 --- a/modules/mint/internal/keeper/querier_test.go +++ b/modules/mint/internal/keeper/querier_test.go @@ -1,40 +1,34 @@ package keeper_test import ( - "testing" - - "github.com/stretchr/testify/require" - - keep "github.com/irisnet/irishub/modules/mint/internal/keeper" + "github.com/irisnet/irishub/modules/mint/internal/keeper" "github.com/irisnet/irishub/modules/mint/internal/types" - + "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" ) -func TestNewQuerier(t *testing.T) { - app, ctx := createTestApp(true) - querier := keep.NewQuerier(app.MintKeeper) +func (suite *KeeperTestSuite) TestNewQuerier() { + querier := keeper.NewQuerier(suite.app.MintKeeper) query := abci.RequestQuery{ Path: "", Data: []byte{}, } - _, err := querier(ctx, []string{types.QueryParameters}, query) - require.NoError(t, err) + _, err := querier(suite.ctx, []string{types.QueryParameters}, query) + require.NoError(suite.T(), err) } -func TestQueryParams(t *testing.T) { - app, ctx := createTestApp(true) - querier := keep.NewQuerier(app.MintKeeper) +func (suite *KeeperTestSuite) TestQueryParams() { + querier := keeper.NewQuerier(suite.app.MintKeeper) var params types.Params - res, sdkErr := querier(ctx, []string{types.QueryParameters}, abci.RequestQuery{}) - require.NoError(t, sdkErr) + res, sdkErr := querier(suite.ctx, []string{types.QueryParameters}, abci.RequestQuery{}) + require.NoError(suite.T(), sdkErr) - err := app.Codec().UnmarshalJSON(res, ¶ms) - require.NoError(t, err) + err := suite.app.Codec().UnmarshalJSON(res, ¶ms) + require.NoError(suite.T(), err) - require.Equal(t, app.MintKeeper.GetParamSet(ctx), params) + require.Equal(suite.T(), suite.app.MintKeeper.GetParamSet(suite.ctx), params) } From 577db2e7529fde785f82f8c57f76d822504fe95c Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Tue, 10 Dec 2019 09:32:47 +0800 Subject: [PATCH 16/17] modify comment --- modules/mint/internal/keeper/keeper.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/mint/internal/keeper/keeper.go b/modules/mint/internal/keeper/keeper.go index ccbed05b4..c6815b4c2 100644 --- a/modules/mint/internal/keeper/keeper.go +++ b/modules/mint/internal/keeper/keeper.go @@ -57,7 +57,8 @@ func (k Keeper) MintCoins(ctx sdk.Context, newCoins sdk.Coins) sdk.Error { return k.supplyKeeper.MintCoins(ctx, types.ModuleName, newCoins) } -// AddCollectedFees set inflation params from the global param store +// AddCollectedFees implements an alias call to the underlying supply keeper's +// AddCollectedFees to be used in BeginBlocker. func (k Keeper) AddCollectedFees(ctx sdk.Context, coins sdk.Coins) sdk.Error { return k.supplyKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleName, k.feeCollectorName, coins) } From 3b675bc0fbd25d4d5144a7429e14bb3d178a03e4 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@qq.com> Date: Tue, 10 Dec 2019 10:03:24 +0800 Subject: [PATCH 17/17] replace cosmos/cosmos-sdk/x/mint with irisnet/irishub/modules/mint in cli_test.go --- cli_test/cli_test.go | 18 +++++++----------- modules/mint/alias.go | 1 + 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/cli_test/cli_test.go b/cli_test/cli_test.go index 6b0b6a92f..62957fcfc 100644 --- a/cli_test/cli_test.go +++ b/cli_test/cli_test.go @@ -26,7 +26,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/gov" - "github.com/cosmos/cosmos-sdk/x/mint" + "github.com/irisnet/irishub/modules/mint" ) func TestIrisCLIKeysAddMultisig(t *testing.T) { @@ -420,12 +420,10 @@ func TestIrisCLIQueryRewards(t *testing.T) { cdc := app.MakeCodec() genesisState := f.GenesisState() - inflationMin := sdk.MustNewDecFromStr("10000.0") var mintData mint.GenesisState - cdc.UnmarshalJSON(genesisState[mint.ModuleName], &mintData) - mintData.Minter.Inflation = inflationMin - mintData.Params.InflationMin = inflationMin - mintData.Params.InflationMax = sdk.MustNewDecFromStr("15000.0") + cdc.MustUnmarshalJSON(genesisState[mint.ModuleName], &mintData) + mintData.Minter = mint.DefaultMinter() + mintData.Params = mint.DefaultParams() mintDataBz, err := cdc.MarshalJSON(mintData) require.NoError(t, err) genesisState[mint.ModuleName] = mintDataBz @@ -680,12 +678,10 @@ func TestIrisCLISubmitCommunityPoolSpendProposal(t *testing.T) { // create some inflation cdc := app.MakeCodec() genesisState := f.GenesisState() - inflationMin := sdk.MustNewDecFromStr("10000.0") var mintData mint.GenesisState - cdc.UnmarshalJSON(genesisState[mint.ModuleName], &mintData) - mintData.Minter.Inflation = inflationMin - mintData.Params.InflationMin = inflationMin - mintData.Params.InflationMax = sdk.MustNewDecFromStr("15000.0") + cdc.MustUnmarshalJSON(genesisState[mint.ModuleName], &mintData) + mintData.Minter = mint.DefaultMinter() + mintData.Params = mint.DefaultParams() mintDataBz, err := cdc.MarshalJSON(mintData) require.NoError(t, err) genesisState[mint.ModuleName] = mintDataBz diff --git a/modules/mint/alias.go b/modules/mint/alias.go index 1ec478780..79230021f 100644 --- a/modules/mint/alias.go +++ b/modules/mint/alias.go @@ -21,6 +21,7 @@ var ( ValidateGenesis = types.ValidateGenesis RegisterCodec = types.RegisterCodec DefaultParams = types.DefaultParams + DefaultMinter = types.DefaultMinter // variable aliases ModuleCdc = types.ModuleCdc