forked from bianjieai/nft-transfer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
trace.go
104 lines (87 loc) · 3.4 KB
/
trace.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
package keeper
import (
errorsmod "cosmossdk.io/errors"
tmbytes "github.com/cometbft/cometbft/libs/bytes"
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/aadhi0612/nft-transfer/types"
)
// GetClassTrace retrieves the full identifiers trace and base classId from the store.
func (k Keeper) GetClassTrace(ctx sdk.Context, classTraceHash tmbytes.HexBytes) (types.ClassTrace, bool) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.ClassTraceKey)
bz := store.Get(classTraceHash)
if bz == nil {
return types.ClassTrace{}, false
}
classTrace := k.MustUnmarshalClassTrace(bz)
return classTrace, true
}
// GetAllClassTraces returns the trace information for all the class.
func (k Keeper) GetAllClassTraces(ctx sdk.Context) types.Traces {
traces := types.Traces{}
k.IterateClassTraces(ctx, func(classTrace types.ClassTrace) bool {
traces = append(traces, classTrace)
return false
})
return traces.Sort()
}
// IterateClassTraces iterates over the class traces in the store
// and performs a callback function.
func (k Keeper) IterateClassTraces(ctx sdk.Context, cb func(_ types.ClassTrace) bool) {
store := ctx.KVStore(k.storeKey)
iterator := sdk.KVStorePrefixIterator(store, types.ClassTraceKey)
defer iterator.Close()
for ; iterator.Valid(); iterator.Next() {
classTrace := k.MustUnmarshalClassTrace(iterator.Value())
if cb(classTrace) {
break
}
}
}
// ClassPathFromHash returns the full class path prefix from an ibc classId with a hash
// component.
func (k Keeper) ClassPathFromHash(ctx sdk.Context, classID string) (string, error) {
// trim the class prefix, by default "ibc/"
hexHash := classID[len(types.ClassPrefix+"/"):]
hash, err := types.ParseHexHash(hexHash)
if err != nil {
return "", errorsmod.Wrap(types.ErrInvalidClassID, err.Error())
}
classTrace, found := k.GetClassTrace(ctx, hash)
if !found {
return "", errorsmod.Wrap(types.ErrTraceNotFound, hexHash)
}
return classTrace.GetFullClassPath(), nil
}
// HasClassTrace checks if a the key with the given denomination trace hash exists on the store.
func (k Keeper) HasClassTrace(ctx sdk.Context, classTraceHash tmbytes.HexBytes) bool {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.ClassTraceKey)
return store.Has(classTraceHash)
}
// SetClassTrace sets a new {trace hash -> class trace} pair to the store.
func (k Keeper) SetClassTrace(ctx sdk.Context, classTrace types.ClassTrace) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.ClassTraceKey)
bz := k.MustMarshalClassTrace(classTrace)
store.Set(classTrace.Hash(), bz)
}
// MustUnmarshalClassTrace attempts to decode and return an ClassTrace object from
// raw encoded bytes. It panics on error.
func (k Keeper) MustUnmarshalClassTrace(bz []byte) types.ClassTrace {
var classTrace types.ClassTrace
k.cdc.MustUnmarshal(bz, &classTrace)
return classTrace
}
// MustMarshalClassTrace attempts to decode and return an ClassTrace object from
// raw encoded bytes. It panics on error.
func (k Keeper) MustMarshalClassTrace(classTrace types.ClassTrace) []byte {
return k.cdc.MustMarshal(&classTrace)
}
// UnmarshalClassTrace attempts to decode and return an ClassTrace object from
// raw encoded bytes.
func (k Keeper) UnmarshalClassTrace(bz []byte) (types.ClassTrace, error) {
var classTrace types.ClassTrace
if err := k.cdc.Unmarshal(bz, &classTrace); err != nil {
return types.ClassTrace{}, err
}
return classTrace, nil
}