diff --git a/UPGRADING.md b/UPGRADING.md index ac02aec886..a8848e908b 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -68,6 +68,7 @@ The following modules `NewKeeper` function now take a `KVStoreService` instead o * `x/auth` * `x/consensus` +* `x/feegrant` * `x/nft` When not using depinject, the `runtime.NewKVStoreService` method can be used to create a `KVStoreService` from a `StoreKey`: diff --git a/simapp/app.go b/simapp/app.go index 1afa29f01d..0f0416547d 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -313,7 +313,7 @@ func NewSimApp( app.CrisisKeeper = crisiskeeper.NewKeeper(appCodec, keys[crisistypes.StoreKey], invCheckPeriod, app.BankKeeper, authtypes.FeeCollectorName, authtypes.NewModuleAddress(govtypes.ModuleName).String()) - app.FeeGrantKeeper = feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], app.AccountKeeper) + app.FeeGrantKeeper = feegrantkeeper.NewKeeper(appCodec, runtime.NewKVStoreService(keys[feegrant.StoreKey]), app.AccountKeeper) // register the staking hooks // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks diff --git a/x/auth/ante/expected_keepers.go b/x/auth/ante/expected_keepers.go index 78575f3e00..99f2dd8dc6 100644 --- a/x/auth/ante/expected_keepers.go +++ b/x/auth/ante/expected_keepers.go @@ -18,5 +18,5 @@ type AccountKeeper interface { // FeegrantKeeper defines the expected feegrant keeper. type FeegrantKeeper interface { - UseGrantedFees(ctx sdk.Context, granter, grantee sdk.AccAddress, fee sdk.Coins, msgs []sdk.Msg) error + UseGrantedFees(ctx context.Context, granter, grantee sdk.AccAddress, fee sdk.Coins, msgs []sdk.Msg) error } diff --git a/x/auth/ante/testutil/expected_keepers_mocks.go b/x/auth/ante/testutil/expected_keepers_mocks.go index f85a6eed92..1302bd240b 100644 --- a/x/auth/ante/testutil/expected_keepers_mocks.go +++ b/x/auth/ante/testutil/expected_keepers_mocks.go @@ -114,7 +114,7 @@ func (m *MockFeegrantKeeper) EXPECT() *MockFeegrantKeeperMockRecorder { } // UseGrantedFees mocks base method. -func (m *MockFeegrantKeeper) UseGrantedFees(ctx types.Context, granter, grantee types.AccAddress, fee types.Coins, msgs []types.Msg) error { +func (m *MockFeegrantKeeper) UseGrantedFees(ctx context.Context, granter, grantee types.AccAddress, fee types.Coins, msgs []types.Msg) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UseGrantedFees", ctx, granter, grantee, fee, msgs) ret0, _ := ret[0].(error) diff --git a/x/feegrant/CHANGELOG.md b/x/feegrant/CHANGELOG.md index 8202db4de6..9dabfb6fa9 100644 --- a/x/feegrant/CHANGELOG.md +++ b/x/feegrant/CHANGELOG.md @@ -31,5 +31,6 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### API Breaking Changes +* [#15606](https://github.com/cosmos/cosmos-sdk/pull/15606) `NewKeeper` now takes a `KVStoreService` instead of a `StoreKey` and methods in the `Keeper` now take a `context.Context` instead of a `sdk.Context`. * [#15347](https://github.com/cosmos/cosmos-sdk/pull/15347) Remove global bech32 usage in keeper. * [#15347](https://github.com/cosmos/cosmos-sdk/pull/15347) `ValidateBasic` is treated as a no op now with with acceptance of RFC001 diff --git a/x/feegrant/basic_fee.go b/x/feegrant/basic_fee.go index 5425afb35d..e1eb829f52 100644 --- a/x/feegrant/basic_fee.go +++ b/x/feegrant/basic_fee.go @@ -1,6 +1,7 @@ package feegrant import ( + "context" time "time" errorsmod "cosmossdk.io/errors" @@ -21,8 +22,8 @@ var _ FeeAllowanceI = (*BasicAllowance)(nil) // // If remove is true (regardless of the error), the FeeAllowance will be deleted from storage // (eg. when it is used up). (See call to RevokeAllowance in Keeper.UseGrantedFees) -func (a *BasicAllowance) Accept(ctx sdk.Context, fee sdk.Coins, _ []sdk.Msg) (bool, error) { - if a.Expiration != nil && a.Expiration.Before(ctx.BlockTime()) { +func (a *BasicAllowance) Accept(ctx context.Context, fee sdk.Coins, _ []sdk.Msg) (bool, error) { + if a.Expiration != nil && a.Expiration.Before(sdk.UnwrapSDKContext(ctx).BlockTime()) { return true, errorsmod.Wrap(ErrFeeLimitExpired, "basic allowance") } diff --git a/x/feegrant/expected_keepers.go b/x/feegrant/expected_keepers.go index 03e5bf0a8e..d796675db5 100644 --- a/x/feegrant/expected_keepers.go +++ b/x/feegrant/expected_keepers.go @@ -1,9 +1,10 @@ package feegrant import ( - context "context" + "context" "cosmossdk.io/core/address" + sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/feegrant/fees.go b/x/feegrant/fees.go index 9b2c033386..b6191204d5 100644 --- a/x/feegrant/fees.go +++ b/x/feegrant/fees.go @@ -1,6 +1,7 @@ package feegrant import ( + "context" "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -19,7 +20,7 @@ type FeeAllowanceI interface { // // If remove is true (regardless of the error), the FeeAllowance will be deleted from storage // (eg. when it is used up). (See call to RevokeAllowance in Keeper.UseGrantedFees) - Accept(ctx sdk.Context, fee sdk.Coins, msgs []sdk.Msg) (remove bool, err error) + Accept(ctx context.Context, fee sdk.Coins, msgs []sdk.Msg) (remove bool, err error) // ValidateBasic should evaluate this FeeAllowance for internal consistency. // Don't allow negative amounts, or negative periods for example. diff --git a/x/feegrant/filtered_fee.go b/x/feegrant/filtered_fee.go index fea7371774..4af34e95ee 100644 --- a/x/feegrant/filtered_fee.go +++ b/x/feegrant/filtered_fee.go @@ -1,6 +1,7 @@ package feegrant import ( + "context" "time" errorsmod "cosmossdk.io/errors" @@ -67,8 +68,8 @@ func (a *AllowedMsgAllowance) SetAllowance(allowance FeeAllowanceI) error { } // Accept method checks for the filtered messages has valid expiry -func (a *AllowedMsgAllowance) Accept(ctx sdk.Context, fee sdk.Coins, msgs []sdk.Msg) (bool, error) { - if !a.allMsgTypesAllowed(ctx, msgs) { +func (a *AllowedMsgAllowance) Accept(ctx context.Context, fee sdk.Coins, msgs []sdk.Msg) (bool, error) { + if !a.allMsgTypesAllowed(sdk.UnwrapSDKContext(ctx), msgs) { return false, errorsmod.Wrap(ErrMessageNotAllowed, "message does not exist in allowed messages") } diff --git a/x/feegrant/go.mod b/x/feegrant/go.mod index 4d5c90c475..81f41e83d8 100644 --- a/x/feegrant/go.mod +++ b/x/feegrant/go.mod @@ -12,7 +12,7 @@ require ( cosmossdk.io/store v0.1.0-alpha.1.0.20230328185921-37ba88872dbc github.com/cometbft/cometbft v0.37.0 github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230330094838-d21f58c638d5 + github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230330132045-4b148aad6c22 github.com/cosmos/gogoproto v1.4.7 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 diff --git a/x/feegrant/go.sum b/x/feegrant/go.sum index 93fc88edc8..bb3239776f 100644 --- a/x/feegrant/go.sum +++ b/x/feegrant/go.sum @@ -188,6 +188,8 @@ github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQ github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230330094838-d21f58c638d5 h1:zO3mov9MaHWNnYZyQ8Wz/CZhrjfizMKvvLH41Ro/FYk= github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230330094838-d21f58c638d5/go.mod h1:aKJRE3RjbwJUFGKG+kTDLhrST9vzFr8FlsTlv4eD+80= +github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230330132045-4b148aad6c22 h1:3bslElsuLl+GXtUvIdf80zXKo2OehIS7P0beGRozfI4= +github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230330132045-4b148aad6c22/go.mod h1:elh/LpgsDux3TLyHshvqIvqAxbK1rYpBONS5TVzpFno= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= diff --git a/x/feegrant/keeper/genesis_test.go b/x/feegrant/keeper/genesis_test.go index 374c859632..6f24f2b4fa 100644 --- a/x/feegrant/keeper/genesis_test.go +++ b/x/feegrant/keeper/genesis_test.go @@ -15,6 +15,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/cosmos/cosmos-sdk/runtime" "github.com/cosmos/cosmos-sdk/testutil" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" @@ -45,7 +46,7 @@ func initFixture(t *testing.T) *genesisFixture { return &genesisFixture{ ctx: testCtx.Ctx, - feegrantKeeper: keeper.NewKeeper(encCfg.Codec, key, accountKeeper), + feegrantKeeper: keeper.NewKeeper(encCfg.Codec, runtime.NewKVStoreService(key), accountKeeper), accountKeeper: accountKeeper, } } diff --git a/x/feegrant/keeper/grpc_query.go b/x/feegrant/keeper/grpc_query.go index 87ccf41f35..bb3e281651 100644 --- a/x/feegrant/keeper/grpc_query.go +++ b/x/feegrant/keeper/grpc_query.go @@ -12,6 +12,7 @@ import ( "cosmossdk.io/x/feegrant" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/runtime" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" ) @@ -75,8 +76,8 @@ func (q Keeper) Allowances(c context.Context, req *feegrant.QueryAllowancesReque var grants []*feegrant.Grant - store := ctx.KVStore(q.storeKey) - grantsStore := prefix.NewStore(store, feegrant.FeeAllowancePrefixByGrantee(granteeAddr)) + store := q.storeService.OpenKVStore(ctx) + grantsStore := prefix.NewStore(runtime.KVStoreAdapter(store), feegrant.FeeAllowancePrefixByGrantee(granteeAddr)) pageRes, err := query.Paginate(grantsStore, req.Pagination, func(key, value []byte) error { var grant feegrant.Grant @@ -108,8 +109,8 @@ func (q Keeper) AllowancesByGranter(c context.Context, req *feegrant.QueryAllowa ctx := sdk.UnwrapSDKContext(c) - store := ctx.KVStore(q.storeKey) - prefixStore := prefix.NewStore(store, feegrant.FeeAllowanceKeyPrefix) + store := q.storeService.OpenKVStore(ctx) + prefixStore := prefix.NewStore(runtime.KVStoreAdapter(store), feegrant.FeeAllowanceKeyPrefix) grants, pageRes, err := query.GenericFilteredPaginate(q.cdc, prefixStore, req.Pagination, func(key []byte, grant *feegrant.Grant) (*feegrant.Grant, error) { // ParseAddressesFromFeeAllowanceKey expects the full key including the prefix. granter, _ := feegrant.ParseAddressesFromFeeAllowanceKey(append(feegrant.FeeAllowanceKeyPrefix, key...)) diff --git a/x/feegrant/keeper/keeper.go b/x/feegrant/keeper/keeper.go index 13c90b8d6d..77905a4b1a 100644 --- a/x/feegrant/keeper/keeper.go +++ b/x/feegrant/keeper/keeper.go @@ -1,15 +1,19 @@ package keeper import ( + "context" "fmt" "time" + "cosmossdk.io/core/store" errorsmod "cosmossdk.io/errors" "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" + "cosmossdk.io/x/feegrant" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/runtime" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" @@ -18,19 +22,19 @@ import ( // Keeper manages state of all fee grants, as well as calculating approval. // It must have a codec with all available allowances registered. type Keeper struct { - cdc codec.BinaryCodec - storeKey storetypes.StoreKey - authKeeper feegrant.AccountKeeper + cdc codec.BinaryCodec + storeService store.KVStoreService + authKeeper feegrant.AccountKeeper } var _ ante.FeegrantKeeper = &Keeper{} // NewKeeper creates a fee grant Keeper -func NewKeeper(cdc codec.BinaryCodec, storeKey storetypes.StoreKey, ak feegrant.AccountKeeper) Keeper { +func NewKeeper(cdc codec.BinaryCodec, storeService store.KVStoreService, ak feegrant.AccountKeeper) Keeper { return Keeper{ - cdc: cdc, - storeKey: storeKey, - authKeeper: ak, + cdc: cdc, + storeService: storeService, + authKeeper: ak, } } @@ -40,7 +44,7 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger { } // GrantAllowance creates a new grant -func (k Keeper) GrantAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress, feeAllowance feegrant.FeeAllowanceI) error { +func (k Keeper) GrantAllowance(ctx context.Context, granter, grantee sdk.AccAddress, feeAllowance feegrant.FeeAllowanceI) error { // Checking for duplicate entry if f, _ := k.GetAllowance(ctx, granter, grantee); f != nil { return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "fee allowance already exists") @@ -53,7 +57,7 @@ func (k Keeper) GrantAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress, k.authKeeper.SetAccount(ctx, granteeAcc) } - store := ctx.KVStore(k.storeKey) + store := k.storeService.OpenKVStore(ctx) key := feegrant.FeeAllowanceKey(granter, grantee) exp, err := feeAllowance.ExpiresAt() @@ -62,7 +66,8 @@ func (k Keeper) GrantAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress, } // expiration shouldn't be in the past. - if exp != nil && exp.Before(ctx.BlockTime()) { + sdkCtx := sdk.UnwrapSDKContext(ctx) + if exp != nil && exp.Before(sdkCtx.BlockTime()) { return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "expiration is before current block time") } @@ -70,7 +75,10 @@ func (k Keeper) GrantAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress, if exp != nil { // `key` formed here with the prefix of `FeeAllowanceKeyPrefix` (which is `0x00`) // remove the 1st byte and reuse the remaining key as it is - k.addToFeeAllowanceQueue(ctx, key[1:], exp) + err = k.addToFeeAllowanceQueue(ctx, key[1:], exp) + if err != nil { + return err + } } grant, err := feegrant.NewGrant(granter, grantee, feeAllowance) @@ -83,8 +91,12 @@ func (k Keeper) GrantAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress, return err } - store.Set(key, bz) - ctx.EventManager().EmitEvent( + err = store.Set(key, bz) + if err != nil { + return err + } + + sdkCtx.EventManager().EmitEvent( sdk.NewEvent( feegrant.EventTypeSetFeeGrant, sdk.NewAttribute(feegrant.AttributeKeyGranter, grant.Granter), @@ -96,8 +108,8 @@ func (k Keeper) GrantAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress, } // UpdateAllowance updates the existing grant. -func (k Keeper) UpdateAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress, feeAllowance feegrant.FeeAllowanceI) error { - store := ctx.KVStore(k.storeKey) +func (k Keeper) UpdateAllowance(ctx context.Context, granter, grantee sdk.AccAddress, feeAllowance feegrant.FeeAllowanceI) error { + store := k.storeService.OpenKVStore(ctx) key := feegrant.FeeAllowanceKey(granter, grantee) _, err := k.getGrant(ctx, granter, grantee) @@ -115,9 +127,12 @@ func (k Keeper) UpdateAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress return err } - store.Set(key, bz) + err = store.Set(key, bz) + if err != nil { + return err + } - ctx.EventManager().EmitEvent( + sdk.UnwrapSDKContext(ctx).EventManager().EmitEvent( sdk.NewEvent( feegrant.EventTypeUpdateFeeGrant, sdk.NewAttribute(feegrant.AttributeKeyGranter, grant.Granter), @@ -129,17 +144,20 @@ func (k Keeper) UpdateAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress } // revokeAllowance removes an existing grant -func (k Keeper) revokeAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress) error { +func (k Keeper) revokeAllowance(ctx context.Context, granter, grantee sdk.AccAddress) error { _, err := k.getGrant(ctx, granter, grantee) if err != nil { return err } - store := ctx.KVStore(k.storeKey) + store := k.storeService.OpenKVStore(ctx) key := feegrant.FeeAllowanceKey(granter, grantee) - store.Delete(key) + err = store.Delete(key) + if err != nil { + return err + } - ctx.EventManager().EmitEvent( + sdk.UnwrapSDKContext(ctx).EventManager().EmitEvent( sdk.NewEvent( feegrant.EventTypeRevokeFeeGrant, sdk.NewAttribute(feegrant.AttributeKeyGranter, granter.String()), @@ -152,7 +170,7 @@ func (k Keeper) revokeAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress // GetAllowance returns the allowance between the granter and grantee. // If there is none, it returns nil, nil. // Returns an error on parsing issues -func (k Keeper) GetAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress) (feegrant.FeeAllowanceI, error) { +func (k Keeper) GetAllowance(ctx context.Context, granter, grantee sdk.AccAddress) (feegrant.FeeAllowanceI, error) { grant, err := k.getGrant(ctx, granter, grantee) if err != nil { return nil, err @@ -162,10 +180,14 @@ func (k Keeper) GetAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress) ( } // getGrant returns entire grant between both accounts -func (k Keeper) getGrant(ctx sdk.Context, granter, grantee sdk.AccAddress) (*feegrant.Grant, error) { - store := ctx.KVStore(k.storeKey) +func (k Keeper) getGrant(ctx context.Context, granter, grantee sdk.AccAddress) (*feegrant.Grant, error) { + store := k.storeService.OpenKVStore(ctx) key := feegrant.FeeAllowanceKey(granter, grantee) - bz := store.Get(key) + bz, err := store.Get(key) + if err != nil { + return nil, err + } + if len(bz) == 0 { return nil, sdkerrors.ErrNotFound.Wrap("fee-grant not found") } @@ -181,9 +203,9 @@ func (k Keeper) getGrant(ctx sdk.Context, granter, grantee sdk.AccAddress) (*fee // IterateAllFeeAllowances iterates over all the grants in the store. // Callback to get all data, returns true to stop, false to keep reading // Calling this without pagination is very expensive and only designed for export genesis -func (k Keeper) IterateAllFeeAllowances(ctx sdk.Context, cb func(grant feegrant.Grant) bool) error { - store := ctx.KVStore(k.storeKey) - iter := storetypes.KVStorePrefixIterator(store, feegrant.FeeAllowanceKeyPrefix) +func (k Keeper) IterateAllFeeAllowances(ctx context.Context, cb func(grant feegrant.Grant) bool) error { + store := k.storeService.OpenKVStore(ctx) + iter := storetypes.KVStorePrefixIterator(runtime.KVStoreAdapter(store), feegrant.FeeAllowanceKeyPrefix) defer iter.Close() stop := false @@ -200,7 +222,7 @@ func (k Keeper) IterateAllFeeAllowances(ctx sdk.Context, cb func(grant feegrant. } // UseGrantedFees will try to pay the given fee from the granter's account as requested by the grantee -func (k Keeper) UseGrantedFees(ctx sdk.Context, granter, grantee sdk.AccAddress, fee sdk.Coins, msgs []sdk.Msg) error { +func (k Keeper) UseGrantedFees(ctx context.Context, granter, grantee sdk.AccAddress, fee sdk.Coins, msgs []sdk.Msg) error { f, err := k.getGrant(ctx, granter, grantee) if err != nil { return err @@ -235,8 +257,8 @@ func (k Keeper) UseGrantedFees(ctx sdk.Context, granter, grantee sdk.AccAddress, return k.UpdateAllowance(ctx, granter, grantee, grant) } -func emitUseGrantEvent(ctx sdk.Context, granter, grantee string) { - ctx.EventManager().EmitEvent( +func emitUseGrantEvent(ctx context.Context, granter, grantee string) { + sdk.UnwrapSDKContext(ctx).EventManager().EmitEvent( sdk.NewEvent( feegrant.EventTypeUseFeeGrant, sdk.NewAttribute(feegrant.AttributeKeyGranter, granter), @@ -246,7 +268,7 @@ func emitUseGrantEvent(ctx sdk.Context, granter, grantee string) { } // InitGenesis will initialize the keeper from a *previously validated* GenesisState -func (k Keeper) InitGenesis(ctx sdk.Context, data *feegrant.GenesisState) error { +func (k Keeper) InitGenesis(ctx context.Context, data *feegrant.GenesisState) error { for _, f := range data.Allowances { granter, err := k.authKeeper.StringToBytes(f.Granter) if err != nil { @@ -271,7 +293,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data *feegrant.GenesisState) error } // ExportGenesis will dump the contents of the keeper into a serializable GenesisState. -func (k Keeper) ExportGenesis(ctx sdk.Context) (*feegrant.GenesisState, error) { +func (k Keeper) ExportGenesis(ctx context.Context) (*feegrant.GenesisState, error) { var grants []feegrant.Grant err := k.IterateAllFeeAllowances(ctx, func(grant feegrant.Grant) bool { @@ -284,22 +306,32 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) (*feegrant.GenesisState, error) { }, err } -func (k Keeper) addToFeeAllowanceQueue(ctx sdk.Context, grantKey []byte, exp *time.Time) { - store := ctx.KVStore(k.storeKey) - store.Set(feegrant.FeeAllowancePrefixQueue(exp, grantKey), []byte{}) +func (k Keeper) addToFeeAllowanceQueue(ctx context.Context, grantKey []byte, exp *time.Time) error { + store := k.storeService.OpenKVStore(ctx) + return store.Set(feegrant.FeeAllowancePrefixQueue(exp, grantKey), []byte{}) } // RemoveExpiredAllowances iterates grantsByExpiryQueue and deletes the expired grants. -func (k Keeper) RemoveExpiredAllowances(ctx sdk.Context) { - exp := ctx.BlockTime() - store := ctx.KVStore(k.storeKey) - iterator := store.Iterator(feegrant.FeeAllowanceQueueKeyPrefix, storetypes.InclusiveEndBytes(feegrant.AllowanceByExpTimeKey(&exp))) +func (k Keeper) RemoveExpiredAllowances(ctx context.Context) error { + exp := sdk.UnwrapSDKContext(ctx).BlockTime() + store := k.storeService.OpenKVStore(ctx) + iterator, err := store.Iterator(feegrant.FeeAllowanceQueueKeyPrefix, storetypes.InclusiveEndBytes(feegrant.AllowanceByExpTimeKey(&exp))) + if err != nil { + return err + } defer iterator.Close() for ; iterator.Valid(); iterator.Next() { - store.Delete(iterator.Key()) + err = store.Delete(iterator.Key()) + if err != nil { + return err + } granter, grantee := feegrant.ParseAddressesFromFeeAllowanceQueueKey(iterator.Key()) - store.Delete(feegrant.FeeAllowanceKey(granter, grantee)) + err = store.Delete(feegrant.FeeAllowanceKey(granter, grantee)) + if err != nil { + return err + } } + return nil } diff --git a/x/feegrant/keeper/keeper_test.go b/x/feegrant/keeper/keeper_test.go index 9e7f5bfc41..919f47d711 100644 --- a/x/feegrant/keeper/keeper_test.go +++ b/x/feegrant/keeper/keeper_test.go @@ -14,6 +14,7 @@ import ( feegranttestutil "cosmossdk.io/x/feegrant/testutil" codecaddress "github.com/cosmos/cosmos-sdk/codec/address" + "github.com/cosmos/cosmos-sdk/runtime" "github.com/cosmos/cosmos-sdk/testutil" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" @@ -60,7 +61,7 @@ func (suite *KeeperTestSuite) SetupTest() { suite.accountKeeper.EXPECT().BytesToString(suite.addrs[2]).Return(suite.addrs[2].String(), nil).AnyTimes() suite.accountKeeper.EXPECT().BytesToString(suite.addrs[3]).Return(suite.addrs[3].String(), nil).AnyTimes() - suite.feegrantKeeper = keeper.NewKeeper(encCfg.Codec, key, suite.accountKeeper) + suite.feegrantKeeper = keeper.NewKeeper(encCfg.Codec, runtime.NewKVStoreService(key), suite.accountKeeper) suite.ctx = testCtx.Ctx suite.msgSrvr = keeper.NewMsgServerImpl(suite.feegrantKeeper) suite.atom = sdk.NewCoins(sdk.NewCoin("atom", sdkmath.NewInt(555))) diff --git a/x/feegrant/keeper/migrations.go b/x/feegrant/keeper/migrations.go index 3523d00790..ccb5831971 100644 --- a/x/feegrant/keeper/migrations.go +++ b/x/feegrant/keeper/migrations.go @@ -2,6 +2,7 @@ package keeper import ( v2 "cosmossdk.io/x/feegrant/migrations/v2" + sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -17,5 +18,5 @@ func NewMigrator(keeper Keeper) Migrator { // Migrate1to2 migrates from version 1 to 2. func (m Migrator) Migrate1to2(ctx sdk.Context) error { - return v2.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc) + return v2.MigrateStore(ctx, m.keeper.storeService, m.keeper.cdc) } diff --git a/x/feegrant/migrations/v2/store.go b/x/feegrant/migrations/v2/store.go index c484c206cd..48a8d3e339 100644 --- a/x/feegrant/migrations/v2/store.go +++ b/x/feegrant/migrations/v2/store.go @@ -1,16 +1,19 @@ package v2 import ( + "context" + + "cosmossdk.io/core/store" "cosmossdk.io/store/prefix" - storetypes "cosmossdk.io/store/types" "cosmossdk.io/x/feegrant" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/runtime" "github.com/cosmos/cosmos-sdk/types" ) -func addAllowancesByExpTimeQueue(ctx types.Context, store storetypes.KVStore, cdc codec.BinaryCodec) error { - prefixStore := prefix.NewStore(store, FeeAllowanceKeyPrefix) +func addAllowancesByExpTimeQueue(ctx context.Context, store store.KVStore, cdc codec.BinaryCodec) error { + prefixStore := prefix.NewStore(runtime.KVStoreAdapter(store), FeeAllowanceKeyPrefix) iterator := prefixStore.Iterator(nil, nil) defer iterator.Close() @@ -34,7 +37,7 @@ func addAllowancesByExpTimeQueue(ctx types.Context, store storetypes.KVStore, cd if exp != nil { // store key is not changed in 0.46 key := iterator.Key() - if exp.Before(ctx.BlockTime()) { + if exp.Before(types.UnwrapSDKContext(ctx).BlockTime()) { prefixStore.Delete(key) } else { grantByExpTimeQueueKey := FeeAllowancePrefixQueue(exp, key) @@ -46,7 +49,7 @@ func addAllowancesByExpTimeQueue(ctx types.Context, store storetypes.KVStore, cd return nil } -func MigrateStore(ctx types.Context, storeKey storetypes.StoreKey, cdc codec.BinaryCodec) error { - store := ctx.KVStore(storeKey) +func MigrateStore(ctx context.Context, storeService store.KVStoreService, cdc codec.BinaryCodec) error { + store := storeService.OpenKVStore(ctx) return addAllowancesByExpTimeQueue(ctx, store, cdc) } diff --git a/x/feegrant/migrations/v2/store_test.go b/x/feegrant/migrations/v2/store_test.go index 445e4fe3d3..26173dea4f 100644 --- a/x/feegrant/migrations/v2/store_test.go +++ b/x/feegrant/migrations/v2/store_test.go @@ -11,7 +11,9 @@ import ( "cosmossdk.io/x/feegrant" v2 "cosmossdk.io/x/feegrant/migrations/v2" "cosmossdk.io/x/feegrant/module" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + "github.com/cosmos/cosmos-sdk/runtime" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" @@ -78,7 +80,7 @@ func TestMigration(t *testing.T) { } ctx = ctx.WithBlockTime(now.Add(30 * time.Hour)) - require.NoError(t, v2.MigrateStore(ctx, feegrantKey, cdc)) + require.NoError(t, v2.MigrateStore(ctx, runtime.NewKVStoreService(feegrantKey), cdc)) store = ctx.KVStore(feegrantKey) require.NotNil(t, store.Get(v2.FeeAllowanceKey(granter1, grantee1))) diff --git a/x/feegrant/module/abci.go b/x/feegrant/module/abci.go index 84decfbc99..4dbab056a9 100644 --- a/x/feegrant/module/abci.go +++ b/x/feegrant/module/abci.go @@ -2,9 +2,13 @@ package module import ( "cosmossdk.io/x/feegrant/keeper" + sdk "github.com/cosmos/cosmos-sdk/types" ) func EndBlocker(ctx sdk.Context, k keeper.Keeper) { - k.RemoveExpiredAllowances(ctx) + err := k.RemoveExpiredAllowances(ctx) + if err != nil { + panic(err) + } } diff --git a/x/feegrant/module/abci_test.go b/x/feegrant/module/abci_test.go index f7076e487a..7ce3fc48fd 100644 --- a/x/feegrant/module/abci_test.go +++ b/x/feegrant/module/abci_test.go @@ -13,6 +13,7 @@ import ( "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/runtime" "github.com/cosmos/cosmos-sdk/testutil" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" @@ -51,7 +52,7 @@ func TestFeegrantPruning(t *testing.T) { accountKeeper.EXPECT().BytesToString(granter2.Bytes()).Return(granter2.String(), nil).AnyTimes() accountKeeper.EXPECT().BytesToString(granter3.Bytes()).Return(granter3.String(), nil).AnyTimes() - feegrantKeeper := keeper.NewKeeper(encCfg.Codec, key, accountKeeper) + feegrantKeeper := keeper.NewKeeper(encCfg.Codec, runtime.NewKVStoreService(key), accountKeeper) feegrantKeeper.GrantAllowance( testCtx.Ctx, diff --git a/x/feegrant/module/module.go b/x/feegrant/module/module.go index 37b99faea2..46545f8b75 100644 --- a/x/feegrant/module/module.go +++ b/x/feegrant/module/module.go @@ -17,7 +17,7 @@ import ( "cosmossdk.io/depinject" - store "cosmossdk.io/store/types" + "cosmossdk.io/core/store" "cosmossdk.io/x/feegrant" "cosmossdk.io/x/feegrant/client/cli" "cosmossdk.io/x/feegrant/keeper" @@ -190,7 +190,7 @@ func init() { type FeegrantInputs struct { depinject.In - Key *store.KVStoreKey + StoreService store.KVStoreService Cdc codec.Codec AccountKeeper feegrant.AccountKeeper BankKeeper feegrant.BankKeeper @@ -198,7 +198,7 @@ type FeegrantInputs struct { } func ProvideModule(in FeegrantInputs) (keeper.Keeper, appmodule.AppModule) { - k := keeper.NewKeeper(in.Cdc, in.Key, in.AccountKeeper) + k := keeper.NewKeeper(in.Cdc, in.StoreService, in.AccountKeeper) m := NewAppModule(in.Cdc, in.AccountKeeper, in.BankKeeper, k, in.Registry) return k, m } diff --git a/x/feegrant/periodic_fee.go b/x/feegrant/periodic_fee.go index 800e9e84f5..5439d66fb1 100644 --- a/x/feegrant/periodic_fee.go +++ b/x/feegrant/periodic_fee.go @@ -1,6 +1,7 @@ package feegrant import ( + "context" "time" errorsmod "cosmossdk.io/errors" @@ -21,8 +22,8 @@ var _ FeeAllowanceI = (*PeriodicAllowance)(nil) // // If remove is true (regardless of the error), the FeeAllowance will be deleted from storage // (eg. when it is used up). (See call to RevokeAllowance in Keeper.UseGrantedFees) -func (a *PeriodicAllowance) Accept(ctx sdk.Context, fee sdk.Coins, _ []sdk.Msg) (bool, error) { - blockTime := ctx.BlockTime() +func (a *PeriodicAllowance) Accept(ctx context.Context, fee sdk.Coins, _ []sdk.Msg) (bool, error) { + blockTime := sdk.UnwrapSDKContext(ctx).BlockTime() if a.Basic.Expiration != nil && blockTime.After(*a.Basic.Expiration) { return true, errorsmod.Wrap(ErrFeeLimitExpired, "absolute limit") diff --git a/x/feegrant/testutil/expected_keepers_mocks.go b/x/feegrant/testutil/expected_keepers_mocks.go index b73d173532..e659ee5cf6 100644 --- a/x/feegrant/testutil/expected_keepers_mocks.go +++ b/x/feegrant/testutil/expected_keepers_mocks.go @@ -5,7 +5,7 @@ package testutil import ( - context "context" + "context" reflect "reflect" types "github.com/cosmos/cosmos-sdk/types"