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 }