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  }