replace x/kavamint with x/mint (#1452)

* replace x/kavamint with x/mint

* replace x/mint with x/kavamint in internal testnet

* delete all x/kavamint code (#1453)
This commit is contained in:
Robert Pirtle 2023-01-26 08:50:27 -08:00 committed by GitHub
parent 179e4ed917
commit 0d38ce77a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
52 changed files with 171 additions and 4692 deletions

View File

@ -49,6 +49,9 @@ import (
"github.com/cosmos/cosmos-sdk/x/gov" "github.com/cosmos/cosmos-sdk/x/gov"
govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
"github.com/cosmos/cosmos-sdk/x/mint"
mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
"github.com/cosmos/cosmos-sdk/x/params" "github.com/cosmos/cosmos-sdk/x/params"
paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" paramsclient "github.com/cosmos/cosmos-sdk/x/params/client"
paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper"
@ -128,9 +131,6 @@ import (
kavadistclient "github.com/kava-labs/kava/x/kavadist/client" kavadistclient "github.com/kava-labs/kava/x/kavadist/client"
kavadistkeeper "github.com/kava-labs/kava/x/kavadist/keeper" kavadistkeeper "github.com/kava-labs/kava/x/kavadist/keeper"
kavadisttypes "github.com/kava-labs/kava/x/kavadist/types" kavadisttypes "github.com/kava-labs/kava/x/kavadist/types"
"github.com/kava-labs/kava/x/kavamint"
kavamintkeeper "github.com/kava-labs/kava/x/kavamint/keeper"
kavaminttypes "github.com/kava-labs/kava/x/kavamint/types"
"github.com/kava-labs/kava/x/liquid" "github.com/kava-labs/kava/x/liquid"
liquidkeeper "github.com/kava-labs/kava/x/liquid/keeper" liquidkeeper "github.com/kava-labs/kava/x/liquid/keeper"
liquidtypes "github.com/kava-labs/kava/x/liquid/types" liquidtypes "github.com/kava-labs/kava/x/liquid/types"
@ -208,7 +208,7 @@ var (
liquid.AppModuleBasic{}, liquid.AppModuleBasic{},
earn.AppModuleBasic{}, earn.AppModuleBasic{},
router.AppModuleBasic{}, router.AppModuleBasic{},
kavamint.AppModuleBasic{}, mint.AppModuleBasic{},
community.AppModuleBasic{}, community.AppModuleBasic{},
) )
@ -236,7 +236,7 @@ var (
liquidtypes.ModuleAccountName: {authtypes.Minter, authtypes.Burner}, liquidtypes.ModuleAccountName: {authtypes.Minter, authtypes.Burner},
earntypes.ModuleAccountName: nil, earntypes.ModuleAccountName: nil,
kavadisttypes.FundModuleAccount: nil, kavadisttypes.FundModuleAccount: nil,
kavaminttypes.ModuleAccountName: {authtypes.Minter}, minttypes.ModuleName: {authtypes.Minter},
communitytypes.ModuleName: nil, communitytypes.ModuleName: nil,
} }
) )
@ -308,7 +308,7 @@ type App struct {
liquidKeeper liquidkeeper.Keeper liquidKeeper liquidkeeper.Keeper
earnKeeper earnkeeper.Keeper earnKeeper earnkeeper.Keeper
routerKeeper routerkeeper.Keeper routerKeeper routerkeeper.Keeper
kavamintKeeper kavamintkeeper.Keeper mintKeeper mintkeeper.Keeper
communityKeeper communitykeeper.Keeper communityKeeper communitykeeper.Keeper
// make scoped keepers public for test purposes // make scoped keepers public for test purposes
@ -363,7 +363,7 @@ func NewApp(
issuancetypes.StoreKey, bep3types.StoreKey, pricefeedtypes.StoreKey, issuancetypes.StoreKey, bep3types.StoreKey, pricefeedtypes.StoreKey,
swaptypes.StoreKey, cdptypes.StoreKey, hardtypes.StoreKey, swaptypes.StoreKey, cdptypes.StoreKey, hardtypes.StoreKey,
committeetypes.StoreKey, incentivetypes.StoreKey, evmutiltypes.StoreKey, committeetypes.StoreKey, incentivetypes.StoreKey, evmutiltypes.StoreKey,
savingstypes.StoreKey, earntypes.StoreKey, kavaminttypes.StoreKey, savingstypes.StoreKey, earntypes.StoreKey, minttypes.StoreKey,
) )
tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey, evmtypes.TransientKey) tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey, evmtypes.TransientKey)
memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
@ -408,7 +408,7 @@ func NewApp(
evmSubspace := app.paramsKeeper.Subspace(evmtypes.ModuleName) evmSubspace := app.paramsKeeper.Subspace(evmtypes.ModuleName)
evmutilSubspace := app.paramsKeeper.Subspace(evmutiltypes.ModuleName) evmutilSubspace := app.paramsKeeper.Subspace(evmutiltypes.ModuleName)
earnSubspace := app.paramsKeeper.Subspace(earntypes.ModuleName) earnSubspace := app.paramsKeeper.Subspace(earntypes.ModuleName)
kavamintSubspace := app.paramsKeeper.Subspace(kavaminttypes.ModuleName) mintSubspace := app.paramsKeeper.Subspace(minttypes.ModuleName)
bApp.SetParamStore( bApp.SetParamStore(
app.paramsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramskeeper.ConsensusParamsKeyTable()), app.paramsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramskeeper.ConsensusParamsKeyTable()),
@ -628,15 +628,14 @@ func NewApp(
app.loadBlockedMaccAddrs(), app.loadBlockedMaccAddrs(),
) )
app.kavamintKeeper = kavamintkeeper.NewKeeper( app.mintKeeper = mintkeeper.NewKeeper(
appCodec, appCodec,
keys[kavaminttypes.StoreKey], keys[minttypes.StoreKey],
kavamintSubspace, mintSubspace,
app.stakingKeeper, app.stakingKeeper,
app.accountKeeper, app.accountKeeper,
app.bankKeeper, app.bankKeeper,
authtypes.FeeCollectorName, // same fee collector as vanilla sdk authtypes.FeeCollectorName,
communitytypes.ModuleAccountName,
) )
app.incentiveKeeper = incentivekeeper.NewKeeper( app.incentiveKeeper = incentivekeeper.NewKeeper(
@ -652,7 +651,7 @@ func NewApp(
&savingsKeeper, &savingsKeeper,
&app.liquidKeeper, &app.liquidKeeper,
&earnKeeper, &earnKeeper,
app.kavamintKeeper, app.mintKeeper,
app.distrKeeper, app.distrKeeper,
app.pricefeedKeeper, app.pricefeedKeeper,
) )
@ -758,7 +757,7 @@ func NewApp(
liquid.NewAppModule(app.liquidKeeper), liquid.NewAppModule(app.liquidKeeper),
earn.NewAppModule(app.earnKeeper, app.accountKeeper, app.bankKeeper), earn.NewAppModule(app.earnKeeper, app.accountKeeper, app.bankKeeper),
router.NewAppModule(app.routerKeeper), router.NewAppModule(app.routerKeeper),
kavamint.NewAppModule(appCodec, app.kavamintKeeper, app.accountKeeper), mint.NewAppModule(appCodec, app.mintKeeper, app.accountKeeper),
community.NewAppModule(app.communityKeeper, app.accountKeeper), community.NewAppModule(app.communityKeeper, app.accountKeeper),
) )
@ -771,8 +770,7 @@ func NewApp(
// Committee begin blocker changes module params by enacting proposals. // Committee begin blocker changes module params by enacting proposals.
// Run before to ensure params are updated together before state changes. // Run before to ensure params are updated together before state changes.
committeetypes.ModuleName, committeetypes.ModuleName,
// Kavamint must be registered before distribution module in order to generate block staking rewards. minttypes.ModuleName,
kavaminttypes.ModuleName,
distrtypes.ModuleName, distrtypes.ModuleName,
// During begin block slashing happens after distr.BeginBlocker so that // During begin block slashing happens after distr.BeginBlocker so that
// there is nothing left over in the validator fee pool, so as to keep the // there is nothing left over in the validator fee pool, so as to keep the
@ -851,7 +849,7 @@ func NewApp(
liquidtypes.ModuleName, liquidtypes.ModuleName,
earntypes.ModuleName, earntypes.ModuleName,
routertypes.ModuleName, routertypes.ModuleName,
kavaminttypes.ModuleName, minttypes.ModuleName,
communitytypes.ModuleName, communitytypes.ModuleName,
) )
@ -864,7 +862,7 @@ func NewApp(
stakingtypes.ModuleName, stakingtypes.ModuleName,
slashingtypes.ModuleName, // iterates over validators, run after staking slashingtypes.ModuleName, // iterates over validators, run after staking
govtypes.ModuleName, govtypes.ModuleName,
kavaminttypes.ModuleName, minttypes.ModuleName,
ibchost.ModuleName, ibchost.ModuleName,
evidencetypes.ModuleName, evidencetypes.ModuleName,
authz.ModuleName, authz.ModuleName,

View File

@ -18,6 +18,8 @@ import (
crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper"
distkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper"
govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"
mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper"
slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper"
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
@ -41,8 +43,6 @@ import (
incentivekeeper "github.com/kava-labs/kava/x/incentive/keeper" incentivekeeper "github.com/kava-labs/kava/x/incentive/keeper"
issuancekeeper "github.com/kava-labs/kava/x/issuance/keeper" issuancekeeper "github.com/kava-labs/kava/x/issuance/keeper"
kavadistkeeper "github.com/kava-labs/kava/x/kavadist/keeper" kavadistkeeper "github.com/kava-labs/kava/x/kavadist/keeper"
kavamintkeeper "github.com/kava-labs/kava/x/kavamint/keeper"
kavaminttypes "github.com/kava-labs/kava/x/kavamint/types"
liquidkeeper "github.com/kava-labs/kava/x/liquid/keeper" liquidkeeper "github.com/kava-labs/kava/x/liquid/keeper"
pricefeedkeeper "github.com/kava-labs/kava/x/pricefeed/keeper" pricefeedkeeper "github.com/kava-labs/kava/x/pricefeed/keeper"
routerkeeper "github.com/kava-labs/kava/x/router/keeper" routerkeeper "github.com/kava-labs/kava/x/router/keeper"
@ -92,6 +92,7 @@ func NewTestAppFromSealed() TestApp {
// nolint // nolint
func (tApp TestApp) GetAccountKeeper() authkeeper.AccountKeeper { return tApp.accountKeeper } func (tApp TestApp) GetAccountKeeper() authkeeper.AccountKeeper { return tApp.accountKeeper }
func (tApp TestApp) GetBankKeeper() bankkeeper.Keeper { return tApp.bankKeeper } func (tApp TestApp) GetBankKeeper() bankkeeper.Keeper { return tApp.bankKeeper }
func (tApp TestApp) GetMintKeeper() mintkeeper.Keeper { return tApp.mintKeeper }
func (tApp TestApp) GetStakingKeeper() stakingkeeper.Keeper { return tApp.stakingKeeper } func (tApp TestApp) GetStakingKeeper() stakingkeeper.Keeper { return tApp.stakingKeeper }
func (tApp TestApp) GetSlashingKeeper() slashingkeeper.Keeper { return tApp.slashingKeeper } func (tApp TestApp) GetSlashingKeeper() slashingkeeper.Keeper { return tApp.slashingKeeper }
func (tApp TestApp) GetDistrKeeper() distkeeper.Keeper { return tApp.distrKeeper } func (tApp TestApp) GetDistrKeeper() distkeeper.Keeper { return tApp.distrKeeper }
@ -116,7 +117,6 @@ func (tApp TestApp) GetFeeMarketKeeper() feemarketkeeper.Keeper { return tApp.fe
func (tApp TestApp) GetLiquidKeeper() liquidkeeper.Keeper { return tApp.liquidKeeper } func (tApp TestApp) GetLiquidKeeper() liquidkeeper.Keeper { return tApp.liquidKeeper }
func (tApp TestApp) GetEarnKeeper() earnkeeper.Keeper { return tApp.earnKeeper } func (tApp TestApp) GetEarnKeeper() earnkeeper.Keeper { return tApp.earnKeeper }
func (tApp TestApp) GetRouterKeeper() routerkeeper.Keeper { return tApp.routerKeeper } func (tApp TestApp) GetRouterKeeper() routerkeeper.Keeper { return tApp.routerKeeper }
func (tApp TestApp) GetKavamintKeeper() kavamintkeeper.Keeper { return tApp.kavamintKeeper }
func (tApp TestApp) GetCommunityKeeper() communitykeeper.Keeper { return tApp.communityKeeper } func (tApp TestApp) GetCommunityKeeper() communitykeeper.Keeper { return tApp.communityKeeper }
// LegacyAmino returns the app's amino codec. // LegacyAmino returns the app's amino codec.
@ -203,11 +203,11 @@ func (tApp TestApp) GetModuleAccountBalance(ctx sdk.Context, moduleName string,
// FundAccount is a utility function that funds an account by minting and sending the coins to the address. // FundAccount is a utility function that funds an account by minting and sending the coins to the address.
func (tApp TestApp) FundAccount(ctx sdk.Context, addr sdk.AccAddress, amounts sdk.Coins) error { func (tApp TestApp) FundAccount(ctx sdk.Context, addr sdk.AccAddress, amounts sdk.Coins) error {
if err := tApp.bankKeeper.MintCoins(ctx, kavaminttypes.ModuleAccountName, amounts); err != nil { if err := tApp.bankKeeper.MintCoins(ctx, minttypes.ModuleName, amounts); err != nil {
return err return err
} }
return tApp.bankKeeper.SendCoinsFromModuleToAccount(ctx, kavaminttypes.ModuleAccountName, addr, amounts) return tApp.bankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr, amounts)
} }
// NewQueryServerTestHelper creates a new QueryServiceTestHelper that wraps the provided sdk.Context. // NewQueryServerTestHelper creates a new QueryServiceTestHelper that wraps the provided sdk.Context.
@ -217,11 +217,11 @@ func (tApp TestApp) NewQueryServerTestHelper(ctx sdk.Context) *baseapp.QueryServ
// FundModuleAccount is a utility function that funds a module account by minting and sending the coins to the address. // FundModuleAccount is a utility function that funds a module account by minting and sending the coins to the address.
func (tApp TestApp) FundModuleAccount(ctx sdk.Context, recipientMod string, amounts sdk.Coins) error { func (tApp TestApp) FundModuleAccount(ctx sdk.Context, recipientMod string, amounts sdk.Coins) error {
if err := tApp.bankKeeper.MintCoins(ctx, kavaminttypes.ModuleAccountName, amounts); err != nil { if err := tApp.bankKeeper.MintCoins(ctx, minttypes.ModuleName, amounts); err != nil {
return err return err
} }
return tApp.bankKeeper.SendCoinsFromModuleToModule(ctx, kavaminttypes.ModuleAccountName, recipientMod, amounts) return tApp.bankKeeper.SendCoinsFromModuleToModule(ctx, minttypes.ModuleName, recipientMod, amounts)
} }
// CreateNewUnbondedValidator creates a new validator in the staking module. // CreateNewUnbondedValidator creates a new validator in the staking module.

View File

@ -2465,14 +2465,21 @@
}, },
"previous_block_time": "1970-01-01T00:00:01Z" "previous_block_time": "1970-01-01T00:00:01Z"
}, },
"kavamint": {
"params": {
"community_pool_inflation": "0.200000000000000000",
"staking_rewards_apy": "0.150000000000000000"
},
"previous_block_time": "2022-05-25T17:00:00Z"
},
"liquid": {}, "liquid": {},
"mint": {
"minter": {
"inflation": "0.130000000000000000",
"annual_provisions": "0.000000000000000000"
},
"params": {
"mint_denom": "ukava",
"inflation_rate_change": "0.130000000000000000",
"inflation_max": "0.750000000000000000",
"inflation_min": "0.750000000000000000",
"goal_bonded": "0.670000000000000000",
"blocks_per_year": "6311520"
}
},
"params": null, "params": null,
"pricefeed": { "pricefeed": {
"params": { "params": {

View File

@ -216,23 +216,6 @@
] ]
} }
}, },
{
"url": "./out/swagger/kava/kavamint/v1beta1/query.swagger.json",
"tags": {
"rename": {
"Query": "Kavamint"
}
},
"operationIds": {
"rename": [
{
"type": "regex",
"from": "(.*)",
"to": "Kavamint$1"
}
]
}
},
{ {
"url": "./client/docs/cosmos-swagger.yml", "url": "./client/docs/cosmos-swagger.yml",
"dereference": { "dereference": {

View File

@ -12033,101 +12033,6 @@ paths:
format: byte format: byte
tags: tags:
- Savings - Savings
/kava/kavamint/v1beta1/inflation:
get:
summary: >-
Inflation queries x/kavamint for the overall cumulative inflation rate
of KAVA.
operationId: KavamintInflation
responses:
'200':
description: A successful response.
schema:
type: object
properties:
inflation:
type: string
title: |-
inflation is the current minting inflation value.
example "0.990000000000000000" - 99% inflation
description: >-
QueryInflationResponse is the response type for the
Query/Inflation RPC method.
default:
description: An unexpected error response.
schema:
type: object
properties:
error:
type: string
code:
type: integer
format: int32
message:
type: string
details:
type: array
items:
type: object
properties:
type_url:
type: string
value:
type: string
format: byte
tags:
- Kavamint
/kava/kavamint/v1beta1/params:
get:
summary: Params queries the parameters of x/kavamint module.
operationId: KavamintParams
responses:
'200':
description: A successful response.
schema:
type: object
properties:
params:
type: object
properties:
community_pool_inflation:
type: string
description: >-
yearly inflation of total token supply minted to the
community pool.
staking_rewards_apy:
type: string
description: >-
yearly inflation of bonded tokens minted for staking
rewards to validators.
title: Params wraps the governance parameters for the kavamint module
description: >-
QueryParamsResponse defines the response type for querying
x/kavamint parameters.
default:
description: An unexpected error response.
schema:
type: object
properties:
error:
type: string
code:
type: integer
format: int32
message:
type: string
details:
type: array
items:
type: object
properties:
type_url:
type: string
value:
type: string
format: byte
tags:
- Kavamint
/node_info: /node_info:
get: get:
description: Information about the connected node description: Information about the connected node
@ -57766,49 +57671,6 @@ definitions:
description: >- description: >-
TotalSupplyResponse defines the response type for the Query/TotalSupply TotalSupplyResponse defines the response type for the Query/TotalSupply
method. method.
kava.kavamint.v1beta1.Params:
type: object
properties:
community_pool_inflation:
type: string
description: yearly inflation of total token supply minted to the community pool.
staking_rewards_apy:
type: string
description: >-
yearly inflation of bonded tokens minted for staking rewards to
validators.
title: Params wraps the governance parameters for the kavamint module
kava.kavamint.v1beta1.QueryInflationResponse:
type: object
properties:
inflation:
type: string
title: |-
inflation is the current minting inflation value.
example "0.990000000000000000" - 99% inflation
description: >-
QueryInflationResponse is the response type for the Query/Inflation RPC
method.
kava.kavamint.v1beta1.QueryParamsResponse:
type: object
properties:
params:
type: object
properties:
community_pool_inflation:
type: string
description: >-
yearly inflation of total token supply minted to the community
pool.
staking_rewards_apy:
type: string
description: >-
yearly inflation of bonded tokens minted for staking rewards to
validators.
title: Params wraps the governance parameters for the kavamint module
description: >-
QueryParamsResponse defines the response type for querying x/kavamint
parameters.
CheckTxResult: CheckTxResult:
type: object type: object
properties: properties:

View File

@ -417,20 +417,6 @@
- [Query](#kava.kavadist.v1beta1.Query) - [Query](#kava.kavadist.v1beta1.Query)
- [kava/kavamint/v1beta1/kavamint.proto](#kava/kavamint/v1beta1/kavamint.proto)
- [Params](#kava.kavamint.v1beta1.Params)
- [kava/kavamint/v1beta1/genesis.proto](#kava/kavamint/v1beta1/genesis.proto)
- [GenesisState](#kava.kavamint.v1beta1.GenesisState)
- [kava/kavamint/v1beta1/query.proto](#kava/kavamint/v1beta1/query.proto)
- [QueryInflationRequest](#kava.kavamint.v1beta1.QueryInflationRequest)
- [QueryInflationResponse](#kava.kavamint.v1beta1.QueryInflationResponse)
- [QueryParamsRequest](#kava.kavamint.v1beta1.QueryParamsRequest)
- [QueryParamsResponse](#kava.kavamint.v1beta1.QueryParamsResponse)
- [Query](#kava.kavamint.v1beta1.Query)
- [kava/liquid/v1beta1/query.proto](#kava/liquid/v1beta1/query.proto) - [kava/liquid/v1beta1/query.proto](#kava/liquid/v1beta1/query.proto)
- [QueryDelegatedBalanceRequest](#kava.liquid.v1beta1.QueryDelegatedBalanceRequest) - [QueryDelegatedBalanceRequest](#kava.liquid.v1beta1.QueryDelegatedBalanceRequest)
- [QueryDelegatedBalanceResponse](#kava.liquid.v1beta1.QueryDelegatedBalanceResponse) - [QueryDelegatedBalanceResponse](#kava.liquid.v1beta1.QueryDelegatedBalanceResponse)
@ -5850,147 +5836,6 @@ Query defines the gRPC querier service.
<a name="kava/kavamint/v1beta1/kavamint.proto"></a>
<p align="right"><a href="#top">Top</a></p>
## kava/kavamint/v1beta1/kavamint.proto
<a name="kava.kavamint.v1beta1.Params"></a>
### Params
Params wraps the governance parameters for the kavamint module
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `community_pool_inflation` | [string](#string) | | yearly inflation of total token supply minted to the community pool. |
| `staking_rewards_apy` | [string](#string) | | yearly inflation of bonded tokens minted for staking rewards to validators. |
<!-- end messages -->
<!-- end enums -->
<!-- end HasExtensions -->
<!-- end services -->
<a name="kava/kavamint/v1beta1/genesis.proto"></a>
<p align="right"><a href="#top">Top</a></p>
## kava/kavamint/v1beta1/genesis.proto
<a name="kava.kavamint.v1beta1.GenesisState"></a>
### GenesisState
GenesisState defines the kavamint module's genesis state.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `params` | [Params](#kava.kavamint.v1beta1.Params) | | Params defines all the parameters of the module. |
| `previous_block_time` | [google.protobuf.Timestamp](#google.protobuf.Timestamp) | | PreviousBlockTime holds the last last time tokens were minted. On first block, tokens will be minted for total number of seconds passed since this time. |
<!-- end messages -->
<!-- end enums -->
<!-- end HasExtensions -->
<!-- end services -->
<a name="kava/kavamint/v1beta1/query.proto"></a>
<p align="right"><a href="#top">Top</a></p>
## kava/kavamint/v1beta1/query.proto
<a name="kava.kavamint.v1beta1.QueryInflationRequest"></a>
### QueryInflationRequest
QueryInflationRequest is the request type for the Query/Inflation RPC method.
<a name="kava.kavamint.v1beta1.QueryInflationResponse"></a>
### QueryInflationResponse
QueryInflationResponse is the response type for the Query/Inflation RPC method.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `inflation` | [string](#string) | | inflation is the current minting inflation value. example "0.990000000000000000" - 99% inflation |
<a name="kava.kavamint.v1beta1.QueryParamsRequest"></a>
### QueryParamsRequest
QueryParamsRequest defines the request type for querying x/kavamint parameters.
<a name="kava.kavamint.v1beta1.QueryParamsResponse"></a>
### QueryParamsResponse
QueryParamsResponse defines the response type for querying x/kavamint parameters.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `params` | [Params](#kava.kavamint.v1beta1.Params) | | |
<!-- end messages -->
<!-- end enums -->
<!-- end HasExtensions -->
<a name="kava.kavamint.v1beta1.Query"></a>
### Query
Query defines the gRPC querier service for kavamint.
| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
| ----------- | ------------ | ------------- | ------------| ------- | -------- |
| `Params` | [QueryParamsRequest](#kava.kavamint.v1beta1.QueryParamsRequest) | [QueryParamsResponse](#kava.kavamint.v1beta1.QueryParamsResponse) | Params queries the parameters of x/kavamint module. | GET|/kava/kavamint/v1beta1/params|
| `Inflation` | [QueryInflationRequest](#kava.kavamint.v1beta1.QueryInflationRequest) | [QueryInflationResponse](#kava.kavamint.v1beta1.QueryInflationResponse) | Inflation queries x/kavamint for the overall cumulative inflation rate of KAVA. | GET|/kava/kavamint/v1beta1/inflation|
<!-- end services -->
<a name="kava/liquid/v1beta1/query.proto"></a> <a name="kava/liquid/v1beta1/query.proto"></a>
<p align="right"><a href="#top">Top</a></p> <p align="right"><a href="#top">Top</a></p>

View File

@ -1,23 +0,0 @@
syntax = "proto3";
package kava.kavamint.v1beta1;
import "gogoproto/gogo.proto";
import "google/protobuf/timestamp.proto";
import "kava/kavamint/v1beta1/kavamint.proto";
option go_package = "github.com/kava-labs/kava/x/kavamint/types";
// GenesisState defines the kavamint module's genesis state.
message GenesisState {
option (gogoproto.goproto_getters) = false;
// Params defines all the parameters of the module.
Params params = 1 [(gogoproto.nullable) = false];
// PreviousBlockTime holds the last last time tokens were minted.
// On first block, tokens will be minted for total number of seconds passed since this time.
google.protobuf.Timestamp previous_block_time = 2 [
(gogoproto.stdtime) = true,
(gogoproto.nullable) = false
];
}

View File

@ -1,26 +0,0 @@
syntax = "proto3";
package kava.kavamint.v1beta1;
import "cosmos_proto/cosmos.proto";
import "gogoproto/gogo.proto";
option go_package = "github.com/kava-labs/kava/x/kavamint/types";
// Params wraps the governance parameters for the kavamint module
message Params {
option (gogoproto.goproto_stringer) = false;
option (gogoproto.goproto_getters) = false;
// yearly inflation of total token supply minted to the community pool.
string community_pool_inflation = 1 [
(cosmos_proto.scalar) = "cosmos.Dec",
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false
];
// yearly inflation of bonded tokens minted for staking rewards to validators.
string staking_rewards_apy = 2 [
(cosmos_proto.scalar) = "cosmos.Dec",
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false
];
}

View File

@ -1,44 +0,0 @@
syntax = "proto3";
package kava.kavamint.v1beta1;
import "cosmos_proto/cosmos.proto";
import "gogoproto/gogo.proto";
import "google/api/annotations.proto";
import "kava/kavamint/v1beta1/kavamint.proto";
option go_package = "github.com/kava-labs/kava/x/kavamint/types";
// Query defines the gRPC querier service for kavamint.
service Query {
// Params queries the parameters of x/kavamint module.
rpc Params(QueryParamsRequest) returns (QueryParamsResponse) {
option (google.api.http).get = "/kava/kavamint/v1beta1/params";
}
// Inflation queries x/kavamint for the overall cumulative inflation rate of KAVA.
rpc Inflation(QueryInflationRequest) returns (QueryInflationResponse) {
option (google.api.http).get = "/kava/kavamint/v1beta1/inflation";
}
}
// QueryParamsRequest defines the request type for querying x/kavamint parameters.
message QueryParamsRequest {}
// QueryParamsResponse defines the response type for querying x/kavamint parameters.
message QueryParamsResponse {
Params params = 1 [(gogoproto.nullable) = false];
}
// QueryInflationRequest is the request type for the Query/Inflation RPC method.
message QueryInflationRequest {}
// QueryInflationResponse is the response type for the Query/Inflation RPC method.
message QueryInflationResponse {
// inflation is the current minting inflation value.
// example "0.990000000000000000" - 99% inflation
string inflation = 1 [
(cosmos_proto.scalar) = "cosmos.Dec",
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false
];
}

View File

@ -38,7 +38,6 @@ import (
"github.com/kava-labs/kava/app" "github.com/kava-labs/kava/app"
"github.com/kava-labs/kava/x/evmutil/keeper" "github.com/kava-labs/kava/x/evmutil/keeper"
"github.com/kava-labs/kava/x/evmutil/types" "github.com/kava-labs/kava/x/evmutil/types"
kavaminttypes "github.com/kava-labs/kava/x/kavamint/types"
) )
type Suite struct { type Suite struct {
@ -348,14 +347,7 @@ func (suite *Suite) SendTx(
} }
func (suite *Suite) MintFeeCollector(coins sdk.Coins) { func (suite *Suite) MintFeeCollector(coins sdk.Coins) {
err := suite.App.GetBankKeeper().MintCoins(suite.Ctx, kavaminttypes.ModuleAccountName, coins) err := suite.App.FundModuleAccount(suite.Ctx, authtypes.FeeCollectorName, coins)
suite.Require().NoError(err)
err = suite.App.GetBankKeeper().SendCoinsFromModuleToModule(
suite.Ctx,
kavaminttypes.ModuleAccountName,
authtypes.FeeCollectorName,
coins,
)
suite.Require().NoError(err) suite.Require().NoError(err)
} }

View File

@ -26,7 +26,7 @@ type Keeper struct {
earnKeeper types.EarnKeeper earnKeeper types.EarnKeeper
// Keepers used for APY queries // Keepers used for APY queries
kavamintKeeper types.KavamintKeeper mintKeeper types.MintKeeper
distrKeeper types.DistrKeeper distrKeeper types.DistrKeeper
pricefeedKeeper types.PricefeedKeeper pricefeedKeeper types.PricefeedKeeper
} }
@ -36,7 +36,7 @@ func NewKeeper(
cdc codec.Codec, key sdk.StoreKey, paramstore types.ParamSubspace, bk types.BankKeeper, cdc codec.Codec, key sdk.StoreKey, paramstore types.ParamSubspace, bk types.BankKeeper,
cdpk types.CdpKeeper, hk types.HardKeeper, ak types.AccountKeeper, stk types.StakingKeeper, cdpk types.CdpKeeper, hk types.HardKeeper, ak types.AccountKeeper, stk types.StakingKeeper,
swpk types.SwapKeeper, svk types.SavingsKeeper, lqk types.LiquidKeeper, ek types.EarnKeeper, swpk types.SwapKeeper, svk types.SavingsKeeper, lqk types.LiquidKeeper, ek types.EarnKeeper,
kmk types.KavamintKeeper, dk types.DistrKeeper, pfk types.PricefeedKeeper, mk types.MintKeeper, dk types.DistrKeeper, pfk types.PricefeedKeeper,
) Keeper { ) Keeper {
if !paramstore.HasKeyTable() { if !paramstore.HasKeyTable() {
paramstore = paramstore.WithKeyTable(types.ParamKeyTable()) paramstore = paramstore.WithKeyTable(types.ParamKeyTable())
@ -56,7 +56,7 @@ func NewKeeper(
liquidKeeper: lqk, liquidKeeper: lqk,
earnKeeper: ek, earnKeeper: ek,
kavamintKeeper: kmk, mintKeeper: mk,
distrKeeper: dk, distrKeeper: dk,
pricefeedKeeper: pfk, pricefeedKeeper: pfk,
} }

View File

@ -8,11 +8,11 @@ import (
"github.com/cosmos/cosmos-sdk/x/distribution" "github.com/cosmos/cosmos-sdk/x/distribution"
distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
"github.com/cosmos/cosmos-sdk/x/mint"
earntypes "github.com/kava-labs/kava/x/earn/types" earntypes "github.com/kava-labs/kava/x/earn/types"
"github.com/kava-labs/kava/x/incentive" "github.com/kava-labs/kava/x/incentive"
"github.com/kava-labs/kava/x/incentive/testutil" "github.com/kava-labs/kava/x/incentive/testutil"
"github.com/kava-labs/kava/x/incentive/types" "github.com/kava-labs/kava/x/incentive/types"
"github.com/kava-labs/kava/x/kavamint"
liquidtypes "github.com/kava-labs/kava/x/liquid/types" liquidtypes "github.com/kava-labs/kava/x/liquid/types"
) )
@ -53,7 +53,7 @@ func (suite *HandlerTestSuite) TestEarnLiquidClaim() {
// bk := suite.App.GetBankKeeper() // bk := suite.App.GetBankKeeper()
sk := suite.App.GetStakingKeeper() sk := suite.App.GetStakingKeeper()
lq := suite.App.GetLiquidKeeper() lq := suite.App.GetLiquidKeeper()
mk := suite.App.GetKavamintKeeper() mk := suite.App.GetMintKeeper()
dk := suite.App.GetDistrKeeper() dk := suite.App.GetDistrKeeper()
ik := suite.App.GetIncentiveKeeper() ik := suite.App.GetIncentiveKeeper()
@ -62,9 +62,9 @@ func (suite *HandlerTestSuite) TestEarnLiquidClaim() {
suite.Require().True(found) suite.Require().True(found)
suite.Require().Equal("bkava", period.CollateralType) suite.Require().Equal("bkava", period.CollateralType)
// Ensure nonzero staking APY // Use ukava for mint denom
mParams := mk.GetParams(suite.Ctx) mParams := mk.GetParams(suite.Ctx)
mParams.StakingRewardsApy = sdk.NewDecWithPrec(20, 2) mParams.MintDenom = "ukava"
mk.SetParams(suite.Ctx, mParams) mk.SetParams(suite.Ctx, mParams)
bkavaDenom1 := lq.GetLiquidStakingTokenDenom(valAddr1) bkavaDenom1 := lq.GetLiquidStakingTokenDenom(valAddr1)
@ -138,7 +138,10 @@ func (suite *HandlerTestSuite) TestEarnLiquidClaim() {
WithBlockTime(suite.Ctx.BlockTime().Add(7 * time.Second)) WithBlockTime(suite.Ctx.BlockTime().Add(7 * time.Second))
// Mint tokens // Mint tokens
kavamint.BeginBlocker(suite.Ctx, suite.App.GetKavamintKeeper()) mint.BeginBlocker(
suite.Ctx,
suite.App.GetMintKeeper(),
)
// Distribute to validators, block needs votes // Distribute to validators, block needs votes
distribution.BeginBlocker( distribution.BeginBlocker(
suite.Ctx, suite.Ctx,
@ -163,10 +166,10 @@ func (suite *HandlerTestSuite) TestEarnLiquidClaim() {
// Zero rewards since this block is the same as the block it was last claimed // Zero rewards since this block is the same as the block it was last claimed
// This needs to run **after** staking rewards are minted/distributed in // This needs to run **after** staking rewards are minted/distributed in
// x/kavamint + x/distribution but **before** the x/incentive BeginBlocker. // x/mint + x/distribution but **before** the x/incentive BeginBlocker.
// Order of operations: // Order of operations:
// 1. x/kavamint + x/distribution BeginBlocker // 1. x/mint + x/distribution BeginBlocker
// 2. CalculateDelegationRewards // 2. CalculateDelegationRewards
// 3. x/incentive BeginBlocker to claim staking rewards // 3. x/incentive BeginBlocker to claim staking rewards
delegationRewards := dk.CalculateDelegationRewards(suite.Ctx, validator1, delegation, endingPeriod) delegationRewards := dk.CalculateDelegationRewards(suite.Ctx, validator1, delegation, endingPeriod)

View File

@ -422,8 +422,18 @@ func queryGetAPYs(ctx sdk.Context, req abci.RequestQuery, k Keeper, legacyQuerie
// GetStakingAPR returns the total APR for staking and incentive rewards // GetStakingAPR returns the total APR for staking and incentive rewards
func GetStakingAPR(ctx sdk.Context, k Keeper, params types.Params) (sdk.Dec, error) { func GetStakingAPR(ctx sdk.Context, k Keeper, params types.Params) (sdk.Dec, error) {
// Get staking APR // Get staking APR + incentive APR
stakingAPR := k.kavamintKeeper.GetStakingApy(ctx) inflationRate := k.mintKeeper.GetMinter(ctx).Inflation
communityTax := k.distrKeeper.GetCommunityTax(ctx)
bondedTokens := k.stakingKeeper.TotalBondedTokens(ctx)
circulatingSupply := k.bankKeeper.GetSupply(ctx, types.BondDenom)
// Staking APR = (Inflation Rate * (1 - Community Tax)) / (Bonded Tokens / Circulating Supply)
stakingAPR := inflationRate.
Mul(sdk.OneDec().Sub(communityTax)).
Quo(bondedTokens.ToDec().
Quo(circulatingSupply.Amount.ToDec()))
// Get incentive APR // Get incentive APR
bkavaRewardPeriod, found := params.EarnRewardPeriods.GetMultiRewardPeriod(liquidtypes.DefaultDerivativeDenom) bkavaRewardPeriod, found := params.EarnRewardPeriods.GetMultiRewardPeriod(liquidtypes.DefaultDerivativeDenom)

View File

@ -5,6 +5,7 @@ import (
"time" "time"
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
pricefeedtypes "github.com/kava-labs/kava/x/pricefeed/types" pricefeedtypes "github.com/kava-labs/kava/x/pricefeed/types"
earntypes "github.com/kava-labs/kava/x/earn/types" earntypes "github.com/kava-labs/kava/x/earn/types"
@ -29,18 +30,6 @@ func (suite *QuerierTestSuite) TestGetStakingAPR() {
liquidStakedTokens := int64(60_000_000_000000) liquidStakedTokens := int64(60_000_000_000000)
totalSupply := int64(289_138_414_286684) totalSupply := int64(289_138_414_286684)
// inflation values below are used to regression test the switch from x/mint to x/kavamint
// rather than define the total inflation w/ a community tax, we now directly define
// inflation for staking rewards & inflation for the community pool.
// derive these values from the above values in order to verify no change to output
bondedRatio := sdk.NewDec(bondedTokens).Quo(sdk.NewDec(totalSupply))
communityInflation := inflation.
Mul(communityTax).
Quo(bondedRatio)
stakingRewardsApy := inflation.
Mul(sdk.OneDec().Sub(communityTax)).
Quo(bondedRatio)
usdcDenom := "erc20/multichain/usdc" usdcDenom := "erc20/multichain/usdc"
usdcSupply := int64(2_500_000_000000) usdcSupply := int64(2_500_000_000000)
@ -49,10 +38,12 @@ func (suite *QuerierTestSuite) TestGetStakingAPR() {
addVault(usdcDenom, earntypes.NewVaultShare(usdcDenom, sdk.NewDec(usdcSupply))) addVault(usdcDenom, earntypes.NewVaultShare(usdcDenom, sdk.NewDec(usdcSupply)))
suite.keeper = suite.NewTestKeeper(&fakeParamSubspace{}). suite.keeper = suite.NewTestKeeper(&fakeParamSubspace{}).
WithKavamintKeeper( WithDistrKeeper(
newFakeKavamintKeeper(). newFakeDistrKeeper().setCommunityTax(communityTax),
setCommunityInflation(communityInflation). ).
setStakingApy(stakingRewardsApy), WithMintKeeper(
newFakeMintKeeper().
setMinter(minttypes.NewMinter(inflation, sdk.OneDec())),
). ).
WithStakingKeeper( WithStakingKeeper(
newFakeStakingKeeper().addBondedTokens(bondedTokens), newFakeStakingKeeper().addBondedTokens(bondedTokens),

View File

@ -64,9 +64,11 @@ func (suite *AccumulateEarnRewardsIntegrationTests) SetupTest() {
stakingBuilder := testutil.NewStakingGenesisBuilder() stakingBuilder := testutil.NewStakingGenesisBuilder()
kavamintBuilder := testutil.NewKavamintGenesisBuilder(). mintBuilder := testutil.NewMintGenesisBuilder().
WithStakingRewardsApy(sdk.MustNewDecFromStr("0.2")). WithInflationMax(sdk.OneDec()).
WithPreviousBlockTime(suite.GenesisTime) WithInflationMin(sdk.OneDec()).
WithMinter(sdk.OneDec(), sdk.ZeroDec()).
WithMintDenom("ukava")
suite.StartChainWithBuilders( suite.StartChainWithBuilders(
authBuilder, authBuilder,
@ -74,7 +76,7 @@ func (suite *AccumulateEarnRewardsIntegrationTests) SetupTest() {
savingsBuilder, savingsBuilder,
earnBuilder, earnBuilder,
stakingBuilder, stakingBuilder,
kavamintBuilder, mintBuilder,
) )
} }
@ -311,7 +313,7 @@ func (suite *AccumulateEarnRewardsIntegrationTests) TestStateUpdatedWhenBlockTim
}, },
{ {
CollateralType: "ukava", CollateralType: "ukava",
RewardFactor: d("4.154285714285714286").Add(stakingRewardIndexes0), RewardFactor: d("4.154285714285714285").Add(stakingRewardIndexes0),
}, },
}) })

View File

@ -63,9 +63,11 @@ func (suite *EarnStakingRewardsIntegrationTestSuite) SetupTest() {
stakingBuilder := testutil.NewStakingGenesisBuilder() stakingBuilder := testutil.NewStakingGenesisBuilder()
kavamintBuilder := testutil.NewKavamintGenesisBuilder(). mintBuilder := testutil.NewMintGenesisBuilder().
WithStakingRewardsApy(sdk.MustNewDecFromStr("0.2")). WithInflationMax(sdk.OneDec()).
WithPreviousBlockTime(suite.GenesisTime) WithInflationMin(sdk.OneDec()).
WithMinter(sdk.OneDec(), sdk.ZeroDec()).
WithMintDenom("ukava")
suite.StartChainWithBuilders( suite.StartChainWithBuilders(
authBuilder, authBuilder,
@ -73,7 +75,7 @@ func (suite *EarnStakingRewardsIntegrationTestSuite) SetupTest() {
savingsBuilder, savingsBuilder,
earnBuilder, earnBuilder,
stakingBuilder, stakingBuilder,
kavamintBuilder, mintBuilder,
) )
} }
@ -134,7 +136,6 @@ func (suite *EarnStakingRewardsIntegrationTestSuite) TestStakingRewardsDistribut
suite.keeper.SetEarnRewardAccrualTime(suite.Ctx, vaultDenom1, suite.Ctx.BlockTime()) suite.keeper.SetEarnRewardAccrualTime(suite.Ctx, vaultDenom1, suite.Ctx.BlockTime())
suite.keeper.SetEarnRewardAccrualTime(suite.Ctx, vaultDenom2, suite.Ctx.BlockTime()) suite.keeper.SetEarnRewardAccrualTime(suite.Ctx, vaultDenom2, suite.Ctx.BlockTime())
suite.App.GetKavamintKeeper().SetPreviousBlockTime(suite.Ctx, suite.Ctx.BlockTime())
val := suite.GetAbciValidator(suite.valAddrs[0]) val := suite.GetAbciValidator(suite.valAddrs[0])

View File

@ -8,6 +8,7 @@ import (
"github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/store" "github.com/cosmos/cosmos-sdk/store"
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
pricefeedtypes "github.com/kava-labs/kava/x/pricefeed/types" pricefeedtypes "github.com/kava-labs/kava/x/pricefeed/types"
@ -153,7 +154,7 @@ type TestKeeperBuilder struct {
earnKeeper types.EarnKeeper earnKeeper types.EarnKeeper
// Keepers used for APY queries // Keepers used for APY queries
kavamintKeeper types.KavamintKeeper mintKeeper types.MintKeeper
distrKeeper types.DistrKeeper distrKeeper types.DistrKeeper
pricefeedKeeper types.PricefeedKeeper pricefeedKeeper types.PricefeedKeeper
} }
@ -178,6 +179,7 @@ func (suite *unitTester) NewTestKeeper(
savingsKeeper: nil, savingsKeeper: nil,
liquidKeeper: nil, liquidKeeper: nil,
earnKeeper: nil, earnKeeper: nil,
mintKeeper: nil,
distrKeeper: nil, distrKeeper: nil,
pricefeedKeeper: nil, pricefeedKeeper: nil,
} }
@ -203,8 +205,8 @@ func (tk *TestKeeperBuilder) WithStakingKeeper(k types.StakingKeeper) *TestKeepe
return tk return tk
} }
func (tk *TestKeeperBuilder) WithKavamintKeeper(k types.KavamintKeeper) *TestKeeperBuilder { func (tk *TestKeeperBuilder) WithMintKeeper(k types.MintKeeper) *TestKeeperBuilder {
tk.kavamintKeeper = k tk.mintKeeper = k
return tk return tk
} }
@ -223,7 +225,7 @@ func (tk *TestKeeperBuilder) Build() keeper.Keeper {
tk.cdc, tk.key, tk.paramSubspace, tk.cdc, tk.key, tk.paramSubspace,
tk.bankKeeper, tk.cdpKeeper, tk.hardKeeper, tk.accountKeeper, tk.bankKeeper, tk.cdpKeeper, tk.hardKeeper, tk.accountKeeper,
tk.stakingKeeper, tk.swapKeeper, tk.savingsKeeper, tk.liquidKeeper, tk.stakingKeeper, tk.swapKeeper, tk.savingsKeeper, tk.liquidKeeper,
tk.earnKeeper, tk.kavamintKeeper, tk.distrKeeper, tk.pricefeedKeeper, tk.earnKeeper, tk.mintKeeper, tk.distrKeeper, tk.pricefeedKeeper,
) )
} }
@ -641,29 +643,23 @@ func (k *fakeDistrKeeper) GetCommunityTax(ctx sdk.Context) (percent sdk.Dec) {
return k.communityTax return k.communityTax
} }
type fakeKavamintKeeper struct { type fakeMintKeeper struct {
stakingApy sdk.Dec minter minttypes.Minter
communityInflation sdk.Dec
} }
var _ types.KavamintKeeper = newFakeKavamintKeeper() var _ types.MintKeeper = newFakeMintKeeper()
func newFakeKavamintKeeper() *fakeKavamintKeeper { func newFakeMintKeeper() *fakeMintKeeper {
return &fakeKavamintKeeper{} return &fakeMintKeeper{}
} }
func (k *fakeKavamintKeeper) setStakingApy(apy sdk.Dec) *fakeKavamintKeeper { func (k *fakeMintKeeper) setMinter(minter minttypes.Minter) *fakeMintKeeper {
k.stakingApy = apy k.minter = minter
return k return k
} }
func (k *fakeKavamintKeeper) setCommunityInflation(inflation sdk.Dec) *fakeKavamintKeeper { func (k *fakeMintKeeper) GetMinter(ctx sdk.Context) (minter minttypes.Minter) {
k.communityInflation = inflation return k.minter
return k
}
func (k *fakeKavamintKeeper) GetStakingApy(ctx sdk.Context) (apy sdk.Dec) {
return k.stakingApy
} }
type fakePricefeedKeeper struct { type fakePricefeedKeeper struct {

View File

@ -1,59 +0,0 @@
package testutil
import (
"time"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/kava-labs/kava/app"
kavaminttypes "github.com/kava-labs/kava/x/kavamint/types"
)
// KavamintGenesisBuilder is a tool for creating a mint genesis state.
// Helper methods add values onto a default genesis state.
// All methods are immutable and return updated copies of the builder.
type KavamintGenesisBuilder struct {
kavaminttypes.GenesisState
}
var _ GenesisBuilder = (*KavamintGenesisBuilder)(nil)
func NewKavamintGenesisBuilder() KavamintGenesisBuilder {
gen := kavaminttypes.DefaultGenesisState()
gen.Params.CommunityPoolInflation = sdk.ZeroDec()
gen.Params.StakingRewardsApy = sdk.ZeroDec()
return KavamintGenesisBuilder{
GenesisState: *gen,
}
}
func (builder KavamintGenesisBuilder) Build() kavaminttypes.GenesisState {
return builder.GenesisState
}
func (builder KavamintGenesisBuilder) BuildMarshalled(cdc codec.JSONCodec) app.GenesisState {
built := builder.Build()
return app.GenesisState{
kavaminttypes.ModuleName: cdc.MustMarshalJSON(&built),
}
}
func (builder KavamintGenesisBuilder) WithPreviousBlockTime(t time.Time) KavamintGenesisBuilder {
builder.PreviousBlockTime = t
return builder
}
func (builder KavamintGenesisBuilder) WithStakingRewardsApy(apy sdk.Dec) KavamintGenesisBuilder {
builder.Params.StakingRewardsApy = apy
return builder
}
func (builder KavamintGenesisBuilder) WithCommunityPoolInflation(
inflation sdk.Dec,
) KavamintGenesisBuilder {
builder.Params.CommunityPoolInflation = inflation
return builder
}

View File

@ -0,0 +1,68 @@
package testutil
import (
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/kava-labs/kava/app"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
)
// MintGenesisBuilder is a tool for creating a mint genesis state.
// Helper methods add values onto a default genesis state.
// All methods are immutable and return updated copies of the builder.
type MintGenesisBuilder struct {
minttypes.GenesisState
}
var _ GenesisBuilder = (*MintGenesisBuilder)(nil)
func NewMintGenesisBuilder() MintGenesisBuilder {
gen := minttypes.DefaultGenesisState()
gen.Params.MintDenom = "ukava"
return MintGenesisBuilder{
GenesisState: *gen,
}
}
func (builder MintGenesisBuilder) Build() minttypes.GenesisState {
return builder.GenesisState
}
func (builder MintGenesisBuilder) BuildMarshalled(cdc codec.JSONCodec) app.GenesisState {
built := builder.Build()
return app.GenesisState{
minttypes.ModuleName: cdc.MustMarshalJSON(&built),
}
}
func (builder MintGenesisBuilder) WithMinter(
inflation sdk.Dec,
annualProvisions sdk.Dec,
) MintGenesisBuilder {
builder.Minter = minttypes.NewMinter(inflation, annualProvisions)
return builder
}
func (builder MintGenesisBuilder) WithInflationMax(
inflationMax sdk.Dec,
) MintGenesisBuilder {
builder.Params.InflationMax = inflationMax
return builder
}
func (builder MintGenesisBuilder) WithInflationMin(
inflationMin sdk.Dec,
) MintGenesisBuilder {
builder.Params.InflationMin = inflationMin
return builder
}
func (builder MintGenesisBuilder) WithMintDenom(
mintDenom string,
) MintGenesisBuilder {
builder.Params.MintDenom = mintDenom
return builder
}

View File

@ -3,6 +3,7 @@ package types
import ( import (
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
cdptypes "github.com/kava-labs/kava/x/cdp/types" cdptypes "github.com/kava-labs/kava/x/cdp/types"
@ -93,9 +94,9 @@ type AccountKeeper interface {
GetModuleAccount(ctx sdk.Context, name string) authtypes.ModuleAccountI GetModuleAccount(ctx sdk.Context, name string) authtypes.ModuleAccountI
} }
// KavamintKeeper defines the required methods needed by this modules keeper // MintKeeper defines the required methods needed by this modules keeper
type KavamintKeeper interface { type MintKeeper interface {
GetStakingApy(ctx sdk.Context) sdk.Dec GetMinter(ctx sdk.Context) (minter minttypes.Minter)
} }
// DistrKeeper defines the required methods needed by this modules keeper // DistrKeeper defines the required methods needed by this modules keeper

View File

@ -1,13 +0,0 @@
package kavamint
import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/kava-labs/kava/x/kavamint/keeper"
)
// BeginBlocker mints & distributes new tokens for the previous block.
func BeginBlocker(ctx sdk.Context, k keeper.KeeperI) {
if err := k.AccumulateAndMintInflation(ctx); err != nil {
panic(err)
}
}

View File

@ -1,216 +0,0 @@
package kavamint_test
import (
"testing"
"time"
sdk "github.com/cosmos/cosmos-sdk/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
"github.com/cosmos/cosmos-sdk/x/staking"
"github.com/stretchr/testify/suite"
communitytypes "github.com/kava-labs/kava/x/community/types"
"github.com/kava-labs/kava/x/kavamint"
"github.com/kava-labs/kava/x/kavamint/keeper"
"github.com/kava-labs/kava/x/kavamint/testutil"
"github.com/kava-labs/kava/x/kavamint/types"
)
type abciTestSuite struct {
testutil.KavamintTestSuite
}
func (suite *abciTestSuite) SetupTest() {
suite.KavamintTestSuite.SetupTest()
}
func (suite abciTestSuite) CheckModuleBalance(ctx sdk.Context, moduleName string, expectedAmount sdk.Int) {
denom := suite.StakingKeeper.BondDenom(ctx)
amount := suite.App.GetModuleAccountBalance(ctx, moduleName, denom)
suite.Require().Equal(expectedAmount, amount)
}
func (suite *abciTestSuite) CheckFeeCollectorBalance(ctx sdk.Context, expectedAmount sdk.Int) {
suite.CheckModuleBalance(ctx, authtypes.FeeCollectorName, expectedAmount)
}
func (suite *abciTestSuite) CheckKavamintBalance(ctx sdk.Context, expectedAmount sdk.Int) {
suite.CheckModuleBalance(ctx, types.ModuleName, expectedAmount)
}
func (suite *abciTestSuite) CheckCommunityPoolBalance(ctx sdk.Context, expectedAmount sdk.Int) {
suite.CheckModuleBalance(ctx, communitytypes.ModuleAccountName, expectedAmount)
}
func TestABCITestSuite(t *testing.T) {
suite.Run(t, new(abciTestSuite))
}
func (suite *abciTestSuite) Test_BeginBlocker_MintsExpectedTokens() {
testCases := []struct {
name string
blockTime uint64
communityPoolInflation sdk.Dec
stakingRewardsApy sdk.Dec
bondedRatio sdk.Dec
setup func()
expCommunityPoolBalance sdk.Int
expFeeCollectorBalance sdk.Int
}{
{
name: "sanity check: a year of seconds mints total yearly inflation",
blockTime: keeper.SecondsPerYear,
communityPoolInflation: sdk.NewDecWithPrec(20, 2),
stakingRewardsApy: sdk.NewDecWithPrec(20, 2),
bondedRatio: sdk.NewDecWithPrec(50, 2),
// 20% inflation on 1e10 tokens -> 2e9 minted
expCommunityPoolBalance: sdk.NewInt(2e9),
// 20% APY, 50% bonded (5e9) -> 1e9 minted
expFeeCollectorBalance: sdk.NewInt(1e9),
},
{
name: "mints staking rewards, handles 0 community pool inflation",
blockTime: 6,
communityPoolInflation: sdk.ZeroDec(),
stakingRewardsApy: sdk.NewDecWithPrec(20, 2),
bondedRatio: sdk.NewDecWithPrec(40, 2),
expCommunityPoolBalance: sdk.ZeroInt(),
// 20% APY for 6 seconds
// bond ratio is 40%, so total supply * ratio = 1e10 * .4
// https://www.wolframalpha.com/input?i2d=true&i=%5C%2840%29Power%5B%5C%2840%29Surd%5B1.20%2C31536000%5D%5C%2841%29%2C6%5D-1%5C%2841%29*1e10*.4
// => 138.75 => truncated to 138 tokens.
expFeeCollectorBalance: sdk.NewInt(138),
},
{
name: "mints community pool inflation, handles 0 staking rewards",
blockTime: 6,
communityPoolInflation: sdk.NewDecWithPrec(80, 2),
stakingRewardsApy: sdk.ZeroDec(),
bondedRatio: sdk.NewDecWithPrec(40, 2),
// 80% APY for 6 seconds
// total supply = 1e10
// https://www.wolframalpha.com/input?i2d=true&i=%5C%2840%29Power%5B%5C%2840%29Surd%5B1.80%2C31536000%5D%5C%2841%29%2C6%5D-1%5C%2841%29*1e10
// => 1118.32 => truncated to 1118 tokens.
expCommunityPoolBalance: sdk.NewInt(1118),
expFeeCollectorBalance: sdk.ZeroInt(),
},
{
name: "mints no tokens if all inflation is zero",
blockTime: 6,
communityPoolInflation: sdk.ZeroDec(),
stakingRewardsApy: sdk.ZeroDec(),
bondedRatio: sdk.NewDecWithPrec(40, 2),
expCommunityPoolBalance: sdk.ZeroInt(),
expFeeCollectorBalance: sdk.ZeroInt(),
},
{
name: "mints no tokens if zero seconds passed",
blockTime: 0,
communityPoolInflation: sdk.NewDecWithPrec(50, 2),
stakingRewardsApy: sdk.NewDecWithPrec(20, 2),
bondedRatio: sdk.NewDecWithPrec(35, 2),
expCommunityPoolBalance: sdk.ZeroInt(),
expFeeCollectorBalance: sdk.ZeroInt(),
},
{
name: "mints community pool inflation and staking rewards",
blockTime: 6,
communityPoolInflation: sdk.NewDecWithPrec(50, 2),
stakingRewardsApy: sdk.NewDecWithPrec(20, 2),
bondedRatio: sdk.NewDecWithPrec(35, 2),
// 50% APY for 6 seconds
// total supply = 1e10
// https://www.wolframalpha.com/input?i2d=true&i=%5C%2840%29Power%5B%5C%2840%29Surd%5B1.5%2C31536000%5D%5C%2841%29%2C6%5D-1%5C%2841%29*1e10
// => 771.43 => truncated to 771 tokens.
expCommunityPoolBalance: sdk.NewInt(771),
// 20% APY for 6 seconds
// total bonded = 1e10 * 35%
// https://www.wolframalpha.com/input?i2d=true&i=%5C%2840%29Power%5B%5C%2840%29Surd%5B1.20%2C31536000%5D%5C%2841%29%2C6%5D-1%5C%2841%29*1e10*.35
// => 121.41 => truncated to 121 tokens.
expFeeCollectorBalance: sdk.NewInt(121),
},
{
name: "handles long block time",
blockTime: 60, // a minute
communityPoolInflation: sdk.NewDecWithPrec(50, 2),
stakingRewardsApy: sdk.NewDecWithPrec(20, 2),
bondedRatio: sdk.NewDecWithPrec(35, 2),
// https://www.wolframalpha.com/input?i2d=true&i=%5C%2840%29Power%5B%5C%2840%29Surd%5B1.5%2C31536000%5D%5C%2841%29%2C60%5D-1%5C%2841%29*1e10
expCommunityPoolBalance: sdk.NewInt(7714),
// https://www.wolframalpha.com/input?i2d=true&i=%5C%2840%29Power%5B%5C%2840%29Surd%5B1.20%2C31536000%5D%5C%2841%29%2C60%5D-1%5C%2841%29*1e10*.35
expFeeCollectorBalance: sdk.NewInt(1214),
},
{
name: "handles extra long block time",
blockTime: 3 * 3600, // three hours
communityPoolInflation: sdk.NewDecWithPrec(50, 2),
stakingRewardsApy: sdk.NewDecWithPrec(20, 2),
bondedRatio: sdk.NewDecWithPrec(35, 2),
// https://www.wolframalpha.com/input?i2d=true&i=%5C%2840%29Power%5B%5C%2840%29Surd%5B1.5%2C31536000%5D%5C%2841%29%2C3*3600%5D-1%5C%2841%29*1e10
expCommunityPoolBalance: sdk.NewInt(1388675),
// https://www.wolframalpha.com/input?i2d=true&i=%5C%2840%29Power%5B%5C%2840%29Surd%5B1.20%2C31536000%5D%5C%2841%29%2C3*3600%5D-1%5C%2841%29*1e10*.35
expFeeCollectorBalance: sdk.NewInt(218542),
},
}
for _, tc := range testCases {
suite.Run(tc.name, func() {
suite.SetupTest()
// set store and params
suite.Keeper.SetPreviousBlockTime(suite.Ctx, suite.Ctx.BlockTime())
suite.Keeper.SetParams(
suite.Ctx,
types.NewParams(tc.communityPoolInflation, tc.stakingRewardsApy),
)
// set bonded token ratio
suite.SetBondedTokenRatio(tc.bondedRatio)
staking.EndBlocker(suite.Ctx, suite.StakingKeeper)
// run begin blocker
kavamint.BeginBlocker(suite.Ctx, suite.Keeper)
// expect everything empty to start
suite.CheckFeeCollectorBalance(suite.Ctx, sdk.ZeroInt())
suite.CheckKavamintBalance(suite.Ctx, sdk.ZeroInt())
suite.CheckCommunityPoolBalance(suite.Ctx, sdk.ZeroInt())
// expect initial block time set
startBlockTime := suite.Keeper.GetPreviousBlockTime(suite.Ctx)
suite.Require().False(startBlockTime.IsZero())
suite.Require().Equal(suite.Ctx.BlockTime(), startBlockTime)
// run begin blocker again to mint inflation
ctx2 := suite.Ctx.WithBlockTime(suite.Ctx.BlockTime().Add(time.Second * time.Duration(tc.blockTime)))
kavamint.BeginBlocker(ctx2, suite.Keeper)
// check expected balances
suite.CheckCommunityPoolBalance(ctx2, tc.expCommunityPoolBalance)
suite.CheckFeeCollectorBalance(ctx2, tc.expFeeCollectorBalance)
// x/kavamint balance should always be 0 because 100% should be transferred out every block
suite.CheckKavamintBalance(ctx2, sdk.ZeroInt())
// expect time to be updated
endBlockTime := suite.Keeper.GetPreviousBlockTime(ctx2)
suite.Require().False(endBlockTime.IsZero())
suite.Require().Equal(ctx2.BlockTime(), endBlockTime)
})
}
}
func (suite *abciTestSuite) Test_BeginBlocker_DefaultsToBlockTime() {
suite.SetupTest()
// unset previous block time
suite.Keeper.SetPreviousBlockTime(suite.Ctx, time.Time{})
// run begin blocker
kavamint.BeginBlocker(suite.Ctx, suite.Keeper)
// ensure block time gets set
blockTime := suite.Keeper.GetPreviousBlockTime(suite.Ctx)
suite.False(blockTime.IsZero())
suite.Equal(suite.Ctx.BlockTime(), blockTime)
}

View File

@ -1,89 +0,0 @@
package cli
import (
"fmt"
"github.com/spf13/cobra"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/kava-labs/kava/x/kavamint/types"
)
// GetQueryCmd returns the cli query commands for the minting module.
func GetQueryCmd() *cobra.Command {
mintingQueryCmd := &cobra.Command{
Use: types.ModuleName,
Short: "Querying commands for the minting module",
DisableFlagParsing: true,
SuggestionsMinimumDistance: 2,
RunE: client.ValidateCmd,
}
mintingQueryCmd.AddCommand(
GetCmdQueryParams(),
GetCmdQueryInflation(),
)
return mintingQueryCmd
}
// GetCmdQueryParams implements a command to return the current minting
// parameters.
func GetCmdQueryParams() *cobra.Command {
cmd := &cobra.Command{
Use: "params",
Short: "Query the current minting parameters",
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientQueryContext(cmd)
if err != nil {
return err
}
queryClient := types.NewQueryClient(clientCtx)
params := &types.QueryParamsRequest{}
res, err := queryClient.Params(cmd.Context(), params)
if err != nil {
return err
}
return clientCtx.PrintProto(&res.Params)
},
}
flags.AddQueryFlagsToCmd(cmd)
return cmd
}
// GetCmdQueryInflation implements a command to return the current minting
// inflation value.
func GetCmdQueryInflation() *cobra.Command {
cmd := &cobra.Command{
Use: "inflation",
Short: "Query the current cumulative minting inflation value",
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientQueryContext(cmd)
if err != nil {
return err
}
queryClient := types.NewQueryClient(clientCtx)
params := &types.QueryInflationRequest{}
res, err := queryClient.Inflation(cmd.Context(), params)
if err != nil {
return err
}
return clientCtx.PrintString(fmt.Sprintf("%s\n", res.Inflation))
},
}
flags.AddQueryFlagsToCmd(cmd)
return cmd
}

View File

@ -1,38 +0,0 @@
package kavamint
import (
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
"github.com/kava-labs/kava/x/kavamint/keeper"
"github.com/kava-labs/kava/x/kavamint/types"
)
// InitGenesis new mint genesis
func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, ak types.AccountKeeper, gs *types.GenesisState) {
// guard against invalid genesis
if err := gs.Validate(); err != nil {
panic(fmt.Sprintf("failed to validate %s genesis state: %s", types.ModuleName, err))
}
// get module account -- creates one with allowed permissions if it does not exist
macc := ak.GetModuleAccount(ctx, types.ModuleName)
if macc == nil {
panic(fmt.Sprintf("%s module account has not been set", types.ModuleName))
}
// check module account has minter permissions
if !macc.HasPermission(authtypes.Minter) {
panic(fmt.Sprintf("%s module account does not have %s permissions", types.ModuleName, authtypes.Minter))
}
// set store state from genesis
keeper.SetParams(ctx, gs.Params)
keeper.SetPreviousBlockTime(ctx, gs.PreviousBlockTime)
}
// ExportGenesis returns a GenesisState for a given context and keeper.
func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) *types.GenesisState {
return types.NewGenesisState(keeper.GetParams(ctx), keeper.GetPreviousBlockTime(ctx))
}

View File

@ -1,117 +0,0 @@
package kavamint_test
import (
"testing"
"time"
"github.com/kava-labs/kava/x/kavamint"
"github.com/kava-labs/kava/x/kavamint/testutil"
"github.com/kava-labs/kava/x/kavamint/types"
"github.com/stretchr/testify/suite"
sdk "github.com/cosmos/cosmos-sdk/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
)
type genesisTestSuite struct {
testutil.KavamintTestSuite
}
func (suite *genesisTestSuite) Test_InitGenesis_ValidationPanic() {
invalidState := types.NewGenesisState(
types.NewParams(sdk.OneDec(), types.MaxMintingRate.Add(sdk.OneDec())), // rate over max
time.Time{},
)
suite.Panics(func() {
kavamint.InitGenesis(suite.Ctx, suite.Keeper, suite.App.GetAccountKeeper(), invalidState)
}, "expected init genesis to panic with invalid state")
}
func (suite *genesisTestSuite) Test_InitGenesis_ModuleAccountDoesNotHaveMinterPerms() {
gs := types.DefaultGenesisState()
ak := suite.App.GetAccountKeeper()
macc := ak.GetModuleAccount(suite.Ctx, types.ModuleName)
suite.Require().NotNil(macc)
m, ok := macc.(*authtypes.ModuleAccount)
suite.Require().True(ok)
m.Permissions = []string{}
ak.SetAccount(suite.Ctx, m)
suite.PanicsWithValue("kavamint module account does not have minter permissions", func() {
kavamint.InitGenesis(suite.Ctx, suite.Keeper, suite.App.GetAccountKeeper(), gs)
})
}
func (suite *genesisTestSuite) Test_InitGenesis_CreatesModuleAccountWithPermissions() {
gs := types.DefaultGenesisState()
ak := suite.App.GetAccountKeeper()
kavamint.InitGenesis(suite.Ctx, suite.Keeper, ak, gs)
// by pass auto creation of module accounts
addr, _ := ak.GetModuleAddressAndPermissions(types.ModuleName)
acc := suite.App.GetAccountKeeper().GetAccount(suite.Ctx, addr)
suite.Require().NotNil(acc)
macc, ok := acc.(authtypes.ModuleAccountI)
suite.Require().True(ok)
suite.True(macc.HasPermission(authtypes.Minter))
}
func (suite *genesisTestSuite) Test_InitAndExportGenesis_DefaultValues() {
state := types.DefaultGenesisState()
kavamint.InitGenesis(suite.Ctx, suite.Keeper, suite.App.GetAccountKeeper(), state)
suite.Equal(types.DefaultParams(), suite.Keeper.GetParams(suite.Ctx), "expected default params to bet set in store")
storeTime := suite.Keeper.GetPreviousBlockTime(suite.Ctx)
suite.Equal(types.DefaultPreviousBlockTime, storeTime, "expected default previous block time to be set in store")
exportedState := kavamint.ExportGenesis(suite.Ctx, suite.Keeper)
suite.Equal(state, exportedState, "expected exported state to match imported state")
}
func (suite *genesisTestSuite) Test_InitAndExportGenesis_SetValues() {
prevBlockTime := time.Date(1998, 1, 1, 0, 0, 0, 0, time.UTC)
state := types.NewGenesisState(
types.NewParams(sdk.MustNewDecFromStr("0.000000000000000001"), sdk.MustNewDecFromStr("0.000000000000000002")),
prevBlockTime,
)
kavamint.InitGenesis(suite.Ctx, suite.Keeper, suite.App.GetAccountKeeper(), state)
suite.Equal(state.Params, suite.Keeper.GetParams(suite.Ctx), "expected params to bet set in store")
storeTime := suite.Keeper.GetPreviousBlockTime(suite.Ctx)
suite.Equal(state.PreviousBlockTime, storeTime, "expected previous block time to be set in store")
exportedState := kavamint.ExportGenesis(suite.Ctx, suite.Keeper)
suite.Equal(state, exportedState, "expected exported state to match imported state")
}
func (suite *genesisTestSuite) Test_InitAndExportGenesis_ZeroValues() {
state := types.NewGenesisState(
types.NewParams(sdk.ZeroDec(), sdk.ZeroDec()),
time.Time{},
)
kavamint.InitGenesis(suite.Ctx, suite.Keeper, suite.App.GetAccountKeeper(), state)
suite.Equal(state.Params, suite.Keeper.GetParams(suite.Ctx), "expected params to bet set in store")
storeTime := suite.Keeper.GetPreviousBlockTime(suite.Ctx)
suite.Equal(state.PreviousBlockTime, storeTime, "expected previous block time to be set in store")
exportedState := kavamint.ExportGenesis(suite.Ctx, suite.Keeper)
suite.Equal(state, exportedState, "expected exported state to match imported state")
}
func TestGenesisTestSuite(t *testing.T) {
suite.Run(t, new(genesisTestSuite))
}

View File

@ -1,85 +0,0 @@
package keeper
import (
"context"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
sdk "github.com/cosmos/cosmos-sdk/types"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
"github.com/kava-labs/kava/x/kavamint/types"
)
var _ types.QueryServer = Keeper{}
// Params returns params of the mint module.
func (k Keeper) Params(c context.Context, _ *types.QueryParamsRequest) (*types.QueryParamsResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
params := k.GetParams(ctx)
return &types.QueryParamsResponse{Params: params}, nil
}
// Inflation returns minter.Inflation of the mint module.
func (k Keeper) Inflation(c context.Context, _ *types.QueryInflationRequest) (*types.QueryInflationResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
inflation := k.CumulativeInflation(ctx)
return &types.QueryInflationResponse{Inflation: inflation}, nil
}
// MintQueryServer implements cosmos sdk's x/mint querier.
// x/mint was removed from kava, but the standard inflation endpoint is still registered
// for easier third party integration and backwards compatibility.
type MintQueryServer struct {
keeper Keeper
}
// NewMintQueryServer returns a service that implements x/mint's QueryServer
func NewMintQueryServer(kavamintKeeper Keeper) MintQueryServer {
return MintQueryServer{kavamintKeeper}
}
var _ minttypes.QueryServer = MintQueryServer{}
// Params is not implemented. There is no mint module.
func (MintQueryServer) Params(
_ context.Context, _ *minttypes.QueryParamsRequest,
) (*minttypes.QueryParamsResponse, error) {
return nil, status.Error(codes.Unimplemented, "x/mint has been replaced by x/kavamint")
}
// Inflation returns an adjusted inflation rate.
// The `/cosmos/mint/v1beta1/inflation` endpoint is used by third parties to calculate staking APY.
// The usual staking APY calculation takes the inflation and determines the portion of it devoted
// to staking rewards after adjusting for the bonded ratio and x/distribution community_tax.
// staking_apy = (inflation - community_tax) * total_supply / total_bonded
// Staking APY is not set directly via the x/kavamint staking_rewards_apy param.
// This endpoint returns the inflation that makes the above calculation equal to the param:
// inflation = staking_apy * total_bonded / total_supply
// NOTE: assumes x/distribution community_tax = 0
func (mq MintQueryServer) Inflation(
c context.Context, _ *minttypes.QueryInflationRequest,
) (*minttypes.QueryInflationResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
stakingApy := mq.keeper.GetParams(ctx).StakingRewardsApy
totalBonded := mq.keeper.totalBondedTokens(ctx)
totalSupply := mq.keeper.totalSupply(ctx)
// inflation = staking_apy * total_bonded / total_supply
inflation := stakingApy.MulInt(totalBonded).QuoInt(totalSupply)
return &minttypes.QueryInflationResponse{
Inflation: inflation,
}, nil
}
// AnnualProvisions is not implemented.
func (MintQueryServer) AnnualProvisions(
_ context.Context, _ *minttypes.QueryAnnualProvisionsRequest,
) (*minttypes.QueryAnnualProvisionsResponse, error) {
return nil, status.Error(codes.Unimplemented, "x/mint has been replaced by x/kavamint")
}

View File

@ -1,159 +0,0 @@
package keeper_test
import (
"context"
"testing"
"github.com/stretchr/testify/suite"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"github.com/cosmos/cosmos-sdk/baseapp"
sdk "github.com/cosmos/cosmos-sdk/types"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
"github.com/cosmos/cosmos-sdk/x/staking"
"github.com/kava-labs/kava/x/kavamint/keeper"
"github.com/kava-labs/kava/x/kavamint/testutil"
"github.com/kava-labs/kava/x/kavamint/types"
)
type grpcQueryTestSuite struct {
testutil.KavamintTestSuite
queryClient types.QueryClient
mintQueryClient minttypes.QueryClient
}
func (suite *grpcQueryTestSuite) SetupTest() {
suite.KavamintTestSuite.SetupTest()
queryHelper := baseapp.NewQueryServerTestHelper(suite.Ctx, suite.App.InterfaceRegistry())
types.RegisterQueryServer(queryHelper, suite.Keeper)
suite.queryClient = types.NewQueryClient(queryHelper)
mintQueryServer := keeper.NewMintQueryServer(suite.Keeper)
minttypes.RegisterQueryServer(queryHelper, mintQueryServer)
suite.mintQueryClient = minttypes.NewQueryClient(queryHelper)
}
func TestGRPCQueryTestSuite(t *testing.T) {
suite.Run(t, new(grpcQueryTestSuite))
}
func (suite *grpcQueryTestSuite) TestGRPCQueryParams() {
app, ctx, queryClient := suite.App, suite.Ctx, suite.queryClient
kavamintKeeper := app.GetKavamintKeeper()
params, err := queryClient.Params(context.Background(), &types.QueryParamsRequest{})
suite.Require().NoError(err)
suite.Require().Equal(params.Params, kavamintKeeper.GetParams(ctx))
}
func (suite *grpcQueryTestSuite) TestGRPCInflationQuery() {
testCases := []struct {
name string
communityInflation sdk.Dec
stakingApy sdk.Dec
bondedRatio sdk.Dec
expectedInflation sdk.Dec
}{
{
name: "no community inflation, no staking apy = no inflation",
communityInflation: sdk.NewDec(0),
stakingApy: sdk.NewDec(0),
bondedRatio: sdk.NewDecWithPrec(40, 2),
expectedInflation: sdk.NewDec(0),
},
{
name: "no community inflation means only staking contributes",
communityInflation: sdk.NewDec(0),
stakingApy: sdk.NewDec(1),
bondedRatio: sdk.NewDecWithPrec(34, 2),
expectedInflation: sdk.NewDecWithPrec(34, 2),
},
{
name: "no staking apy means only inflation contributes",
communityInflation: sdk.NewDecWithPrec(75, 2),
stakingApy: sdk.NewDec(0),
bondedRatio: sdk.NewDecWithPrec(40, 2),
expectedInflation: sdk.NewDecWithPrec(75, 2),
},
{
name: "staking and community inflation combines (100 percent bonded)",
communityInflation: sdk.NewDec(1),
stakingApy: sdk.NewDecWithPrec(50, 2),
bondedRatio: sdk.NewDec(1),
expectedInflation: sdk.NewDecWithPrec(150, 2),
},
{
name: "staking and community inflation combines (40 percent bonded)",
communityInflation: sdk.NewDecWithPrec(90, 2),
stakingApy: sdk.NewDecWithPrec(25, 2),
bondedRatio: sdk.NewDecWithPrec(40, 2),
// 90 + .4*25 = 100
expectedInflation: sdk.NewDec(1),
},
{
name: "staking and community inflation combines (25 percent bonded)",
communityInflation: sdk.NewDecWithPrec(90, 2),
stakingApy: sdk.NewDecWithPrec(20, 2),
bondedRatio: sdk.NewDecWithPrec(25, 2),
// 90 + .25*20 = 95
expectedInflation: sdk.NewDecWithPrec(95, 2),
},
}
for _, tc := range testCases {
suite.Run(tc.name, func() {
suite.SetupTest()
app, ctx, queryClient := suite.App, suite.Ctx, suite.queryClient
kavamintKeeper := app.GetKavamintKeeper()
// set desired params
kavamintKeeper.SetParams(ctx, types.NewParams(tc.communityInflation, tc.stakingApy))
// set bonded token ratio
suite.SetBondedTokenRatio(tc.bondedRatio)
staking.EndBlocker(ctx, suite.StakingKeeper)
// query inflation & check for expected results
inflation, err := queryClient.Inflation(context.Background(), &types.QueryInflationRequest{})
suite.Require().NoError(err)
suite.Require().Equal(inflation.Inflation, kavamintKeeper.CumulativeInflation(ctx))
suite.Require().Equal(inflation.Inflation, tc.expectedInflation)
// ensure overridden x/mint query for inflation returns the adjusted inflation
// the adjusted inflation is the inflation that returns the correct staking apy for the
// standard staking apy calculation used by third parties:
// staking_apy = (inflation - community_tax) * total_supply / total_bonded
// => inflation = staking_apy * total_bonded / total_supply
expectedAdjustedInflation := tc.stakingApy.Mul(tc.bondedRatio)
mintQ, err := suite.mintQueryClient.Inflation(
context.Background(),
&minttypes.QueryInflationRequest{},
)
suite.NoError(err)
suite.Equal(expectedAdjustedInflation, mintQ.Inflation)
})
}
}
func (suite *grpcQueryTestSuite) TestUnimplementedMintQueries() {
suite.SetupTest()
suite.Run("Params is unimplemented", func() {
_, err := suite.mintQueryClient.Params(context.Background(), nil)
suite.Error(err)
suite.Equal(codes.Unimplemented, status.Code(err))
})
suite.Run("AnnualProvisions is unimplemented", func() {
_, err := suite.mintQueryClient.AnnualProvisions(context.Background(), nil)
suite.Error(err)
suite.Equal(codes.Unimplemented, status.Code(err))
})
}

View File

@ -1,146 +0,0 @@
package keeper
import (
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/kava-labs/kava/x/kavamint/types"
)
// this is the same value used in the x/hard
const (
SecondsPerYear = uint64(31536000)
)
// Minter wraps the logic of a single source of inflation. It calculates the amount of coins to be
// minted to match a yearly `rate` of inflating the `basis`.
type Minter struct {
name string // name of the minting. used as event attribute to report how much is minted
rate sdk.Dec // the yearly apy of the mint. ex. 20% => 0.2
basis sdk.Int // the base amount of coins that is inflated
destMaccName string // the destination module account name to mint coins to
mintDenom string // denom of coin this minter is responsible for minting
}
// NewMinter returns creates a new source of minting inflation
func NewMinter(
name string, rate sdk.Dec, basis sdk.Int, mintDenom string, destMaccName string,
) Minter {
return Minter{
name: name,
rate: rate,
basis: basis,
destMaccName: destMaccName,
mintDenom: mintDenom,
}
}
// AccumulateInflation calculates the number of coins that should be minted to match a yearly `rate`
// for interest compounded each second of the year over `secondsPassed` seconds.
// `basis` is the base amount of coins that is inflated.
func (m Minter) AccumulateInflation(secondsPassed uint64) (sdk.Coin, error) {
// calculate the rate factor based on apy & seconds passed since last block
inflationRate, err := m.CalculateInflationRate(secondsPassed)
if err != nil {
return sdk.Coin{}, err
}
amount := inflationRate.MulInt(m.basis).TruncateInt()
return sdk.NewCoin(m.mintDenom, amount), nil
}
// CalculateInflationRate converts an APY into the factor corresponding with that APY's accumulation
// over a period of secondsPassed seconds.
func (m Minter) CalculateInflationRate(secondsPassed uint64) (sdk.Dec, error) {
perSecondInterestRate, err := apyToSpy(m.rate.Add(sdk.OneDec()))
if err != nil {
return sdk.ZeroDec(), err
}
rate := perSecondInterestRate.Power(secondsPassed)
return rate.Sub(sdk.OneDec()), nil
}
// AccumulateAndMintInflation defines the sources of inflation, determines the seconds passed since
// the last mint, and then mints each source of inflation to the defined destination.
func (k Keeper) AccumulateAndMintInflation(ctx sdk.Context) error {
params := k.GetParams(ctx)
// determine seconds since last mint
previousBlockTime := k.GetPreviousBlockTime(ctx)
if previousBlockTime.IsZero() {
previousBlockTime = ctx.BlockTime()
}
secondsPassed := ctx.BlockTime().Sub(previousBlockTime).Seconds()
// calculate totals before any minting is done to prevent new mints affecting the values
totalSupply := k.totalSupply(ctx)
totalBonded := k.totalBondedTokens(ctx)
bondDenom := k.bondDenom(ctx)
// define minters for each contributing piece of inflation
minters := []Minter{
// staking rewards
NewMinter(
types.AttributeKeyStakingRewardMint,
params.StakingRewardsApy,
totalBonded,
bondDenom,
k.stakingRewardsFeeCollectorName,
),
// community pool inflation
NewMinter(
types.AttributeKeyCommunityPoolMint,
params.CommunityPoolInflation,
totalSupply,
bondDenom,
k.communityPoolModuleAccountName,
),
}
mintEventAttrs := make([]sdk.Attribute, 0, len(minters))
for _, minter := range minters {
// calculate amount for time passed
amount, err := minter.AccumulateInflation(uint64(secondsPassed))
if err != nil {
return err
}
// mint & transfer coins
inflation := sdk.NewCoins(amount)
if err := k.mintCoinsToModule(ctx, inflation, minter.destMaccName); err != nil {
return err
}
// add attribute to event
mintEventAttrs = append(mintEventAttrs, sdk.NewAttribute(
minter.name,
inflation.String(),
))
}
// ------------- Bookkeeping -------------
// bookkeep the previous block time
k.SetPreviousBlockTime(ctx, ctx.BlockTime())
ctx.EventManager().EmitEvent(
sdk.NewEvent(
types.EventTypeMint,
sdk.NewAttribute(types.AttributeKeyTotalSupply, totalSupply.String()),
sdk.NewAttribute(types.AttributeKeyTotalBonded, totalBonded.String()),
sdk.NewAttribute(types.AttributeSecondsPassed, fmt.Sprintf("%f", secondsPassed)),
).AppendAttributes(mintEventAttrs...),
)
return nil
}
// apyToSpy converts the input annual interest rate. For example, 10% apy would be passed as 1.10.
// SPY = Per second compounded interest rate is how cosmos mathematically represents APY.
func apyToSpy(apy sdk.Dec) (sdk.Dec, error) {
// Note: any APY greater than 176.5 will cause an out-of-bounds error
root, err := apy.ApproxRoot(SecondsPerYear)
if err != nil {
return sdk.ZeroDec(), err
}
return root, nil
}

View File

@ -1,167 +0,0 @@
package keeper_test
import (
"fmt"
"testing"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/kava-labs/kava/x/kavamint/keeper"
"github.com/kava-labs/kava/x/kavamint/types"
"github.com/stretchr/testify/suite"
)
type InflationTestSuite struct {
suite.Suite
}
func TestInflationTestSuite(t *testing.T) {
suite.Run(t, new(InflationTestSuite))
}
func (suite *InflationTestSuite) TestCalculateInflationFactor() {
testCases := []struct {
name string
apy sdk.Dec
secondsPassed uint64
expectedRate sdk.Dec
// preciseToDecimal is the decimal place after which error is present. if >=18, number is exact.
// ex. precise to 3 decimals means accurate to +/-0.0005
preciseToDecimal int
}{
{
name: "any apy over 0 seconds is 0",
apy: sdk.OneDec(),
secondsPassed: 0,
expectedRate: sdk.ZeroDec(),
preciseToDecimal: 19,
},
{
name: "zero apy for any number of seconds is 0",
apy: sdk.ZeroDec(),
secondsPassed: 100,
expectedRate: sdk.ZeroDec(),
preciseToDecimal: 19,
},
{
name: "an apy over a year's worth of seconds should be the apy",
apy: sdk.NewDecWithPrec(10, 2),
secondsPassed: keeper.SecondsPerYear,
expectedRate: sdk.NewDecWithPrec(10, 2),
preciseToDecimal: 10,
},
{
name: "example: 22 percent for 6 seconds, precise to 17 decimals",
apy: sdk.NewDecWithPrec(22, 2),
secondsPassed: 6,
expectedRate: sdk.MustNewDecFromStr("0.000000037833116915"),
preciseToDecimal: 17,
},
{
name: "example: 3 percent for 10 seconds, precise to 17 decimals",
apy: sdk.NewDecWithPrec(3, 2),
secondsPassed: 10,
expectedRate: sdk.MustNewDecFromStr("0.000000009373034748"),
preciseToDecimal: 17,
},
{
name: "example: 150 percent for 10 seconds, precise to 17 decimals",
apy: sdk.NewDecWithPrec(150, 2),
secondsPassed: 10,
expectedRate: sdk.MustNewDecFromStr("0.000000290553927255"),
preciseToDecimal: 17,
},
{
name: "example: 10 percent for 10 seconds, precise to 16 decimals",
apy: sdk.NewDecWithPrec(10, 2),
secondsPassed: 10,
expectedRate: sdk.MustNewDecFromStr("0.000000030222660212"),
preciseToDecimal: 16,
},
{
name: "example: 1,000 percent for 10 seconds, precise to 16 decimals",
apy: sdk.NewDecWithPrec(1000, 2),
secondsPassed: 10,
expectedRate: sdk.MustNewDecFromStr("0.000000760367892072"),
preciseToDecimal: 16,
},
{
name: "example: 10 percent for 30 seconds, precise to 16 decimals",
apy: sdk.NewDecWithPrec(10, 2),
secondsPassed: 30,
expectedRate: sdk.MustNewDecFromStr("0.00000009066798338"),
preciseToDecimal: 16,
},
{
name: "example: 95 percent for 15 seconds, precise to 16 decimals",
apy: sdk.NewDecWithPrec(95, 2),
secondsPassed: 15,
expectedRate: sdk.MustNewDecFromStr("0.000000317651007726"),
preciseToDecimal: 16,
},
{
name: "example: 10,000 percent for 10 seconds, precise to 13 decimals",
apy: sdk.NewDecWithPrec(10000, 2),
secondsPassed: 10,
expectedRate: sdk.MustNewDecFromStr("0.000001463446186527"),
preciseToDecimal: 13,
},
{
name: "can handle upper bound of APY (but w/ large error)",
apy: types.MaxMintingRate,
secondsPassed: 10,
expectedRate: sdk.MustNewDecFromStr("0.000001642242155465"),
preciseToDecimal: 4, // NOTE: error is really large here
},
}
for _, tc := range testCases {
suite.Run(tc.name, func() {
minter := keeper.NewMinter(tc.name, tc.apy, sdk.ZeroInt(), "ukava", "ignored")
actualRate, err := minter.CalculateInflationRate(tc.secondsPassed)
suite.Require().NoError(err)
marginOfError := sdk.ZeroDec()
if tc.preciseToDecimal < 18 {
marginOfError = sdk.NewDecWithPrec(5, int64(tc.preciseToDecimal+1))
}
suite.requireWithinError(tc.expectedRate, actualRate, marginOfError)
})
}
suite.Run("errors with out-of-bounds when rate is too high", func() {
// Dec.ApproxRoot will error w/ out-of-bounds when rate is >176.5
oob := sdk.NewDec(177)
minter := keeper.NewMinter(
"out-of-bounds-minter",
oob,
sdk.OneInt(),
"uakva",
"ignored",
)
_, err := minter.CalculateInflationRate(100)
suite.Error(err)
// ensure max mint rate is less than out-of-bounds value
suite.True(types.MaxMintingRate.LT(oob))
})
}
func (suite *InflationTestSuite) Test_AccumulateInflation_FailsWithInvalidRate() {
oob := sdk.NewDec(177)
minter := keeper.NewMinter(
"out-of-bounds-minter",
oob,
sdk.OneInt(),
"uakva",
"ignored",
)
_, err := minter.AccumulateInflation(1)
suite.ErrorContains(err, "out of bounds")
}
func (suite *InflationTestSuite) requireWithinError(expected, actual, margin sdk.Dec) {
suite.Require().Truef(
actual.Sub(expected).Abs().LTE(margin),
fmt.Sprintf("precision is outside desired margin of error %s\nexpected: %s\nactual : %s", margin, expected, actual),
)
}

View File

@ -1,161 +0,0 @@
package keeper
import (
"time"
"github.com/tendermint/tendermint/libs/log"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
"github.com/kava-labs/kava/x/kavamint/types"
)
// KeeperI is the required keeper interface for x/kavamint's begin blocker
type KeeperI interface {
AccumulateAndMintInflation(ctx sdk.Context) error
}
// Keeper of the kavamint store
type Keeper struct {
cdc codec.BinaryCodec
storeKey sdk.StoreKey
paramSpace paramtypes.Subspace
stakingKeeper types.StakingKeeper
bankKeeper types.BankKeeper
stakingRewardsFeeCollectorName string
communityPoolModuleAccountName string
}
var _ KeeperI = Keeper{}
// NewKeeper creates a new kavamint Keeper instance
func NewKeeper(
cdc codec.BinaryCodec, key sdk.StoreKey, paramSpace paramtypes.Subspace,
sk types.StakingKeeper, ak types.AccountKeeper, bk types.BankKeeper,
stakingRewardsFeeCollectorName string, communityPoolModuleAccountName string,
) Keeper {
// set KeyTable if it has not already been set
if !paramSpace.HasKeyTable() {
paramSpace = paramSpace.WithKeyTable(types.ParamKeyTable())
}
return Keeper{
cdc: cdc,
storeKey: key,
paramSpace: paramSpace,
stakingKeeper: sk,
bankKeeper: bk,
stakingRewardsFeeCollectorName: stakingRewardsFeeCollectorName,
communityPoolModuleAccountName: communityPoolModuleAccountName,
}
}
// Logger returns a module-specific logger.
func (k Keeper) Logger(ctx sdk.Context) log.Logger {
return ctx.Logger().With("module", "x/"+types.ModuleName)
}
// GetParams returns the total set of minting parameters.
func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) {
k.paramSpace.GetParamSet(ctx, &params)
return params
}
// SetParams sets the total set of minting parameters.
func (k Keeper) SetParams(ctx sdk.Context, params types.Params) {
k.paramSpace.SetParamSet(ctx, &params)
}
// GetStakingApy returns the APY minted for staking rewards
func (k Keeper) GetStakingApy(ctx sdk.Context) sdk.Dec {
params := k.GetParams(ctx)
return params.StakingRewardsApy
}
// bondDenom implements an alias call to the underlying staking keeper's BondDenom.
func (k Keeper) bondDenom(ctx sdk.Context) string {
return k.stakingKeeper.BondDenom(ctx)
}
// totalBondedTokens implements an alias call to the underlying staking keeper's
// TotalBondedTokens to be used in BeginBlocker.
func (k Keeper) totalBondedTokens(ctx sdk.Context) sdk.Int {
return k.stakingKeeper.TotalBondedTokens(ctx)
}
// mintCoinsToModule mints teh desired coins to the x/kavamint module account and then
// transfers them to the designated module account.
// if `newCoins` is empty or zero, this method is a noop.
func (k Keeper) mintCoinsToModule(ctx sdk.Context, newCoins sdk.Coins, destMaccName string) error {
if newCoins.IsZero() {
// skip as no coins need to be minted
return nil
}
// mint the coins
err := k.bankKeeper.MintCoins(ctx, types.ModuleAccountName, newCoins)
if err != nil {
return nil
}
// transfer them to the desired destination module account
return k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleAccountName, destMaccName, newCoins)
}
// totalSupply implements an alias call to the underlying supply keeper's
// GetSupply for the mint denom to be used in calculating cumulative inflation.
func (k Keeper) totalSupply(ctx sdk.Context) sdk.Int {
return k.bankKeeper.GetSupply(ctx, k.bondDenom(ctx)).Amount
}
func (k Keeper) CumulativeInflation(ctx sdk.Context) sdk.Dec {
params := k.GetParams(ctx)
totalInflation := sdk.NewDec(0)
// community pool contribution is simply the inflation param
totalInflation = totalInflation.Add(params.CommunityPoolInflation)
// staking rewards contribution is the apy * bonded_ratio
bondedSupply := k.totalBondedTokens(ctx)
totalSupply := k.totalSupply(ctx)
bondedRatio := sdk.NewDecFromInt(bondedSupply).QuoInt(totalSupply)
inflationFromStakingRewards := params.StakingRewardsApy.Mul(bondedRatio)
totalInflation = totalInflation.Add(inflationFromStakingRewards)
return totalInflation
}
// GetPreviousBlockTime get the blocktime for the previous block
func (k Keeper) GetPreviousBlockTime(ctx sdk.Context) (blockTime time.Time) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.PreviousBlockTimeKey)
b := store.Get(types.PreviousBlockTimeKey)
if b == nil {
return blockTime
}
if err := blockTime.UnmarshalBinary(b); err != nil {
panic(err)
}
return
}
// SetPreviousBlockTime set the time of the previous block
func (k Keeper) SetPreviousBlockTime(ctx sdk.Context, blockTime time.Time) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.PreviousBlockTimeKey)
if blockTime.IsZero() {
store.Delete(types.PreviousBlockTimeKey)
return
}
b, err := blockTime.MarshalBinary()
if err != nil {
panic(err)
}
store.Set(types.PreviousBlockTimeKey, b)
}

View File

@ -1,71 +0,0 @@
package keeper_test
import (
"testing"
"time"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/kava-labs/kava/x/kavamint/testutil"
"github.com/kava-labs/kava/x/kavamint/types"
"github.com/stretchr/testify/suite"
)
type keeperTestSuite struct {
testutil.KavamintTestSuite
}
func TestKeeperTestSuite(t *testing.T) {
suite.Run(t, new(keeperTestSuite))
}
func (suite keeperTestSuite) TestParams_Persistance() {
keeper := suite.Keeper
params := types.NewParams(
sdk.MustNewDecFromStr("0.000000000000000001"),
sdk.MustNewDecFromStr("0.000000000000000002"),
)
keeper.SetParams(suite.Ctx, params)
suite.Equal(keeper.GetParams(suite.Ctx), params)
oldParams := params
params = types.NewParams(
sdk.MustNewDecFromStr("0.000000000000000011"),
sdk.MustNewDecFromStr("0.000000000000000022"),
)
keeper.SetParams(suite.Ctx, params)
suite.NotEqual(keeper.GetParams(suite.Ctx), oldParams)
suite.Equal(keeper.GetParams(suite.Ctx), params)
}
func (suite keeperTestSuite) TestPreviousBlockTime_Persistance() {
keeper := suite.Keeper
zeroTime := time.Time{}
keeper.SetPreviousBlockTime(suite.Ctx, zeroTime)
suite.Equal(keeper.GetPreviousBlockTime(suite.Ctx), zeroTime)
newTime := suite.Ctx.BlockTime()
suite.Require().False(newTime.IsZero())
keeper.SetPreviousBlockTime(suite.Ctx, newTime)
suite.Equal(keeper.GetPreviousBlockTime(suite.Ctx), newTime)
}
func (suite keeperTestSuite) Test_GetStakingApy() {
suite.SetupTest()
testCases := []sdk.Dec{
sdk.ZeroDec(),
sdk.MustNewDecFromStr("0.000005"),
sdk.MustNewDecFromStr("0.15"),
sdk.OneDec(),
types.MaxMintingRate,
}
for _, tc := range testCases {
params := types.NewParams(sdk.ZeroDec(), tc)
suite.Keeper.SetParams(suite.Ctx, params)
suite.Equal(tc, suite.Keeper.GetStakingApy(suite.Ctx))
}
}

View File

@ -1,161 +0,0 @@
package kavamint
import (
"context"
"encoding/json"
"fmt"
"github.com/gorilla/mux"
"github.com/grpc-ecosystem/grpc-gateway/runtime"
"github.com/spf13/cobra"
abci "github.com/tendermint/tendermint/abci/types"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/codec"
cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
"github.com/kava-labs/kava/x/kavamint/client/cli"
"github.com/kava-labs/kava/x/kavamint/keeper"
"github.com/kava-labs/kava/x/kavamint/types"
)
var (
_ module.AppModule = AppModule{}
_ module.AppModuleBasic = AppModuleBasic{}
)
// AppModuleBasic defines the basic application module used by the kavamint module.
type AppModuleBasic struct {
cdc codec.Codec
}
var _ module.AppModuleBasic = AppModuleBasic{}
// Name returns the mint module's name.
func (AppModuleBasic) Name() string {
return types.ModuleName
}
// RegisterLegacyAminoCodec registers the kavamint module's types on the given LegacyAmino codec.
func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {}
// RegisterInterfaces registers the module's interface types
func (b AppModuleBasic) RegisterInterfaces(_ cdctypes.InterfaceRegistry) {}
// DefaultGenesis returns default genesis state as raw bytes for the mint
// module.
func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage {
return cdc.MustMarshalJSON(types.DefaultGenesisState())
}
// ValidateGenesis performs genesis state validation for the kavamint module.
func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error {
var gs types.GenesisState
if err := cdc.UnmarshalJSON(bz, &gs); err != nil {
return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err)
}
return gs.Validate()
}
// RegisterRESTRoutes registers the REST routes for the kavamint module.
func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) {}
// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the kavamint module.
func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) {
types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx))
// add x/mint query handler for better 3rd party compatibility
minttypes.RegisterQueryHandlerClient(context.Background(), mux, minttypes.NewQueryClient(clientCtx))
}
// GetTxCmd returns no root tx command for the kavamint module.
func (AppModuleBasic) GetTxCmd() *cobra.Command { return nil }
// GetQueryCmd returns the root query command for the kavamint module.
func (AppModuleBasic) GetQueryCmd() *cobra.Command {
return cli.GetQueryCmd()
}
// AppModule implements an application module for the kavamint module.
type AppModule struct {
AppModuleBasic
keeper keeper.Keeper
authKeeper types.AccountKeeper
}
// NewAppModule creates a new AppModule object
func NewAppModule(cdc codec.Codec, keeper keeper.Keeper, ak types.AccountKeeper) AppModule {
return AppModule{
AppModuleBasic: AppModuleBasic{cdc: cdc},
keeper: keeper,
authKeeper: ak,
}
}
// Name returns the kavamint module's name.
func (AppModule) Name() string {
return types.ModuleName
}
// RegisterInvariants registers the kavamint module invariants.
func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {}
// Route returns the message routing key for the kavamint module.
func (AppModule) Route() sdk.Route { return sdk.Route{} }
// QuerierRoute returns the kavamint module's querier route name.
func (AppModule) QuerierRoute() string {
return types.QuerierRoute
}
// LegacyQuerierHandler returns the kavamint module sdk.Querier.
func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier {
return nil
}
// RegisterServices registers a gRPC query service to respond to the
// module-specific gRPC queries.
func (am AppModule) RegisterServices(cfg module.Configurator) {
types.RegisterQueryServer(cfg.QueryServer(), am.keeper)
// register x/mint query server.
// x/mint was replaced by this module but we still want 3rd parties to be able to
// request the original sdk endpoints.
minttypes.RegisterQueryServer(cfg.QueryServer(), keeper.NewMintQueryServer(am.keeper))
}
// InitGenesis performs genesis initialization for the kavamint module. It returns
// no validator updates.
func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate {
var genesisState types.GenesisState
cdc.MustUnmarshalJSON(data, &genesisState)
InitGenesis(ctx, am.keeper, am.authKeeper, &genesisState)
return []abci.ValidatorUpdate{}
}
// ExportGenesis returns the exported genesis state as raw bytes for the mint
// module.
func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage {
gs := ExportGenesis(ctx, am.keeper)
return cdc.MustMarshalJSON(gs)
}
// ConsensusVersion implements AppModule/ConsensusVersion.
func (AppModule) ConsensusVersion() uint64 { return 1 }
// BeginBlock returns the begin blocker for the kavamint module.
func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) {
BeginBlocker(ctx, am.keeper)
}
// EndBlock returns the end blocker for the kavamint module. It returns no validator
// updates.
func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate {
return []abci.ValidatorUpdate{}
}

View File

@ -1,31 +0,0 @@
package kavamint_test
import (
"testing"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
"github.com/stretchr/testify/require"
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
"github.com/kava-labs/kava/app"
"github.com/kava-labs/kava/x/kavamint/types"
)
func TestKavaMintModuleAccountWithPermissionsOnAppInit(t *testing.T) {
tApp := app.NewTestApp()
ctx := tApp.NewContext(true, tmproto.Header{Height: 1})
tApp.InitializeFromGenesisStates()
ak := tApp.GetAccountKeeper()
// by pass auto creation of module accounts
addr, _ := ak.GetModuleAddressAndPermissions(types.ModuleName)
acc := ak.GetAccount(ctx, addr)
require.NotNil(t, acc, "expected module account to exist")
macc, ok := acc.(authtypes.ModuleAccountI)
require.True(t, ok)
require.True(t, macc.HasPermission(authtypes.Minter), "expected module account to have mint permissions")
}

View File

@ -1,45 +0,0 @@
<!--
order: 1
-->
# Concepts
## Singular Source of Inflation
The kavamint module mints new tokens each block. How many tokens are minted is determined by rates set in kavamint's parameters. Where the newly minted tokens are transferred to is dictated by which parameter. The kavamint module supports minting for the following purposes:
| Purpose | Parameter | Rate Based On | Transferred To |
| --------------- | ------------------------ | ----------------------- | --------------- |
| Community Pool | `CommunityPoolInflation` | TotalSupply | x/community |
| Staking Rewards | `StakingRewardsApy` | TotalSupply*BondedRatio | x/auth fee pool |
`TotalSupply` is the total number of tokens. `BondedRatio` is the percentage of those tokens that are delegated to a bonded validator.
### How Amount is Calculated
The number of seconds since the previous block is determined: `secondsSinceLastBlock`.
For each yearly rate set in the parameters, an equivalent rate for the number of seconds passed is determined assuming the rate compounds every second and, for simplicity, there are a fixed number of seconds per year (`365 x 24 x 60 x 60 = 31,536,000`). The rate compounded over `secondsSinceLastBlock` seconds is the `31,536,000`th root of `rate + 1` to the `secondsSinceLastBlock` power (minus 100% to determine number of new tokens). This number is truncated to an `sdk.Int`.
**example**:
Assume `CommunityPoolInflation` is 20%, the `TotalSupply` is 1e10 tokens and `secondsSinceLastBlock` is 5 seconds. The number of tokens minted is determined to be 289 tokens.
```math
({\sqrt[secondsPerYear]{1 + CommunityPoolInflation}}^{secondsSinceLastBlock} - 1)*TotalSupply
= ({\sqrt[31,536,000]{1.2}}^{5} - 1)*1e10
\approx 289
```
## Staking Reward Distribution
It helps to understand how newly minted tokens are created and distributed as validator rewards by default in a Cosmos SDK blockchain. In the standard Cosmos SDK mint module, tokens are minted each block based on a variable inflation rate determined by the parameters and the desired bonded token ratio. The tokens are then transferred to the auth module's fee pool to be distributed as staking rewards after a portion of the total fee pool is transferred to the community pool (determined by the CommunityTax parameter of the distribution module).
The kavamint module separates the default community pool inflation from staking rewards. For staking rewards, it uses an APY determined by StakingRewardsApy. The basis is the total bonded tokens. The tokens are distributed to the same fee pool as above so they can be distributed as rewards to delegators with the default distribution module.
## Community Pool Inflation
Every block, tokens are distributed to KAVA's community pool, the module account of x/community. The number of tokens distributed is determined by the total supply.
## Disabling Default Inflation
The intention of this module is to replace the default minting of the x/mint module. To make that the case, the minimum and maximum inflation parameters of the mint module should be set to 0. Additionally, it's recommended that the community tax parameter of the distribution module should be set to 0 as the logic for funding the community pool is controlled by kavamint.

View File

@ -1,36 +0,0 @@
<!--
order: 2
-->
# State
## Parameters and Genesis State
`Parameters` define the governance parameters that control inflation of KAVA.
Each parameter is an APY/inflation used in conjunction with the block time to
calculate how much KAVA to mint for what purposes. See [params](./05_params.md) for a description of each param.
```go
// Params wraps the governance parameters for the kavamint module
type Params struct {
// yearly inflation of total token supply minted to the community pool.
CommunityPoolInflation sdk.Dec `json:"community_pool_inflation" yaml:"community_pool_inflation"`
// yearly inflation of bonded tokens minted for staking rewards to validators.
StakingRewardsApy sdk.Dec `json:"staking_rewards_apy" yaml:"staking_rewards_apy"`
}
```
`GenesisState` defines the state that must be persisted when the blockchain stops/restarts in order for normal function of the kavamint module to resume.
```go
// GenesisState defines the kavamint module's genesis state.
type GenesisState struct {
// params defines all the parameters of the module.
Params Params `json:"params" yaml:"params"`
}
```
## Previous Block Time
The `PreviousBlockTime` is stored in the keeper and updated each block. In the BeginBlocker, the number of seconds between the current and previous block is determined and used to calculate how much KAVA should be minted for each

View File

@ -1,7 +0,0 @@
<!--
order: 3
-->
# Messages
The kavadist module contains no messages. All state transitions are controlled by parameters, which can be updated via parameter change governance proposals.

View File

@ -1,17 +0,0 @@
<!--
order: 4
-->
# Events
The kavamint module emits the following events:
## BeginBlocker
| Type | Attribute Key | Attribute Value |
| -------- | ------------------------------- | ------------------------ |
| kavamint | total_supply | {totalSupply} |
| kavamint | bonded_ratio | {bondedRatio} |
| kavamint | seconds_since_last_mint | {secondsPassed} |
| kavamint | minted_community_pool_inflation | {communityPoolInflation} |
| kavamint | minted_staking_rewards | {stakingRewardCoins} |

View File

@ -1,12 +0,0 @@
<!--
order: 5
-->
# Parameters
Example parameters for the kavamint module:
| Key | Type | Example | Description |
| ---------------------- | ------- | ---------------------- | ------------------------------------------------------------------------ |
| CommunityPoolInflation | sdk.Dec | "0.250000000000000000" | Yearly inflation rate of total token supply minted to the community pool |
| StakingRewardsAPY | sdk.Dec | "0.200000000000000000" | APY of bonded tokens minted for staking reward distribution |

View File

@ -1,21 +0,0 @@
<!--
order: 6
-->
# Begin Block
At the start of each block, new KAVA tokens are minted and distributed
```go
// BeginBlocker mints & distributes new tokens for the previous block.
func BeginBlocker(ctx sdk.Context, k Keeper) {
if err := k.AccumulateAndMintInflation(ctx); err != nil {
panic(err)
}
}
```
`AccumulateAndMintInflation` defines all sources of inflation from yearly APYs set via the parameters.
Those rates are converted to the effective rate of the yearly interest rate assuming it is
compounded once per second, for the number of seconds since the previous mint. See concepts for
more details on calculations & the defined sources of inflation.

View File

@ -1,21 +0,0 @@
<!--
order: 0
title: "Kavamint Overview"
parent:
title: "kavamint"
-->
# `kavamint`
<!-- TOC -->
1. **[Concepts](01_concepts.md)**
2. **[State](02_state.md)**
3. **[Messages](03_messages.md)**
4. **[Events](04_events.md)**
5. **[Params](05_params.md)**
6. **[BeginBlock](06_begin_block.md)**
## Abstract
`x/kavamint` is an implementation of a Cosmos SDK Module that provides for functionality and governance of overall inflation of the KAVA staking token.

View File

@ -1,61 +0,0 @@
package testutil
import (
"github.com/stretchr/testify/suite"
sdk "github.com/cosmos/cosmos-sdk/types"
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
tmtime "github.com/tendermint/tendermint/types/time"
"github.com/kava-labs/kava/app"
"github.com/kava-labs/kava/x/kavamint/keeper"
)
type KavamintTestSuite struct {
suite.Suite
App app.TestApp
Ctx sdk.Context
Keeper keeper.Keeper
StakingKeeper stakingkeeper.Keeper
BondDenom string
}
func (suite *KavamintTestSuite) SetupTest() {
app.SetSDKConfig()
suite.App = app.NewTestApp()
suite.App.InitializeFromGenesisStates()
suite.Ctx = suite.App.BaseApp.NewContext(true, tmproto.Header{Height: 1, Time: tmtime.Now()})
suite.Keeper = suite.App.GetKavamintKeeper()
suite.StakingKeeper = suite.App.GetStakingKeeper()
suite.BondDenom = suite.StakingKeeper.BondDenom(suite.Ctx)
}
// SetBondedTokenRatio mints the total supply to an account and creates a validator with a self
// delegation that makes the total staked token ratio set as desired.
// EndBlocker must be run in order for tokens to become bonded.
// returns total supply coins
func (suite *KavamintTestSuite) SetBondedTokenRatio(ratio sdk.Dec) sdk.Coins {
address := app.RandomAddress()
supplyAmount := sdk.NewInt(1e10)
totalSupply := sdk.NewCoins(sdk.NewCoin(suite.BondDenom, supplyAmount))
amountToBond := ratio.MulInt(supplyAmount).TruncateInt()
// fund account that will create validator with total supply
err := suite.App.FundAccount(suite.Ctx, address, totalSupply)
suite.Require().NoError(err)
if ratio.IsZero() {
return totalSupply
}
// create a validator with self delegation such that ratio is achieved
err = suite.App.CreateNewUnbondedValidator(suite.Ctx, sdk.ValAddress(address), amountToBond)
suite.Require().NoError(err)
return totalSupply
}

View File

@ -1,12 +0,0 @@
package types
// Minting module event types
const (
EventTypeMint = ModuleName
AttributeKeyTotalSupply = "total_supply"
AttributeKeyTotalBonded = "total_bonded"
AttributeSecondsPassed = "seconds_since_last_mint"
AttributeKeyCommunityPoolMint = "minted_community_pool_inflation"
AttributeKeyStakingRewardMint = "minted_staking_rewards"
)

View File

@ -1,26 +0,0 @@
package types // noalias
import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth/types"
)
// StakingKeeper defines the expected staking keeper
type StakingKeeper interface {
BondDenom(sdk.Context) string
TotalBondedTokens(sdk.Context) sdk.Int
}
// AccountKeeper defines the contract required for account APIs.
type AccountKeeper interface {
GetModuleAddress(name string) sdk.AccAddress
GetModuleAccount(ctx sdk.Context, moduleName string) types.ModuleAccountI
}
// BankKeeper defines the contract needed to be fulfilled for banking and supply
// dependencies.
type BankKeeper interface {
GetSupply(ctx sdk.Context, denom string) sdk.Coin
SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, recipientModule string, amt sdk.Coins) error
MintCoins(ctx sdk.Context, name string, amt sdk.Coins) error
}

View File

@ -1,32 +0,0 @@
package types
import (
time "time"
)
var (
// DefaultPreviousBlockTime represents a time that is unset -- no previous block has occured
DefaultPreviousBlockTime = time.Time{}
)
// NewGenesisState creates a new GenesisState object
func NewGenesisState(params Params, previousBlockTime time.Time) *GenesisState {
return &GenesisState{
Params: params,
PreviousBlockTime: previousBlockTime,
}
}
// DefaultGenesisState creates a default GenesisState object
func DefaultGenesisState() *GenesisState {
return &GenesisState{
Params: DefaultParams(),
PreviousBlockTime: DefaultPreviousBlockTime,
}
}
// Validate validates the provided genesis state to ensure the
// expected invariants holds.
func (gs GenesisState) Validate() error {
return gs.Params.Validate()
}

View File

@ -1,372 +0,0 @@
// Code generated by protoc-gen-gogo. DO NOT EDIT.
// source: kava/kavamint/v1beta1/genesis.proto
package types
import (
fmt "fmt"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
github_com_gogo_protobuf_types "github.com/gogo/protobuf/types"
_ "google.golang.org/protobuf/types/known/timestamppb"
io "io"
math "math"
math_bits "math/bits"
time "time"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
var _ = time.Kitchen
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
// GenesisState defines the kavamint module's genesis state.
type GenesisState struct {
// Params defines all the parameters of the module.
Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"`
// PreviousBlockTime holds the last last time tokens were minted.
// On first block, tokens will be minted for total number of seconds passed since this time.
PreviousBlockTime time.Time `protobuf:"bytes,2,opt,name=previous_block_time,json=previousBlockTime,proto3,stdtime" json:"previous_block_time"`
}
func (m *GenesisState) Reset() { *m = GenesisState{} }
func (m *GenesisState) String() string { return proto.CompactTextString(m) }
func (*GenesisState) ProtoMessage() {}
func (*GenesisState) Descriptor() ([]byte, []int) {
return fileDescriptor_179d81c8ae95ec37, []int{0}
}
func (m *GenesisState) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *GenesisState) XXX_Merge(src proto.Message) {
xxx_messageInfo_GenesisState.Merge(m, src)
}
func (m *GenesisState) XXX_Size() int {
return m.Size()
}
func (m *GenesisState) XXX_DiscardUnknown() {
xxx_messageInfo_GenesisState.DiscardUnknown(m)
}
var xxx_messageInfo_GenesisState proto.InternalMessageInfo
func init() {
proto.RegisterType((*GenesisState)(nil), "kava.kavamint.v1beta1.GenesisState")
}
func init() {
proto.RegisterFile("kava/kavamint/v1beta1/genesis.proto", fileDescriptor_179d81c8ae95ec37)
}
var fileDescriptor_179d81c8ae95ec37 = []byte{
// 286 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xce, 0x4e, 0x2c, 0x4b,
0xd4, 0x07, 0x11, 0xb9, 0x99, 0x79, 0x25, 0xfa, 0x65, 0x86, 0x49, 0xa9, 0x25, 0x89, 0x86, 0xfa,
0xe9, 0xa9, 0x79, 0xa9, 0xc5, 0x99, 0xc5, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0xa2, 0x20,
0x79, 0x3d, 0x98, 0x22, 0x3d, 0xa8, 0x22, 0x29, 0x91, 0xf4, 0xfc, 0xf4, 0x7c, 0xb0, 0x0a, 0x7d,
0x10, 0x0b, 0xa2, 0x58, 0x4a, 0x3e, 0x3d, 0x3f, 0x3f, 0x3d, 0x27, 0x55, 0x1f, 0xcc, 0x4b, 0x2a,
0x4d, 0xd3, 0x2f, 0xc9, 0xcc, 0x4d, 0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0x80, 0x2a, 0x50, 0xc1, 0x6e,
0x25, 0xdc, 0x78, 0xb0, 0x2a, 0xa5, 0xe5, 0x8c, 0x5c, 0x3c, 0xee, 0x10, 0x57, 0x04, 0x97, 0x24,
0x96, 0xa4, 0x0a, 0x59, 0x73, 0xb1, 0x15, 0x24, 0x16, 0x25, 0xe6, 0x16, 0x4b, 0x30, 0x2a, 0x30,
0x6a, 0x70, 0x1b, 0xc9, 0xea, 0x61, 0x75, 0x95, 0x5e, 0x00, 0x58, 0x91, 0x13, 0xcb, 0x89, 0x7b,
0xf2, 0x0c, 0x41, 0x50, 0x2d, 0x42, 0x21, 0x5c, 0xc2, 0x05, 0x45, 0xa9, 0x65, 0x99, 0xf9, 0xa5,
0xc5, 0xf1, 0x49, 0x39, 0xf9, 0xc9, 0xd9, 0xf1, 0x20, 0x57, 0x49, 0x30, 0x81, 0x4d, 0x92, 0xd2,
0x83, 0x38, 0x59, 0x0f, 0xe6, 0x64, 0xbd, 0x10, 0x98, 0x93, 0x9d, 0x38, 0x40, 0xc6, 0x4c, 0xb8,
0x2f, 0xcf, 0x18, 0x24, 0x08, 0x33, 0xc0, 0x09, 0xa4, 0x1f, 0xa4, 0xc2, 0x8a, 0xa5, 0x63, 0x81,
0x3c, 0x83, 0x93, 0xcb, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7,
0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0x69, 0xa5,
0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0x82, 0xbd, 0xa7, 0x9b, 0x93, 0x98, 0x54,
0x0c, 0x66, 0xe9, 0x57, 0x20, 0x02, 0xa0, 0xa4, 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0x6c, 0xb9,
0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x2f, 0x48, 0xff, 0xce, 0x91, 0x01, 0x00, 0x00,
}
func (m *GenesisState) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousBlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousBlockTime):])
if err1 != nil {
return 0, err1
}
i -= n1
i = encodeVarintGenesis(dAtA, i, uint64(n1))
i--
dAtA[i] = 0x12
{
size, err := m.Params.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintGenesis(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
return len(dAtA) - i, nil
}
func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int {
offset -= sovGenesis(v)
base := offset
for v >= 1<<7 {
dAtA[offset] = uint8(v&0x7f | 0x80)
v >>= 7
offset++
}
dAtA[offset] = uint8(v)
return base
}
func (m *GenesisState) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = m.Params.Size()
n += 1 + l + sovGenesis(uint64(l))
l = github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousBlockTime)
n += 1 + l + sovGenesis(uint64(l))
return n
}
func sovGenesis(x uint64) (n int) {
return (math_bits.Len64(x|1) + 6) / 7
}
func sozGenesis(x uint64) (n int) {
return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63))))
}
func (m *GenesisState) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenesis
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: GenesisState: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenesis
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthGenesis
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthGenesis
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field PreviousBlockTime", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenesis
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthGenesis
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthGenesis
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.PreviousBlockTime, dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGenesis(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthGenesis
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func skipGenesis(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0
depth := 0
for iNdEx < l {
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowGenesis
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
wireType := int(wire & 0x7)
switch wireType {
case 0:
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowGenesis
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
iNdEx++
if dAtA[iNdEx-1] < 0x80 {
break
}
}
case 1:
iNdEx += 8
case 2:
var length int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowGenesis
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
length |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if length < 0 {
return 0, ErrInvalidLengthGenesis
}
iNdEx += length
case 3:
depth++
case 4:
if depth == 0 {
return 0, ErrUnexpectedEndOfGroupGenesis
}
depth--
case 5:
iNdEx += 4
default:
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
}
if iNdEx < 0 {
return 0, ErrInvalidLengthGenesis
}
if depth == 0 {
return iNdEx, nil
}
}
return 0, io.ErrUnexpectedEOF
}
var (
ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling")
ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow")
ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group")
)

View File

@ -1,149 +0,0 @@
package types_test
import (
"encoding/json"
"testing"
time "time"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"sigs.k8s.io/yaml"
"github.com/kava-labs/kava/x/kavamint/types"
)
func TestGenesis_Default(t *testing.T) {
defaultGenesis := types.DefaultGenesisState()
require.NoError(t, defaultGenesis.Validate())
defaultParams := types.DefaultParams()
assert.Equal(t, defaultParams, defaultGenesis.Params)
}
func TestGenesis_Validation(t *testing.T) {
testCases := []struct {
name string
gs *types.GenesisState
expectedErr string
}{
{
"valid - default genesis is valid",
types.DefaultGenesisState(),
"",
},
{
"valid - valid genesis",
types.NewGenesisState(
newValidParams(t),
time.Now(),
),
"",
},
{
"valid - no inflation",
types.NewGenesisState(
types.NewParams(sdk.ZeroDec(), sdk.ZeroDec()),
time.Now(),
),
"",
},
{
"valid - no time set",
types.NewGenesisState(
newValidParams(t),
time.Time{},
),
"",
},
{
"invalid - community inflation param too big",
types.NewGenesisState(
types.NewParams(types.MaxMintingRate.Add(sdk.NewDecWithPrec(1, 18)), sdk.ZeroDec()),
time.Now(),
),
"invalid rate: 100.000000000000000001",
},
{
"invalid - staking reward inflation param too big",
types.NewGenesisState(
// inflation is larger than is allowed!
types.NewParams(sdk.ZeroDec(), types.MaxMintingRate.Add(sdk.NewDecWithPrec(1, 18))),
time.Now(),
),
"invalid rate: 100.000000000000000001",
},
{
"invalid - negative community inflation param",
types.NewGenesisState(
types.NewParams(sdk.OneDec().MulInt64(-1), sdk.ZeroDec()),
time.Now(),
),
"invalid rate: -1.000000000000000000",
},
{
"invalid - negative staking inflation param",
types.NewGenesisState(
types.NewParams(sdk.ZeroDec(), sdk.OneDec().MulInt64(-1)),
time.Now(),
),
"invalid rate: -1.000000000000000000",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
err := tc.gs.Validate()
if tc.expectedErr == "" {
assert.Nil(t, err)
} else {
assert.EqualError(t, err, tc.expectedErr)
}
})
}
}
func TestGenesis_JSONEncoding(t *testing.T) {
raw := `{
"params": {
"community_pool_inflation": "0.000000000000000001",
"staking_rewards_apy": "0.000000000000000002"
},
"previous_block_time": "2022-12-01T11:30:55.000000001Z"
}`
var state types.GenesisState
err := json.Unmarshal([]byte(raw), &state)
require.NoError(t, err)
assert.Equal(t, sdk.MustNewDecFromStr("0.000000000000000001"), state.Params.CommunityPoolInflation)
assert.Equal(t, sdk.MustNewDecFromStr("0.000000000000000002"), state.Params.StakingRewardsApy)
prevBlockTime, err := time.Parse(time.RFC3339, "2022-12-01T11:30:55.000000001Z")
require.NoError(t, err)
assert.Equal(t, prevBlockTime, state.PreviousBlockTime)
}
func TestGenesis_YAMLEncoding(t *testing.T) {
expected := `params:
community_pool_inflation: "0.000000000000000001"
staking_rewards_apy: "0.000000000000000002"
previous_block_time: "2022-12-01T11:30:55.000000001Z"
`
prevBlockTime, err := time.Parse(time.RFC3339, "2022-12-01T11:30:55.000000001Z")
require.NoError(t, err)
state := types.NewGenesisState(
types.NewParams(sdk.MustNewDecFromStr("0.000000000000000001"), sdk.MustNewDecFromStr("0.000000000000000002")),
prevBlockTime,
)
data, err := yaml.Marshal(state)
require.NoError(t, err)
assert.Equal(t, expected, string(data))
}

View File

@ -1,373 +0,0 @@
// Code generated by protoc-gen-gogo. DO NOT EDIT.
// source: kava/kavamint/v1beta1/kavamint.proto
package types
import (
fmt "fmt"
_ "github.com/cosmos/cosmos-proto"
github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
io "io"
math "math"
math_bits "math/bits"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
// Params wraps the governance parameters for the kavamint module
type Params struct {
// yearly inflation of total token supply minted to the community pool.
CommunityPoolInflation github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=community_pool_inflation,json=communityPoolInflation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"community_pool_inflation"`
// yearly inflation of bonded tokens minted for staking rewards to validators.
StakingRewardsApy github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=staking_rewards_apy,json=stakingRewardsApy,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"staking_rewards_apy"`
}
func (m *Params) Reset() { *m = Params{} }
func (*Params) ProtoMessage() {}
func (*Params) Descriptor() ([]byte, []int) {
return fileDescriptor_bdfe36d50f127f04, []int{0}
}
func (m *Params) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_Params.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *Params) XXX_Merge(src proto.Message) {
xxx_messageInfo_Params.Merge(m, src)
}
func (m *Params) XXX_Size() int {
return m.Size()
}
func (m *Params) XXX_DiscardUnknown() {
xxx_messageInfo_Params.DiscardUnknown(m)
}
var xxx_messageInfo_Params proto.InternalMessageInfo
func init() {
proto.RegisterType((*Params)(nil), "kava.kavamint.v1beta1.Params")
}
func init() {
proto.RegisterFile("kava/kavamint/v1beta1/kavamint.proto", fileDescriptor_bdfe36d50f127f04)
}
var fileDescriptor_bdfe36d50f127f04 = []byte{
// 293 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xc9, 0x4e, 0x2c, 0x4b,
0xd4, 0x07, 0x11, 0xb9, 0x99, 0x79, 0x25, 0xfa, 0x65, 0x86, 0x49, 0xa9, 0x25, 0x89, 0x86, 0x70,
0x01, 0xbd, 0x82, 0xa2, 0xfc, 0x92, 0x7c, 0x21, 0x51, 0x10, 0x5f, 0x0f, 0x2e, 0x08, 0x55, 0x25,
0x25, 0x99, 0x9c, 0x5f, 0x9c, 0x9b, 0x5f, 0x1c, 0x0f, 0x56, 0xa4, 0x0f, 0xe1, 0x40, 0x74, 0x48,
0x89, 0xa4, 0xe7, 0xa7, 0xe7, 0x43, 0xc4, 0x41, 0x2c, 0x88, 0xa8, 0xd2, 0x0f, 0x46, 0x2e, 0xb6,
0x80, 0xc4, 0xa2, 0xc4, 0xdc, 0x62, 0xa1, 0x32, 0x2e, 0x89, 0xe4, 0xfc, 0xdc, 0xdc, 0xd2, 0xbc,
0xcc, 0x92, 0xca, 0xf8, 0x82, 0xfc, 0xfc, 0x9c, 0xf8, 0xcc, 0xbc, 0xb4, 0x9c, 0xc4, 0x92, 0xcc,
0xfc, 0x3c, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x4e, 0x27, 0x9b, 0x13, 0xf7, 0xe4, 0x19, 0x6e, 0xdd,
0x93, 0x57, 0x4b, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0x85, 0xda, 0x01, 0xa5,
0x74, 0x8b, 0x53, 0xb2, 0xf5, 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0xf5, 0x5c, 0x52, 0x93, 0x2f, 0x6d,
0xd1, 0xe5, 0x82, 0x3a, 0xc1, 0x25, 0x35, 0x39, 0x48, 0x0c, 0x6e, 0x7a, 0x40, 0x7e, 0x7e, 0x8e,
0x27, 0xcc, 0x6c, 0xa1, 0x1c, 0x2e, 0xe1, 0xe2, 0x92, 0xc4, 0xec, 0xcc, 0xbc, 0xf4, 0xf8, 0xa2,
0xd4, 0xf2, 0xc4, 0xa2, 0x94, 0xe2, 0xf8, 0xc4, 0x82, 0x4a, 0x09, 0x26, 0x2a, 0x58, 0x29, 0x08,
0x35, 0x38, 0x08, 0x62, 0xae, 0x63, 0x41, 0xa5, 0x15, 0x47, 0xc7, 0x02, 0x79, 0x86, 0x19, 0x0b,
0xe4, 0x19, 0x9c, 0x5c, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39,
0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x0b,
0xc9, 0x32, 0x50, 0x10, 0xeb, 0xe6, 0x24, 0x26, 0x15, 0x83, 0x59, 0xfa, 0x15, 0x88, 0x98, 0x01,
0x5b, 0x9a, 0xc4, 0x06, 0x0e, 0x47, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8a, 0xce, 0xb7,
0xff, 0xb7, 0x01, 0x00, 0x00,
}
func (m *Params) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *Params) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
{
size := m.StakingRewardsApy.Size()
i -= size
if _, err := m.StakingRewardsApy.MarshalTo(dAtA[i:]); err != nil {
return 0, err
}
i = encodeVarintKavamint(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
{
size := m.CommunityPoolInflation.Size()
i -= size
if _, err := m.CommunityPoolInflation.MarshalTo(dAtA[i:]); err != nil {
return 0, err
}
i = encodeVarintKavamint(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
return len(dAtA) - i, nil
}
func encodeVarintKavamint(dAtA []byte, offset int, v uint64) int {
offset -= sovKavamint(v)
base := offset
for v >= 1<<7 {
dAtA[offset] = uint8(v&0x7f | 0x80)
v >>= 7
offset++
}
dAtA[offset] = uint8(v)
return base
}
func (m *Params) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = m.CommunityPoolInflation.Size()
n += 1 + l + sovKavamint(uint64(l))
l = m.StakingRewardsApy.Size()
n += 1 + l + sovKavamint(uint64(l))
return n
}
func sovKavamint(x uint64) (n int) {
return (math_bits.Len64(x|1) + 6) / 7
}
func sozKavamint(x uint64) (n int) {
return sovKavamint(uint64((x << 1) ^ uint64((int64(x) >> 63))))
}
func (m *Params) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowKavamint
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: Params: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field CommunityPoolInflation", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowKavamint
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthKavamint
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthKavamint
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if err := m.CommunityPoolInflation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field StakingRewardsApy", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowKavamint
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthKavamint
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthKavamint
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if err := m.StakingRewardsApy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipKavamint(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthKavamint
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func skipKavamint(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0
depth := 0
for iNdEx < l {
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowKavamint
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
wireType := int(wire & 0x7)
switch wireType {
case 0:
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowKavamint
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
iNdEx++
if dAtA[iNdEx-1] < 0x80 {
break
}
}
case 1:
iNdEx += 8
case 2:
var length int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowKavamint
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
length |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if length < 0 {
return 0, ErrInvalidLengthKavamint
}
iNdEx += length
case 3:
depth++
case 4:
if depth == 0 {
return 0, ErrUnexpectedEndOfGroupKavamint
}
depth--
case 5:
iNdEx += 4
default:
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
}
if iNdEx < 0 {
return 0, ErrInvalidLengthKavamint
}
if depth == 0 {
return iNdEx, nil
}
}
return 0, io.ErrUnexpectedEOF
}
var (
ErrInvalidLengthKavamint = fmt.Errorf("proto: negative length found during unmarshaling")
ErrIntOverflowKavamint = fmt.Errorf("proto: integer overflow")
ErrUnexpectedEndOfGroupKavamint = fmt.Errorf("proto: unexpected end of group")
)

View File

@ -1,18 +0,0 @@
package types
const (
// module name
ModuleName = "kavamint"
// ModuleAccountName is the name of the module's account
ModuleAccountName = ModuleName
// StoreKey is the default store key for mint
StoreKey = ModuleName
// QuerierRoute is the querier route for the minting store.
QuerierRoute = StoreKey
)
// PreviousBlockTimeKey is the store key for the previous block time
var PreviousBlockTimeKey = []byte{0x00}

View File

@ -1,87 +0,0 @@
package types
import (
fmt "fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
)
// Parameter keys and default values
var (
KeyCommunityPoolInflation = []byte("CommunityPoolInflation")
KeyStakingRewardsApy = []byte("StakingRewardsApy")
// default inflation values are zero
DefaultCommunityPoolInflation = sdk.ZeroDec()
DefaultStakingRewardsApy = sdk.ZeroDec()
// MaxMintingRate returns the per second rate equivalent to 10,000% per year
MaxMintingRate = sdk.NewDec(100)
)
// NewParams returns new Params with inflation rates set
func NewParams(communityPoolInflation sdk.Dec, stakingRewardsApy sdk.Dec) Params {
return Params{
CommunityPoolInflation: communityPoolInflation,
StakingRewardsApy: stakingRewardsApy,
}
}
// ParamKeyTable returns the key table for the kavamint module
func ParamKeyTable() paramtypes.KeyTable {
return paramtypes.NewKeyTable().RegisterParamSet(&Params{})
}
// ParamSetPairs implements the ParamSet interface and returns all the key/value pairs
func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs {
return paramtypes.ParamSetPairs{
paramtypes.NewParamSetPair(KeyCommunityPoolInflation, &p.CommunityPoolInflation, validateCommunityPoolInflation),
paramtypes.NewParamSetPair(KeyStakingRewardsApy, &p.StakingRewardsApy, validateStakingRewardsApy),
}
}
// DefaultParams returns default valid parameters for the kavamint module
func DefaultParams() Params {
return NewParams(DefaultCommunityPoolInflation, DefaultStakingRewardsApy)
}
// Validate checks that the parameters have valid values.
func (p *Params) Validate() error {
if err := validateCommunityPoolInflation(p.CommunityPoolInflation); err != nil {
return err
}
return validateStakingRewardsApy(p.StakingRewardsApy)
}
// String implements fmt.Stringer
func (p Params) String() string {
return fmt.Sprintf(`Params:
CommunityPoolInflation: %s
StakingRewardsApy: %s`,
p.CommunityPoolInflation, p.StakingRewardsApy)
}
func validateCommunityPoolInflation(i interface{}) error {
rate, ok := i.(sdk.Dec)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}
return validateRate(rate)
}
func validateStakingRewardsApy(i interface{}) error {
rate, ok := i.(sdk.Dec)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}
return validateRate(rate)
}
// validateRate ensures rate is properly initialized (non-nil), not negative, and not greater than the max rate
func validateRate(rate sdk.Dec) error {
if rate.IsNil() || rate.IsNegative() || rate.GT(MaxMintingRate) {
return fmt.Errorf(fmt.Sprintf("invalid rate: %s", rate))
}
return nil
}

