refactor!: use store service in x/feegrant (#15606)
## Description Closes: #XXXX --- ### Author Checklist *All items are required. Please add a note to the item if the item is not applicable and please add links to any relevant follow up issues.* I have... * [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title * [ ] added `!` to the type prefix if API or client breaking change * [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/main/CONTRIBUTING.md#pr-targeting)) * [ ] provided a link to the relevant issue or specification * [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/main/docs/docs/building-modules) * [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/main/CONTRIBUTING.md#testing) * [ ] added a changelog entry to `CHANGELOG.md` * [ ] included comments for [documenting Go code](https://blog.golang.org/godoc) * [ ] updated the relevant documentation or specification * [ ] reviewed "Files changed" and left comments if necessary * [ ] confirmed all CI checks have passed ### Reviewers Checklist *All items are required. Please add a note if the item is not applicable and please add your handle next to the items reviewed if you only reviewed selected items.* I have... * [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title * [ ] confirmed `!` in the type prefix if API or client breaking change * [ ] confirmed all author checklist items have been addressed * [ ] reviewed state machine logic * [ ] reviewed API design and naming * [ ] reviewed documentation is accurate * [ ] reviewed tests and test coverage * [ ] manually tested (if applicable)
This commit is contained in:
parent
37c0ec8f8a
commit
445dc8afe0
@ -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`:
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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")
|
||||
}
|
||||
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
package feegrant
|
||||
|
||||
import (
|
||||
context "context"
|
||||
"context"
|
||||
|
||||
"cosmossdk.io/core/address"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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")
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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=
|
||||
|
||||
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
@ -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...))
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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)))
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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)))
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
package testutil
|
||||
|
||||
import (
|
||||
context "context"
|
||||
"context"
|
||||
reflect "reflect"
|
||||
|
||||
types "github.com/cosmos/cosmos-sdk/types"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user