github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/auth/refund/refund.go (about) 1 package refund 2 3 import ( 4 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 5 sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors" 6 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/types" 7 ) 8 9 func RefundFees(supplyKeeper types.SupplyKeeper, ctx sdk.Context, acc sdk.AccAddress, refundFees sdk.Coins) error { 10 blockTime := ctx.BlockTime() 11 feeCollector := supplyKeeper.GetModuleAccount(ctx, types.FeeCollectorName) 12 coins := feeCollector.GetCoins() 13 14 if !refundFees.IsValid() { 15 return sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "invalid refund fee amount: %s", refundFees) 16 } 17 18 // verify the account has enough funds to pay for fees 19 _, hasNeg := coins.SafeSub(refundFees) 20 if hasNeg { 21 return sdkerrors.Wrapf(sdkerrors.ErrInsufficientFunds, 22 "insufficient funds to refund for fees; %s < %s", coins, refundFees) 23 } 24 25 // Validate the account has enough "spendable" coins as this will cover cases 26 // such as vesting accounts. 27 spendableCoins := feeCollector.SpendableCoins(blockTime) 28 if _, hasNeg := spendableCoins.SafeSub(refundFees); hasNeg { 29 return sdkerrors.Wrapf(sdkerrors.ErrInsufficientFunds, 30 "insufficient funds to pay for refund fees; %s < %s", spendableCoins, refundFees) 31 } 32 ctx.UpdateFromAccountCache(feeCollector, 0) 33 err := supplyKeeper.SendCoinsFromModuleToAccount(ctx, types.FeeCollectorName, acc, refundFees) 34 if err != nil { 35 return sdkerrors.Wrapf(sdkerrors.ErrInsufficientFunds, err.Error()) 36 } 37 38 return nil 39 }