/
gas_meters.go
113 lines (92 loc) · 3.03 KB
/
gas_meters.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package keeper
import (
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/ethereum/go-ethereum/common"
"github.com/tharsis/evmos/v2/x/incentives/types"
)
// GetIncentivesGasMeters - get all registered GasMeters per Incentive
func (k Keeper) GetIncentivesGasMeters(ctx sdk.Context) []types.GasMeter {
gms := []types.GasMeter{}
store := ctx.KVStore(k.storeKey)
iterator := sdk.KVStorePrefixIterator(store, types.KeyPrefixGasMeter)
defer iterator.Close()
for ; iterator.Valid(); iterator.Next() {
contract, userAddress := types.SplitGasMeterKey(iterator.Key())
gas := sdk.BigEndianToUint64(iterator.Value())
gm := types.GasMeter{
Contract: contract.String(),
Participant: userAddress.String(),
CumulativeGas: gas,
}
gms = append(gms, gm)
}
return gms
}
// GetIncentiveGasMeters - get all registered GasMeters per contract
func (k Keeper) GetIncentiveGasMeters(
ctx sdk.Context,
contract common.Address,
) []types.GasMeter {
gms := []types.GasMeter{}
k.IterateIncentiveGasMeters(
ctx, contract,
func(gm types.GasMeter) (stop bool) {
gms = append(gms, gm)
return false
},
)
return gms
}
// IterateIncentiveGasMeters iterates over all the given registered incentivized
// contract's `GasMeter` and performs a callback.
func (k Keeper) IterateIncentiveGasMeters(
ctx sdk.Context,
contract common.Address,
handlerFn func(gm types.GasMeter) (stop bool),
) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixGasMeter)
iterator := sdk.KVStorePrefixIterator(store, contract.Bytes())
defer iterator.Close()
for ; iterator.Valid(); iterator.Next() {
contract, userAddress := types.SplitGasMeterKey(iterator.Key())
gas := sdk.BigEndianToUint64(iterator.Value())
gm := types.GasMeter{
Contract: contract.String(),
Participant: userAddress.String(),
CumulativeGas: gas,
}
if handlerFn(gm) {
break
}
}
}
// GetGasMeter - get cumulativeGas from gas meter
func (k Keeper) GetGasMeter(
ctx sdk.Context,
contract, participant common.Address,
) (uint64, bool) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixGasMeter)
key := append(contract.Bytes(), participant.Bytes()...)
bz := store.Get(key)
if len(bz) == 0 {
return 0, false
}
return sdk.BigEndianToUint64(bz), true
}
// SetGasMeter stores a gasMeter
func (k Keeper) SetGasMeter(ctx sdk.Context, gm types.GasMeter) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixGasMeter)
contract := common.HexToAddress(gm.Contract)
participant := common.HexToAddress(gm.Participant)
key := append(contract.Bytes(), participant.Bytes()...)
store.Set(key, sdk.Uint64ToBigEndian(gm.CumulativeGas))
}
// DeleteGasMeter removes a gasMeter.
func (k Keeper) DeleteGasMeter(ctx sdk.Context, gm types.GasMeter) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixGasMeter)
contract := common.HexToAddress(gm.Contract)
participant := common.HexToAddress(gm.Participant)
key := append(contract.Bytes(), participant.Bytes()...)
store.Delete(key)
}