func (a AssetKeeper) issueCoinStat(ctx sdk.Context, amount types.Coin) error {
	creator, symbol, err := CoinAccountsFromDenom(amount.Denom)
	if err != nil {
		return sdkerrors.Wrap(err, "issue coin error")
	}
	stat, err := a.getStat(ctx, creator, symbol)
	if stat == nil {
		return types.ErrAssetCoinNoExit
	}
	if err != nil {
		return sdkerrors.Wrap(err, "issue get stat error")
	}
	if !stat.Creator.Eq(creator) {
		return types.ErrAssetNoCreator
	}
	denom := types.CoinDenom(creator, symbol)
	if err := coin.ValidateDenom(denom); err != nil {
		return sdkerrors.Wrapf(types.ErrAssetDenom, "denom %s", denom)
	}
	if denom != amount.Denom {
		return sdkerrors.Wrap(types.ErrAssetDenom, "amount denom error")
	}
	newSupply := stat.Supply.Add(amount)
	maxSupply := stat.GetCurrentMaxSupplyLimit(ctx.BlockHeight())
	ctx.Logger().Debug("update state", "newSupply", newSupply, "maxSupply", stat.MaxSupply, "limit", maxSupply)
	if (amount.Denom != constants.DefaultBondDenom) && (!maxSupply.IsGTE(newSupply)) {
		return types.ErrAssetIssueGTMaxSupply
	}
	stat.Supply = newSupply
	if err := a.setStat(ctx, stat); err != nil {
		return sdkerrors.Wrap(err, "set stat")
	}
	return nil
}
Some internal implements for asset keeper
package keeper
import (
	"github.com/KuChainNetwork/kuchain/chain/constants"
	"github.com/KuChainNetwork/kuchain/chain/types/coin"
	"github.com/KuChainNetwork/kuchain/x/asset/types"
	sdk "github.com/cosmos/cosmos-sdk/types"
	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
)