143 lines
4.5 KiB
Go
143 lines
4.5 KiB
Go
package keeper
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
"github.com/cosmos/cosmos-sdk/x/supply/types"
|
|
)
|
|
|
|
// SendCoinsFromModuleToAccount transfers coins from a ModuleAccount to an AccAddress
|
|
func (k Keeper) SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string,
|
|
recipientAddr sdk.AccAddress, amt sdk.Coins) sdk.Error {
|
|
|
|
senderAddr := k.GetModuleAddress(senderModule)
|
|
if senderAddr == nil {
|
|
return sdk.ErrUnknownAddress(fmt.Sprintf("module account %s does not exist", senderModule))
|
|
}
|
|
|
|
return k.bk.SendCoins(ctx, senderAddr, recipientAddr, amt)
|
|
}
|
|
|
|
// SendCoinsFromModuleToModule transfers coins from a ModuleAccount to another
|
|
func (k Keeper) SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, recipientModule string, amt sdk.Coins) sdk.Error {
|
|
|
|
senderAddr := k.GetModuleAddress(senderModule)
|
|
if senderAddr == nil {
|
|
return sdk.ErrUnknownAddress(fmt.Sprintf("module account %s does not exist", senderModule))
|
|
}
|
|
|
|
// create the account if it doesn't yet exist
|
|
recipientAddr := k.GetModuleAccount(ctx, recipientModule).GetAddress()
|
|
if recipientAddr == nil {
|
|
panic(fmt.Sprintf("module account %s isn't able to be created", recipientModule))
|
|
}
|
|
|
|
return k.bk.SendCoins(ctx, senderAddr, recipientAddr, amt)
|
|
}
|
|
|
|
// SendCoinsFromAccountToModule transfers coins from an AccAddress to a ModuleAccount
|
|
func (k Keeper) SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress,
|
|
recipientModule string, amt sdk.Coins) sdk.Error {
|
|
|
|
// create the account if it doesn't yet exist
|
|
recipientAddr := k.GetModuleAccount(ctx, recipientModule).GetAddress()
|
|
if recipientAddr == nil {
|
|
panic(fmt.Sprintf("module account %s isn't able to be created", recipientModule))
|
|
}
|
|
|
|
return k.bk.SendCoins(ctx, senderAddr, recipientAddr, amt)
|
|
}
|
|
|
|
// DelegateCoinsFromAccountToModule delegates coins and transfers
|
|
// them from a delegator account to a module account
|
|
func (k Keeper) DelegateCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress,
|
|
recipientModule string, amt sdk.Coins) sdk.Error {
|
|
|
|
// create the account if it doesn't yet exist
|
|
recipientAddr := k.GetModuleAccount(ctx, recipientModule).GetAddress()
|
|
if recipientAddr == nil {
|
|
panic(fmt.Sprintf("module account %s isn't able to be created", recipientModule))
|
|
}
|
|
|
|
return k.bk.DelegateCoins(ctx, senderAddr, recipientAddr, amt)
|
|
}
|
|
|
|
// UndelegateCoinsFromModuleToAccount undelegates the unbonding coins and transfers
|
|
// them from a module account to the delegator account
|
|
func (k Keeper) UndelegateCoinsFromModuleToAccount(ctx sdk.Context, senderModule string,
|
|
recipientAddr sdk.AccAddress, amt sdk.Coins) sdk.Error {
|
|
|
|
senderAddr := k.GetModuleAddress(senderModule)
|
|
if senderAddr == nil {
|
|
return sdk.ErrUnknownAddress(fmt.Sprintf("module account %s does not exist", senderModule))
|
|
}
|
|
|
|
return k.bk.UndelegateCoins(ctx, senderAddr, recipientAddr, amt)
|
|
}
|
|
|
|
// MintCoins creates new coins from thin air and adds it to the MinterAccount.
|
|
// Panics if the name maps to a non-minter module account.
|
|
func (k Keeper) MintCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) sdk.Error {
|
|
if amt.Empty() {
|
|
panic("cannot mint empty coins")
|
|
}
|
|
|
|
// create the account if it doesn't yet exist
|
|
acc, perm := k.GetModuleAccountAndPermission(ctx, moduleName)
|
|
addr := acc.GetAddress()
|
|
if addr == nil {
|
|
return sdk.ErrUnknownAddress(fmt.Sprintf("module account %s does not exist", moduleName))
|
|
}
|
|
|
|
if perm != types.Minter {
|
|
panic(fmt.Sprintf("Account %s does not have permissions to mint tokens", moduleName))
|
|
}
|
|
|
|
_, err := k.bk.AddCoins(ctx, addr, amt)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// update total supply
|
|
supply := k.GetSupply(ctx)
|
|
supply.Inflate(amt)
|
|
k.SetSupply(ctx, supply)
|
|
|
|
logger := k.Logger(ctx)
|
|
logger.Info(fmt.Sprintf("minted %s from %s module account", amt.String(), moduleName))
|
|
|
|
return nil
|
|
}
|
|
|
|
// BurnCoins burns coins deletes coins from the balance of the module account
|
|
func (k Keeper) BurnCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) sdk.Error {
|
|
if amt.Empty() {
|
|
panic("cannot burn empty coins")
|
|
}
|
|
|
|
addr, perm := k.GetModuleAddressAndPermission(moduleName)
|
|
if addr == nil {
|
|
return sdk.ErrUnknownAddress(fmt.Sprintf("module account %s does not exist", moduleName))
|
|
}
|
|
|
|
if perm != types.Burner {
|
|
panic(fmt.Sprintf("Account %s does not have permissions to burn tokens", moduleName))
|
|
}
|
|
|
|
_, err := k.bk.SubtractCoins(ctx, addr, amt)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// update total supply
|
|
supply := k.GetSupply(ctx)
|
|
supply.Deflate(amt)
|
|
k.SetSupply(ctx, supply)
|
|
|
|
logger := k.Logger(ctx)
|
|
logger.Info(fmt.Sprintf("burned %s from %s module account", amt.String(), moduleName))
|
|
|
|
return nil
|
|
}
|