-
Notifications
You must be signed in to change notification settings - Fork 0
/
zone.go
137 lines (111 loc) · 3.38 KB
/
zone.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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package keeper
import (
"fmt"
transfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types"
"github.com/Carina-hackatom/nova/x/ibcstaking/types"
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
)
// RegisterZone
func (k Keeper) RegisterZone(ctx sdk.Context, zone *types.RegisteredZone) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixZone)
bz := k.cdc.MustMarshal(zone)
store.Set([]byte(zone.ZoneId), bz)
}
// GetRegisteredZone
func (k Keeper) GetRegisteredZone(ctx sdk.Context, zoneId string) (types.RegisteredZone, bool) {
zone := types.RegisteredZone{}
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixZone)
bz := store.Get([]byte(zoneId))
if len(bz) == 0 {
return zone, false
}
k.cdc.MustUnmarshal(bz, &zone)
return zone, true
}
// DeleteRegisteredZone delete zone info
func (k Keeper) DeleteRegisteredZone(ctx sdk.Context, zoneId string) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixZone)
ctx.Logger().Error(fmt.Sprintf("Removing chain: %s", zoneId))
store.Delete([]byte(zoneId))
}
// IterateRegisteredZones iterate through zones
func (k Keeper) IterateRegisteredZones(ctx sdk.Context, fn func(index int64, zoneInfo types.RegisteredZone) (stop bool)) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefixZone)
iterator := sdk.KVStorePrefixIterator(store, nil)
defer func(iterator sdk.Iterator) {
err := iterator.Close()
if err != nil {
ctx.Logger().Error(fmt.Sprintf("unexpected iterator closed: %s", err))
return
}
}(iterator)
i := int64(0)
for ; iterator.Valid(); iterator.Next() {
zone := types.RegisteredZone{}
k.cdc.MustUnmarshal(iterator.Value(), &zone)
stop := fn(i, zone)
if stop {
break
}
i++
}
}
func (k Keeper) GetRegisteredZoneForValidatorAddr(ctx sdk.Context, validatorAddr string) *types.RegisteredZone {
var zone *types.RegisteredZone
k.IterateRegisteredZones(ctx, func(_ int64, zoneInfo types.RegisteredZone) (stop bool) {
if zoneInfo.ValidatorAddress == validatorAddr {
zone = &zoneInfo
return true
}
return false
})
return zone
}
func (k Keeper) GetZoneForDenom(ctx sdk.Context, denom string) *types.RegisteredZone {
var zone *types.RegisteredZone
k.IterateRegisteredZones(ctx, func(_ int64, zoneInfo types.RegisteredZone) (stop bool) {
if zoneInfo.BaseDenom == denom {
zone = &zoneInfo
return true
}
return false
})
return zone
}
func (k Keeper) GetsnDenomForBaseDenom(ctx sdk.Context, baseDenom string) string {
var snDenom string
k.IterateRegisteredZones(ctx, func(_ int64, zoneInfo types.RegisteredZone) (stop bool) {
if zoneInfo.BaseDenom == baseDenom {
snDenom = zoneInfo.SnDenom
return true
}
return false
})
return snDenom
}
func (k Keeper) GetBaseDenomForSnDenom(ctx sdk.Context, snDenom string) string {
var baseDenom string
k.IterateRegisteredZones(ctx, func(_ int64, zoneInfo types.RegisteredZone) (stop bool) {
if zoneInfo.SnDenom == snDenom {
baseDenom = zoneInfo.BaseDenom
return true
}
return false
})
return baseDenom
}
func (k Keeper) GetIBCHashDenom(ctx sdk.Context, portId, chanId, baseDenom string) string {
var path string
if portId == "" || chanId == "" {
path = ""
} else {
path = portId + "/" + chanId
}
denomTrace := transfertypes.DenomTrace{
Path: path,
BaseDenom: baseDenom,
}
denomHash := denomTrace.IBCDenom()
return denomHash
}