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 }