diff --git a/CHANGELOG.md b/CHANGELOG.md index 360b4301b16..dc4575a060c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,8 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Improvements * [\#10486](https://github.com/cosmos/cosmos-sdk/pull/10486) store/cachekv's `Store.Write` conservatively looks up keys, but also uses the [map clearing idiom](https://bencher.orijtech.com/perfclinic/mapclearing/) to reduce the RAM usage, CPU time usage, and garbage collection pressure from clearing maps, instead of allocating new maps. +* [\#10393](https://github.com/cosmos/cosmos-sdk/pull/10393) Add `HasSupply` method to bank keeper to ensure that input denom actually exists on chain. + ### Bug Fixes * [\#10414](https://github.com/cosmos/cosmos-sdk/pull/10414) Use `sdk.GetConfig().GetFullBIP44Path()` instead `sdk.FullFundraiserPath` to generate key diff --git a/x/bank/keeper/keeper.go b/x/bank/keeper/keeper.go index cc8ded24013..482c002870b 100644 --- a/x/bank/keeper/keeper.go +++ b/x/bank/keeper/keeper.go @@ -25,6 +25,7 @@ type Keeper interface { ExportGenesis(sdk.Context) *types.GenesisState GetSupply(ctx sdk.Context, denom string) sdk.Coin + HasSupply(ctx sdk.Context, denom string) bool GetPaginatedTotalSupply(ctx sdk.Context, pagination *query.PageRequest) (sdk.Coins, *query.PageResponse, error) IterateTotalSupply(ctx sdk.Context, cb func(sdk.Coin) bool) GetDenomMetaData(ctx sdk.Context, denom string) (types.Metadata, bool) @@ -214,6 +215,13 @@ func (k BaseKeeper) GetSupply(ctx sdk.Context, denom string) sdk.Coin { } } +// HasSupply checks if the supply coin exists in store. +func (k BaseKeeper) HasSupply(ctx sdk.Context, denom string) bool { + store := ctx.KVStore(k.storeKey) + supplyStore := prefix.NewStore(store, types.SupplyKey) + return supplyStore.Has([]byte(denom)) +} + // GetDenomMetaData retrieves the denomination metadata. returns the metadata and true if the denom exists, // false otherwise. func (k BaseKeeper) GetDenomMetaData(ctx sdk.Context, denom string) (types.Metadata, bool) { diff --git a/x/bank/keeper/keeper_test.go b/x/bank/keeper/keeper_test.go index f9074f423e9..93f355260bf 100644 --- a/x/bank/keeper/keeper_test.go +++ b/x/bank/keeper/keeper_test.go @@ -1113,6 +1113,7 @@ func (suite *IntegrationTestSuite) TestBalanceTrackingEvents() { } // check balance and supply tracking + suite.Require().True(suite.app.BankKeeper.HasSupply(suite.ctx, "utxo")) savedSupply := suite.app.BankKeeper.GetSupply(suite.ctx, "utxo") utxoSupply := savedSupply suite.Require().Equal(utxoSupply.Amount, supply.AmountOf("utxo"))