package keeper import ( "fmt" "github.com/tendermint/tendermint/libs/log" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/supply/exported" "github.com/cosmos/cosmos-sdk/x/supply/types" ) // Keeper of the supply store type Keeper struct { cdc types.Codec storeKey sdk.StoreKey ak types.AccountKeeper bk types.BankKeeper permAddrs map[string]types.PermissionsForAddress } // NewKeeper creates a new Keeper instance func NewKeeper( cdc types.Codec, key sdk.StoreKey, ak types.AccountKeeper, bk types.BankKeeper, maccPerms map[string][]string, ) Keeper { permAddrs := make(map[string]types.PermissionsForAddress) for name, perms := range maccPerms { permAddrs[name] = types.NewPermissionsForAddress(name, perms) } return Keeper{ cdc: cdc, storeKey: key, ak: ak, bk: bk, permAddrs: permAddrs, } } // Logger returns a module-specific logger. func (k Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) } // GetSupply retrieves the Supply from store func (k Keeper) GetSupply(ctx sdk.Context) exported.SupplyI { store := ctx.KVStore(k.storeKey) bz := store.Get(SupplyKey) if bz == nil { panic("stored supply should not have been nil") } supply, err := k.cdc.UnmarshalSupply(bz) if err != nil { panic(err) } return supply } // SetSupply sets the Supply to store func (k Keeper) SetSupply(ctx sdk.Context, supply exported.SupplyI) { store := ctx.KVStore(k.storeKey) bz, err := k.cdc.MarshalSupply(supply) if err != nil { panic(err) } store.Set(SupplyKey, bz) } // ValidatePermissions validates that the module account has been granted // permissions within its set of allowed permissions. func (k Keeper) ValidatePermissions(macc exported.ModuleAccountI) error { permAddr := k.permAddrs[macc.GetName()] for _, perm := range macc.GetPermissions() { if !permAddr.HasPermission(perm) { return fmt.Errorf("invalid module permission %s", perm) } } return nil }