-
Notifications
You must be signed in to change notification settings - Fork 51
/
oracle_pool_slippage_track.go
101 lines (82 loc) · 3.34 KB
/
oracle_pool_slippage_track.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
package keeper
import (
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/elys-network/elys/x/amm/types"
)
func (k Keeper) GetSlippageTrack(ctx sdk.Context, poolId uint64, timestamp uint64) types.OraclePoolSlippageTrack {
track := types.OraclePoolSlippageTrack{}
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte(types.OraclePoolSlippageTrackPrefix))
bz := store.Get(types.OraclePoolSlippageTrackKey(poolId, timestamp))
if len(bz) == 0 {
return types.OraclePoolSlippageTrack{
PoolId: poolId,
Timestamp: uint64(ctx.BlockTime().Unix()),
Tracked: sdk.Coins{},
}
}
k.cdc.MustUnmarshal(bz, &track)
return track
}
func (k Keeper) SetSlippageTrack(ctx sdk.Context, track types.OraclePoolSlippageTrack) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte(types.OraclePoolSlippageTrackPrefix))
bz := k.cdc.MustMarshal(&track)
store.Set(types.OraclePoolSlippageTrackKey(track.PoolId, track.Timestamp), bz)
}
func (k Keeper) DeleteSlippageTrack(ctx sdk.Context, track types.OraclePoolSlippageTrack) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte(types.OraclePoolSlippageTrackPrefix))
store.Delete(types.OraclePoolSlippageTrackKey(track.PoolId, track.Timestamp))
}
func (k Keeper) AllSlippageTracks(ctx sdk.Context) []types.OraclePoolSlippageTrack {
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte(types.OraclePoolSlippageTrackPrefix))
iterator := sdk.KVStorePrefixIterator(store, nil)
defer iterator.Close()
tracks := []types.OraclePoolSlippageTrack{}
for ; iterator.Valid(); iterator.Next() {
track := types.OraclePoolSlippageTrack{}
k.cdc.MustUnmarshal(iterator.Value(), &track)
tracks = append(tracks, track)
}
return tracks
}
func (k Keeper) GetLastSlippageTrack(ctx sdk.Context, poolId uint64) types.OraclePoolSlippageTrack {
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte(types.OraclePoolSlippageTrackPrefix))
iterator := sdk.KVStoreReversePrefixIterator(store, sdk.Uint64ToBigEndian(poolId))
defer iterator.Close()
track := types.OraclePoolSlippageTrack{}
if iterator.Valid() {
k.cdc.MustUnmarshal(iterator.Value(), &track)
return track
}
return types.OraclePoolSlippageTrack{
PoolId: poolId,
Timestamp: uint64(ctx.BlockTime().Unix()),
Tracked: sdk.Coins{},
}
}
func (k Keeper) GetFirstSlippageTrack(ctx sdk.Context, poolId uint64) types.OraclePoolSlippageTrack {
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte(types.OraclePoolSlippageTrackPrefix))
iterator := sdk.KVStorePrefixIterator(store, sdk.Uint64ToBigEndian(poolId))
defer iterator.Close()
track := types.OraclePoolSlippageTrack{}
if iterator.Valid() {
k.cdc.MustUnmarshal(iterator.Value(), &track)
return track
}
return types.OraclePoolSlippageTrack{
PoolId: poolId,
Timestamp: uint64(ctx.BlockTime().Unix()),
Tracked: sdk.Coins{},
}
}
func (k Keeper) GetTrackedSlippageDiff(ctx sdk.Context, poolId uint64) sdk.Coins {
lastTrack := k.GetLastSlippageTrack(ctx, poolId)
firstTrack := k.GetFirstSlippageTrack(ctx, poolId)
return lastTrack.Tracked.Sub(firstTrack.Tracked...)
}
func (k Keeper) TrackSlippage(ctx sdk.Context, poolId uint64, amount sdk.Coin) {
lastTrack := k.GetLastSlippageTrack(ctx, poolId)
lastTrack.Tracked = lastTrack.Tracked.Add(amount)
lastTrack.Timestamp = uint64(ctx.BlockTime().Unix())
k.SetSlippageTrack(ctx, lastTrack)
}