github.com/Finschia/finschia-sdk@v0.48.1/x/foundation/keeper/internal/treasury.go (about)

     1  package internal
     2  
     3  import (
     4  	sdk "github.com/Finschia/finschia-sdk/types"
     5  	sdkerrors "github.com/Finschia/finschia-sdk/types/errors"
     6  	"github.com/Finschia/finschia-sdk/x/foundation"
     7  )
     8  
     9  func (k Keeper) CollectFoundationTax(ctx sdk.Context) error {
    10  	feeCollector := k.authKeeper.GetModuleAccount(ctx, k.feeCollectorName).GetAddress()
    11  	feesCollectedInt := k.bankKeeper.GetAllBalances(ctx, feeCollector)
    12  	if feesCollectedInt.Empty() {
    13  		return nil
    14  	}
    15  	feesCollected := sdk.NewDecCoinsFromCoins(feesCollectedInt...)
    16  
    17  	// calculate the tax
    18  	taxRatio := k.GetFoundationTax(ctx)
    19  	tax, _ := feesCollected.MulDecTruncate(taxRatio).TruncateDecimal()
    20  	if tax.Empty() {
    21  		return nil
    22  	}
    23  
    24  	// collect the tax
    25  	if err := k.FundTreasury(ctx, feeCollector, tax); err != nil {
    26  		return err
    27  	}
    28  
    29  	return nil
    30  }
    31  
    32  func (k Keeper) GetTreasury(ctx sdk.Context) sdk.DecCoins {
    33  	return k.GetPool(ctx).Treasury
    34  }
    35  
    36  func (k Keeper) FundTreasury(ctx sdk.Context, from sdk.AccAddress, amt sdk.Coins) error {
    37  	pool := k.GetPool(ctx)
    38  	pool.Treasury = pool.Treasury.Add(sdk.NewDecCoinsFromCoins(amt...)...)
    39  	k.SetPool(ctx, pool)
    40  
    41  	return k.bankKeeper.SendCoinsFromAccountToModule(ctx, from, foundation.TreasuryName, amt)
    42  }
    43  
    44  func (k Keeper) WithdrawFromTreasury(ctx sdk.Context, to sdk.AccAddress, amt sdk.Coins) error {
    45  	pool := k.GetPool(ctx)
    46  	remains, hasNeg := pool.Treasury.SafeSub(sdk.NewDecCoinsFromCoins(amt...))
    47  	if hasNeg {
    48  		return sdkerrors.ErrInsufficientFunds.Wrapf("not enough coins in treasury, %s", pool.Treasury)
    49  	}
    50  	pool.Treasury = remains
    51  	k.SetPool(ctx, pool)
    52  
    53  	return k.bankKeeper.SendCoinsFromModuleToAccount(ctx, foundation.TreasuryName, to, amt)
    54  }
    55  
    56  func (k Keeper) GetPool(ctx sdk.Context) foundation.Pool {
    57  	store := ctx.KVStore(k.storeKey)
    58  	key := poolKey
    59  	bz := store.Get(key)
    60  
    61  	var pool foundation.Pool
    62  	k.cdc.MustUnmarshal(bz, &pool)
    63  
    64  	return pool
    65  }
    66  
    67  func (k Keeper) SetPool(ctx sdk.Context, pool foundation.Pool) {
    68  	bz := k.cdc.MustMarshal(&pool)
    69  
    70  	store := ctx.KVStore(k.storeKey)
    71  	key := poolKey
    72  	store.Set(key, bz)
    73  }