github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/auth/exported/utils.go (about)

     1  package exported
     2  
     3  import (
     4  	storetypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/types"
     5  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     6  )
     7  
     8  var kvGasConfig storetypes.GasConfig
     9  
    10  func init() {
    11  	kvGasConfig = storetypes.KVGasConfig()
    12  }
    13  
    14  type SizerAccountKeeper interface {
    15  	GetEncodedAccountSize(acc Account) int
    16  }
    17  
    18  type AccountKeeper interface {
    19  	GetAccount(ctx sdk.Context, addr sdk.AccAddress) Account
    20  }
    21  
    22  func TryAddGetAccountGas(gasMeter sdk.GasMeter, ak SizerAccountKeeper, acc Account) (bool, sdk.Gas) {
    23  	if ak == nil || gasMeter == nil || acc == nil {
    24  		return false, 0
    25  	}
    26  	size := ak.GetEncodedAccountSize(acc)
    27  	if size == 0 {
    28  		return false, 0
    29  	}
    30  	gas := kvGasConfig.ReadCostFlat + storetypes.Gas(size)*kvGasConfig.ReadCostPerByte
    31  	gasMeter.ConsumeGas(gas, "x/bank/internal/keeper/keeper.BaseSendKeeper")
    32  	return true, gas
    33  }
    34  
    35  func GetAccountGas(ak SizerAccountKeeper, acc Account) (sdk.Gas, bool) {
    36  	if acc == nil || ak == nil {
    37  		return 0, false
    38  	}
    39  	size := ak.GetEncodedAccountSize(acc)
    40  	if size == 0 {
    41  		return 0, false
    42  	}
    43  	gas := kvGasConfig.ReadCostFlat + storetypes.Gas(size)*kvGasConfig.ReadCostPerByte
    44  	return gas, true
    45  }
    46  
    47  func GetAccountAndGas(ctx *sdk.Context, keeper AccountKeeper, addr sdk.AccAddress) (Account, sdk.Gas) {
    48  	gasMeter := ctx.GasMeter()
    49  	tmpGasMeter := sdk.GetReusableInfiniteGasMeter()
    50  	ctx.SetGasMeter(tmpGasMeter)
    51  	defer func() {
    52  		ctx.SetGasMeter(gasMeter)
    53  		sdk.ReturnInfiniteGasMeter(tmpGasMeter)
    54  	}()
    55  
    56  	acc := keeper.GetAccount(*ctx, addr)
    57  
    58  	gasUsed := tmpGasMeter.GasConsumed()
    59  	gasMeter.ConsumeGas(gasUsed, "get account")
    60  
    61  	return acc, gasUsed
    62  }