View File

@ -1,297 +0,0 @@
package types_test
import (
"bytes"
"encoding/json"
fmt "fmt"
"reflect"
"testing"
"github.com/kava-labs/kava/x/kavamint/types"
sdk "github.com/cosmos/cosmos-sdk/types"
paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"sigs.k8s.io/yaml"
)
const secondsPerYear = 31536000
func newValidParams(t *testing.T) types.Params {
// 50%
poolRate := sdk.MustNewDecFromStr("0.5")
// 10%
stakingRate := sdk.MustNewDecFromStr("0.1")
params := types.NewParams(poolRate, stakingRate)
require.NoError(t, params.Validate())
return params
}
func TestParams_Default(t *testing.T) {
defaultParams := types.DefaultParams()
require.NoError(t, defaultParams.Validate(), "default parameters must be valid")
assert.Equal(t, types.DefaultCommunityPoolInflation, defaultParams.CommunityPoolInflation, "expected default pool inflation to match exported default value")
assert.Equal(t, defaultParams.CommunityPoolInflation, sdk.ZeroDec(), "expected default pool inflation to be zero")
assert.Equal(t, types.DefaultStakingRewardsApy, defaultParams.StakingRewardsApy, "expected default staking inflation to match exported default value")
assert.Equal(t, defaultParams.CommunityPoolInflation, sdk.ZeroDec(), "expected default staking inflation to be zero")
}
func TestParams_MaxInflationRate_ApproxRootDoesNotPanic(t *testing.T) {
require.Equal(t, sdk.NewDec(100), types.MaxMintingRate) // 10,000%, should never be a reason to exceed this value
maxYearlyRate := types.MaxMintingRate
require.NotPanics(t, func() {
expectedMaxRate, err := maxYearlyRate.ApproxRoot(secondsPerYear)
require.NoError(t, err)
expectedMaxRate = expectedMaxRate.Sub(sdk.OneDec())
})
}
func TestParams_MaxInflationRate_DoesNotOverflow(t *testing.T) {
maxRate := types.MaxMintingRate // use the max minting rate
totalSupply := sdk.NewDec(1e14) // 100 trillion starting supply
years := uint64(25) // calculate over 50 years
perSecondMaxRate, err := maxRate.ApproxRoot(secondsPerYear)
require.NoError(t, err)
perSecondMaxRate = perSecondMaxRate.Sub(sdk.OneDec())
var finalSupply sdk.Int
require.NotPanics(t, func() {
compoundedRate := perSecondMaxRate.Power(years * secondsPerYear)
finalSupply = totalSupply.Mul(compoundedRate).RoundInt()
})
require.Less(t, finalSupply.BigInt().BitLen(), 256)
}
func TestParams_ParamSetPairs_CommunityPoolInflation(t *testing.T) {
assert.Equal(t, []byte("CommunityPoolInflation"), types.KeyCommunityPoolInflation)
defaultParams := types.DefaultParams()
var paramSetPair *paramstypes.ParamSetPair
for _, pair := range defaultParams.ParamSetPairs() {
if bytes.Equal(pair.Key, types.KeyCommunityPoolInflation) {
paramSetPair = &pair
break
}
}
require.NotNil(t, paramSetPair)
pairs, ok := paramSetPair.Value.(*sdk.Dec)
require.True(t, ok)
assert.Equal(t, pairs, &defaultParams.CommunityPoolInflation)
assert.Nil(t, paramSetPair.ValidatorFn(*pairs))
assert.EqualError(t, paramSetPair.ValidatorFn(struct{}{}), "invalid parameter type: struct {}")
}
func TestParams_ParamSetPairs_StakingRewardsApy(t *testing.T) {
assert.Equal(t, []byte("StakingRewardsApy"), types.KeyStakingRewardsApy)
defaultParams := types.DefaultParams()
var paramSetPair *paramstypes.ParamSetPair
for _, pair := range defaultParams.ParamSetPairs() {
if bytes.Equal(pair.Key, types.KeyStakingRewardsApy) {
paramSetPair = &pair
break
}
}
require.NotNil(t, paramSetPair)
pairs, ok := paramSetPair.Value.(*sdk.Dec)
require.True(t, ok)
assert.Equal(t, pairs, &defaultParams.StakingRewardsApy)
assert.Nil(t, paramSetPair.ValidatorFn(*pairs))
assert.EqualError(t, paramSetPair.ValidatorFn(struct{}{}), "invalid parameter type: struct {}")
}
func TestParams_Validation(t *testing.T) {
testCases := []struct {
name string
key []byte
testFn func(params *types.Params)
expectedErr string
}{
{
name: "nil community pool inflation",
key: types.KeyCommunityPoolInflation,
testFn: func(params *types.Params) {
params.CommunityPoolInflation = sdk.Dec{}
},
expectedErr: "invalid rate: <nil>",
},
{
name: "negative community pool inflation",
key: types.KeyCommunityPoolInflation,
testFn: func(params *types.Params) {
params.CommunityPoolInflation = sdk.MustNewDecFromStr("-0.000000000011111111")
},
expectedErr: "invalid rate: -0.000000000011111111",
},
{
name: "0 community pool inflation",
key: types.KeyCommunityPoolInflation,
testFn: func(params *types.Params) {
params.CommunityPoolInflation = sdk.ZeroDec()
},
expectedErr: "", // ok
},
{
name: "community pool inflation 1e-18 less than max rate",
key: types.KeyCommunityPoolInflation,
testFn: func(params *types.Params) {
params.CommunityPoolInflation = types.MaxMintingRate.Sub(sdk.NewDecWithPrec(1, 18))
},
expectedErr: "", // ok
},
{
name: "community pool inflation equal to max rate",
key: types.KeyCommunityPoolInflation,
testFn: func(params *types.Params) {
params.CommunityPoolInflation = types.MaxMintingRate
},
expectedErr: "", // ok
},
{
name: "community pool inflation 1e-18 greater than max rate",
key: types.KeyCommunityPoolInflation,
testFn: func(params *types.Params) {
params.CommunityPoolInflation = types.MaxMintingRate.Add(sdk.NewDecWithPrec(1, 18))
},
expectedErr: "invalid rate: 100.000000000000000001",
},
{
name: "nil staking inflation",
key: types.KeyStakingRewardsApy,
testFn: func(params *types.Params) {
params.StakingRewardsApy = sdk.Dec{}
},
expectedErr: "invalid rate: <nil>",
},
{
name: "negative staking inflation",
key: types.KeyStakingRewardsApy,
testFn: func(params *types.Params) {
params.StakingRewardsApy = sdk.MustNewDecFromStr("-0.000000002222222222")
},
expectedErr: "invalid rate: -0.000000002222222222",
},
{
name: "0 staking inflation",
key: types.KeyStakingRewardsApy,
testFn: func(params *types.Params) {
params.StakingRewardsApy = sdk.ZeroDec()
},
expectedErr: "", // ok
},
{
name: "staking inflation 1e-18 less than max rate",
key: types.KeyStakingRewardsApy,
testFn: func(params *types.Params) {
params.StakingRewardsApy = types.MaxMintingRate.Sub(sdk.NewDecWithPrec(1, 18))
},
expectedErr: "", // ok
},
{
name: "staking inflation equal to max rate",
key: types.KeyStakingRewardsApy,
testFn: func(params *types.Params) {
params.StakingRewardsApy = types.MaxMintingRate
},
expectedErr: "", // ok
},
{
name: "staking inflation 1e-18 greater than max rate",
key: types.KeyStakingRewardsApy,
testFn: func(params *types.Params) {
params.StakingRewardsApy = types.MaxMintingRate.Add(sdk.NewDecWithPrec(1, 18))
},
expectedErr: "invalid rate: 100.000000000000000001",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
params := types.DefaultParams()
tc.testFn(&params)
err := params.Validate()
if tc.expectedErr == "" {
assert.Nil(t, err)
} else {
assert.EqualError(t, err, tc.expectedErr)
}
var paramSetPair *paramstypes.ParamSetPair
for _, pair := range params.ParamSetPairs() {
if bytes.Equal(pair.Key, tc.key) {
paramSetPair = &pair
break
}
}
require.NotNil(t, paramSetPair)
value := reflect.ValueOf(paramSetPair.Value).Elem().Interface()
// assert validation error is same as param set validation
assert.Equal(t, err, paramSetPair.ValidatorFn(value))
})
}
}
func TestParams_String(t *testing.T) {
params := newValidParams(t)
output := params.String()
assert.Contains(t, output, fmt.Sprintf("CommunityPoolInflation: %s", params.CommunityPoolInflation.String()))
assert.Contains(t, output, fmt.Sprintf("StakingRewardsApy: %s", params.StakingRewardsApy.String()))
}
func TestParams_UnmarshalJSON(t *testing.T) {
params := newValidParams(t)
poolRateData, err := json.Marshal(params.CommunityPoolInflation)
require.NoError(t, err)
stakingRateData, err := json.Marshal(params.StakingRewardsApy)
require.NoError(t, err)
data := fmt.Sprintf(`{
"community_pool_inflation": %s,
"staking_rewards_apy": %s
}`, string(poolRateData), string(stakingRateData))
var parsedParams types.Params
err = json.Unmarshal([]byte(data), &parsedParams)
require.NoError(t, err)
assert.Equal(t, params.CommunityPoolInflation, parsedParams.CommunityPoolInflation)
assert.Equal(t, params.StakingRewardsApy, parsedParams.StakingRewardsApy)
}
func TestParams_MarshalYAML(t *testing.T) {
p := newValidParams(t)
data, err := yaml.Marshal(p)
require.NoError(t, err)
var params map[string]interface{}
err = yaml.Unmarshal(data, &params)
require.NoError(t, err)
_, ok := params["community_pool_inflation"]
require.True(t, ok)
_, ok = params["staking_rewards_apy"]
require.True(t, ok)
}

View File

@ -1,870 +0,0 @@
// Code generated by protoc-gen-gogo. DO NOT EDIT.
// source: kava/kavamint/v1beta1/query.proto
package types
import (
context "context"
fmt "fmt"
_ "github.com/cosmos/cosmos-proto"
github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types"
_ "github.com/gogo/protobuf/gogoproto"
grpc1 "github.com/gogo/protobuf/grpc"
proto "github.com/gogo/protobuf/proto"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
io "io"
math "math"
math_bits "math/bits"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
// QueryParamsRequest defines the request type for querying x/kavamint parameters.
type QueryParamsRequest struct {
}
func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} }
func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) }
func (*QueryParamsRequest) ProtoMessage() {}
func (*QueryParamsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_3a66171519c59de7, []int{0}
}
func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryParamsRequest.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *QueryParamsRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryParamsRequest.Merge(m, src)
}
func (m *QueryParamsRequest) XXX_Size() int {
return m.Size()
}
func (m *QueryParamsRequest) XXX_DiscardUnknown() {
xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m)
}
var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo
// QueryParamsResponse defines the response type for querying x/kavamint parameters.
type QueryParamsResponse struct {
Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"`
}
func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} }
func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) }
func (*QueryParamsResponse) ProtoMessage() {}
func (*QueryParamsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_3a66171519c59de7, []int{1}
}
func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryParamsResponse.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *QueryParamsResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryParamsResponse.Merge(m, src)
}
func (m *QueryParamsResponse) XXX_Size() int {
return m.Size()
}
func (m *QueryParamsResponse) XXX_DiscardUnknown() {
xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m)
}
var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo
func (m *QueryParamsResponse) GetParams() Params {
if m != nil {
return m.Params
}
return Params{}
}
// QueryInflationRequest is the request type for the Query/Inflation RPC method.
type QueryInflationRequest struct {
}
func (m *QueryInflationRequest) Reset() { *m = QueryInflationRequest{} }
func (m *QueryInflationRequest) String() string { return proto.CompactTextString(m) }
func (*QueryInflationRequest) ProtoMessage() {}
func (*QueryInflationRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_3a66171519c59de7, []int{2}
}
func (m *QueryInflationRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryInflationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryInflationRequest.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *QueryInflationRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryInflationRequest.Merge(m, src)
}
func (m *QueryInflationRequest) XXX_Size() int {
return m.Size()
}
func (m *QueryInflationRequest) XXX_DiscardUnknown() {
xxx_messageInfo_QueryInflationRequest.DiscardUnknown(m)
}
var xxx_messageInfo_QueryInflationRequest proto.InternalMessageInfo
// QueryInflationResponse is the response type for the Query/Inflation RPC method.
type QueryInflationResponse struct {
// inflation is the current minting inflation value.
// example "0.990000000000000000" - 99% inflation
Inflation github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=inflation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"inflation"`
}
func (m *QueryInflationResponse) Reset() { *m = QueryInflationResponse{} }
func (m *QueryInflationResponse) String() string { return proto.CompactTextString(m) }
func (*QueryInflationResponse) ProtoMessage() {}
func (*QueryInflationResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_3a66171519c59de7, []int{3}
}
func (m *QueryInflationResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryInflationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryInflationResponse.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *QueryInflationResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryInflationResponse.Merge(m, src)
}
func (m *QueryInflationResponse) XXX_Size() int {
return m.Size()
}
func (m *QueryInflationResponse) XXX_DiscardUnknown() {
xxx_messageInfo_QueryInflationResponse.DiscardUnknown(m)
}
var xxx_messageInfo_QueryInflationResponse proto.InternalMessageInfo
func init() {
proto.RegisterType((*QueryParamsRequest)(nil), "kava.kavamint.v1beta1.QueryParamsRequest")
proto.RegisterType((*QueryParamsResponse)(nil), "kava.kavamint.v1beta1.QueryParamsResponse")
proto.RegisterType((*QueryInflationRequest)(nil), "kava.kavamint.v1beta1.QueryInflationRequest")
proto.RegisterType((*QueryInflationResponse)(nil), "kava.kavamint.v1beta1.QueryInflationResponse")
}
func init() { proto.RegisterFile("kava/kavamint/v1beta1/query.proto", fileDescriptor_3a66171519c59de7) }
var fileDescriptor_3a66171519c59de7 = []byte{
// 397 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xcc, 0x4e, 0x2c, 0x4b,
0xd4, 0x07, 0x11, 0xb9, 0x99, 0x79, 0x25, 0xfa, 0x65, 0x86, 0x49, 0xa9, 0x25, 0x89, 0x86, 0xfa,
0x85, 0xa5, 0xa9, 0x45, 0x95, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0xa2, 0x20, 0x59, 0x3d,
0x98, 0x12, 0x3d, 0xa8, 0x12, 0x29, 0xc9, 0xe4, 0xfc, 0xe2, 0xdc, 0xfc, 0xe2, 0x78, 0xb0, 0x22,
0x7d, 0x08, 0x07, 0xa2, 0x43, 0x4a, 0x24, 0x3d, 0x3f, 0x3d, 0x1f, 0x22, 0x0e, 0x62, 0x41, 0x45,
0x65, 0xd2, 0xf3, 0xf3, 0xd3, 0x73, 0x52, 0xf5, 0x13, 0x0b, 0x32, 0xf5, 0x13, 0xf3, 0xf2, 0xf2,
0x4b, 0x12, 0x4b, 0x32, 0xf3, 0xf3, 0x60, 0x7a, 0x54, 0xb0, 0x3b, 0x04, 0x6e, 0x2d, 0x58, 0x95,
0x92, 0x08, 0x97, 0x50, 0x20, 0xc8, 0x69, 0x01, 0x89, 0x45, 0x89, 0xb9, 0xc5, 0x41, 0xa9, 0x85,
0xa5, 0xa9, 0xc5, 0x25, 0x4a, 0x41, 0x5c, 0xc2, 0x28, 0xa2, 0xc5, 0x05, 0xf9, 0x79, 0xc5, 0xa9,
0x42, 0xd6, 0x5c, 0x6c, 0x05, 0x60, 0x11, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x6e, 0x23, 0x59, 0x3d,
0xac, 0x3e, 0xd1, 0x83, 0x68, 0x73, 0x62, 0x39, 0x71, 0x4f, 0x9e, 0x21, 0x08, 0xaa, 0x45, 0x49,
0x9c, 0x4b, 0x14, 0x6c, 0xa6, 0x67, 0x5e, 0x5a, 0x0e, 0xd8, 0xa1, 0x30, 0xcb, 0x4a, 0xb8, 0xc4,
0xd0, 0x25, 0xa0, 0xf6, 0x45, 0x71, 0x71, 0x66, 0xc2, 0x04, 0xc1, 0x56, 0x72, 0x3a, 0xd9, 0x80,
0xcc, 0xbc, 0x75, 0x4f, 0x5e, 0x2d, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x17,
0x1a, 0x54, 0x50, 0x4a, 0xb7, 0x38, 0x25, 0x5b, 0xbf, 0xa4, 0xb2, 0x20, 0xb5, 0x58, 0xcf, 0x25,
0x35, 0xf9, 0xd2, 0x16, 0x5d, 0x2e, 0x68, 0x48, 0xba, 0xa4, 0x26, 0x07, 0x21, 0x8c, 0x33, 0x5a,
0xca, 0xc4, 0xc5, 0x0a, 0xb6, 0x56, 0xa8, 0x8d, 0x91, 0x8b, 0x0d, 0xe2, 0x62, 0x21, 0x4d, 0x1c,
0x1e, 0xc2, 0x0c, 0x22, 0x29, 0x2d, 0x62, 0x94, 0x42, 0xfc, 0xa1, 0xa4, 0xda, 0x74, 0xf9, 0xc9,
0x64, 0x26, 0x79, 0x21, 0x59, 0x7d, 0xec, 0x71, 0x02, 0x09, 0x21, 0xa1, 0x49, 0x8c, 0x5c, 0x9c,
0xf0, 0x40, 0x10, 0xd2, 0xc1, 0x67, 0x01, 0x7a, 0x20, 0x4a, 0xe9, 0x12, 0xa9, 0x1a, 0xea, 0x22,
0x0d, 0xb0, 0x8b, 0x94, 0x84, 0x14, 0x70, 0xb8, 0x08, 0x1e, 0x4e, 0x4e, 0x2e, 0x27, 0x1e, 0xc9,
0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e,
0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0xa5, 0x85, 0x14, 0x05, 0x20, 0x03, 0x74, 0x73, 0x12,
0x93, 0x8a, 0x21, 0xe6, 0x55, 0x20, 0x4c, 0x04, 0x47, 0x45, 0x12, 0x1b, 0x38, 0xb5, 0x19, 0x03,
0x02, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x9b, 0x02, 0x7d, 0x1e, 0x03, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4
// QueryClient is the client API for Query service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type QueryClient interface {
// Params queries the parameters of x/kavamint module.
Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error)
// Inflation queries x/kavamint for the overall cumulative inflation rate of KAVA.
Inflation(ctx context.Context, in *QueryInflationRequest, opts ...grpc.CallOption) (*QueryInflationResponse, error)
}
type queryClient struct {
cc grpc1.ClientConn
}
func NewQueryClient(cc grpc1.ClientConn) QueryClient {
return &queryClient{cc}
}
func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) {
out := new(QueryParamsResponse)
err := c.cc.Invoke(ctx, "/kava.kavamint.v1beta1.Query/Params", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *queryClient) Inflation(ctx context.Context, in *QueryInflationRequest, opts ...grpc.CallOption) (*QueryInflationResponse, error) {
out := new(QueryInflationResponse)
err := c.cc.Invoke(ctx, "/kava.kavamint.v1beta1.Query/Inflation", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// QueryServer is the server API for Query service.
type QueryServer interface {
// Params queries the parameters of x/kavamint module.
Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error)
// Inflation queries x/kavamint for the overall cumulative inflation rate of KAVA.
Inflation(context.Context, *QueryInflationRequest) (*QueryInflationResponse, error)
}
// UnimplementedQueryServer can be embedded to have forward compatible implementations.
type UnimplementedQueryServer struct {
}
func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Params not implemented")
}
func (*UnimplementedQueryServer) Inflation(ctx context.Context, req *QueryInflationRequest) (*QueryInflationResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Inflation not implemented")
}
func RegisterQueryServer(s grpc1.Server, srv QueryServer) {
s.RegisterService(&_Query_serviceDesc, srv)
}
func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(QueryParamsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(QueryServer).Params(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/kava.kavamint.v1beta1.Query/Params",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Query_Inflation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(QueryInflationRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(QueryServer).Inflation(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/kava.kavamint.v1beta1.Query/Inflation",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(QueryServer).Inflation(ctx, req.(*QueryInflationRequest))
}
return interceptor(ctx, in, info, handler)
}
var _Query_serviceDesc = grpc.ServiceDesc{
ServiceName: "kava.kavamint.v1beta1.Query",
HandlerType: (*QueryServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "Params",
Handler: _Query_Params_Handler,
},
{
MethodName: "Inflation",
Handler: _Query_Inflation_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "kava/kavamint/v1beta1/query.proto",
}
func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
return len(dAtA) - i, nil
}
func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
{
size, err := m.Params.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintQuery(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
return len(dAtA) - i, nil
}
func (m *QueryInflationRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *QueryInflationRequest) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryInflationRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
return len(dAtA) - i, nil
}
func (m *QueryInflationResponse) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *QueryInflationResponse) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryInflationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
{
size := m.Inflation.Size()
i -= size
if _, err := m.Inflation.MarshalTo(dAtA[i:]); err != nil {
return 0, err
}
i = encodeVarintQuery(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
return len(dAtA) - i, nil
}
func encodeVarintQuery(dAtA []byte, offset int, v uint64) int {
offset -= sovQuery(v)
base := offset
for v >= 1<<7 {
dAtA[offset] = uint8(v&0x7f | 0x80)
v >>= 7
offset++
}
dAtA[offset] = uint8(v)
return base
}
func (m *QueryParamsRequest) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
return n
}
func (m *QueryParamsResponse) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = m.Params.Size()
n += 1 + l + sovQuery(uint64(l))
return n
}
func (m *QueryInflationRequest) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
return n
}
func (m *QueryInflationResponse) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = m.Inflation.Size()
n += 1 + l + sovQuery(uint64(l))
return n
}
func sovQuery(x uint64) (n int) {
return (math_bits.Len64(x|1) + 6) / 7
}
func sozQuery(x uint64) (n int) {
return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63))))
}
func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: QueryParamsRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthQuery
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: QueryParamsResponse: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthQuery
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthQuery
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthQuery
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *QueryInflationRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: QueryInflationRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: QueryInflationRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthQuery
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *QueryInflationResponse) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: QueryInflationResponse: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: QueryInflationResponse: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Inflation", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthQuery
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthQuery
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if err := m.Inflation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthQuery
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func skipQuery(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0
depth := 0
for iNdEx < l {
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowQuery
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
wireType := int(wire & 0x7)
switch wireType {
case 0:
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowQuery
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
iNdEx++
if dAtA[iNdEx-1] < 0x80 {
break
}
}
case 1:
iNdEx += 8
case 2:
var length int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowQuery
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
length |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if length < 0 {
return 0, ErrInvalidLengthQuery
}
iNdEx += length
case 3:
depth++
case 4:
if depth == 0 {
return 0, ErrUnexpectedEndOfGroupQuery
}
depth--
case 5:
iNdEx += 4
default:
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
}
if iNdEx < 0 {
return 0, ErrInvalidLengthQuery
}
if depth == 0 {
return iNdEx, nil
}
}
return 0, io.ErrUnexpectedEOF
}
var (
ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling")
ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow")
ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group")
)

View File

@ -1,218 +0,0 @@
// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT.
// source: kava/kavamint/v1beta1/query.proto
/*
Package types is a reverse proxy.
It translates gRPC into RESTful JSON APIs.
*/
package types
import (
"context"
"io"
"net/http"
"github.com/golang/protobuf/descriptor"
"github.com/golang/protobuf/proto"
"github.com/grpc-ecosystem/grpc-gateway/runtime"
"github.com/grpc-ecosystem/grpc-gateway/utilities"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/grpclog"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/status"
)
// Suppress "imported and not used" errors
var _ codes.Code
var _ io.Reader
var _ status.Status
var _ = runtime.String
var _ = utilities.NewDoubleArray
var _ = descriptor.ForMessage
var _ = metadata.Join
func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryParamsRequest
var metadata runtime.ServerMetadata
msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryParamsRequest
var metadata runtime.ServerMetadata
msg, err := server.Params(ctx, &protoReq)
return msg, metadata, err
}
func request_Query_Inflation_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryInflationRequest
var metadata runtime.ServerMetadata
msg, err := client.Inflation(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_Query_Inflation_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryInflationRequest
var metadata runtime.ServerMetadata
msg, err := server.Inflation(ctx, &protoReq)
return msg, metadata, err
}
// RegisterQueryHandlerServer registers the http handlers for service Query to "mux".
// UnaryRPC :call QueryServer directly.
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead.
func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error {
mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("GET", pattern_Query_Inflation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_Query_Inflation_0(rctx, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Query_Inflation_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but
// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
conn, err := grpc.Dial(endpoint, opts...)
if err != nil {
return err
}
defer func() {
if err != nil {
if cerr := conn.Close(); cerr != nil {
grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
}
return
}
go func() {
<-ctx.Done()
if cerr := conn.Close(); cerr != nil {
grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
}
}()
}()
return RegisterQueryHandler(ctx, mux, conn)
}
// RegisterQueryHandler registers the http handlers for service Query to "mux".
// The handlers forward requests to the grpc endpoint over "conn".
func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn))
}
// RegisterQueryHandlerClient registers the http handlers for service Query
// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient".
// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient"
// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
// "QueryClient" to call the correct interceptors.
func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error {
mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("GET", pattern_Query_Inflation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_Query_Inflation_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Query_Inflation_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
var (
pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"kava", "kavamint", "v1beta1", "params"}, "", runtime.AssumeColonVerbOpt(false)))
pattern_Query_Inflation_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"kava", "kavamint", "v1beta1", "inflation"}, "", runtime.AssumeColonVerbOpt(false)))
)
var (
forward_Query_Params_0 = runtime.ForwardResponseMessage
forward_Query_Inflation_0 = runtime.ForwardResponseMessage
)