/
denom.go
160 lines (134 loc) · 3.3 KB
/
denom.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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package keeper
import (
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/nft"
"github.com/medibloc/panacea-core/v2/x/pnft/types"
)
func (k Keeper) SaveDenom(
ctx sdk.Context,
denom *types.Denom,
) error {
class, err := types.NewClassFromDenom(k.cdc, denom)
if err != nil {
return err
}
if err := k.nftKeeper.SaveClass(ctx, *class); err != nil {
return err
}
return ctx.EventManager().EmitTypedEvent(&types.EventSaveDenom{
Id: denom.Id,
Creator: denom.Owner,
})
}
func (k Keeper) ParseDenoms(classes []*nft.Class) ([]*types.Denom, error) {
var denoms []*types.Denom
for _, class := range classes {
denom, err := types.NewDenomFromClass(k.cdc, class)
if err != nil {
return nil, err
}
denoms = append(denoms, denom)
}
return denoms, nil
}
func (k Keeper) UpdateDenom(ctx sdk.Context, msg *types.Denom) error {
denom, err := k.GetDenom(ctx, msg.GetId())
if err != nil {
return err
}
updater := msg.Owner
if updater != denom.Owner {
return fmt.Errorf("permission denied: %s does not have permission to modify this resource", updater)
}
if msg.Name != "" {
denom.Name = msg.Name
}
if msg.Symbol != "" {
denom.Symbol = msg.Symbol
}
if msg.Description != "" {
denom.Description = msg.Description
}
if msg.Uri != "" {
denom.Uri = msg.Uri
}
if msg.UriHash != "" {
denom.UriHash = msg.UriHash
}
if msg.Data != "" {
denom.Data = msg.Data
}
class, err := types.NewClassFromDenom(k.cdc, denom)
if err != nil {
return err
}
if err := k.nftKeeper.UpdateClass(ctx, *class); err != nil {
return err
}
return ctx.EventManager().EmitTypedEvent(&types.EventUpdateDenom{
Id: denom.Id,
Updater: updater,
})
}
func (k Keeper) DeleteDenom(ctx sdk.Context, id string, remover string) error {
denom, err := k.GetDenom(ctx, id)
if err != nil {
return err
}
if remover != denom.Owner {
return fmt.Errorf("permission denied: %s does not have permission to remove this resource", remover)
}
store := ctx.KVStore(k.storeKey)
store.Delete(classStoreKey(id))
return ctx.EventManager().EmitTypedEvent(&types.EventDeleteDenom{
Id: denom.Id,
Remover: remover,
})
}
func (k Keeper) TransferDenomOwner(
ctx sdk.Context,
id string,
sender string,
receiver string,
) error {
denom, err := k.GetDenom(ctx, id)
if err != nil {
return err
}
if sender != denom.Owner {
return fmt.Errorf("%s is not allowed transfer denom to %s", sender, receiver)
}
denom.Owner = receiver
class, err := types.NewClassFromDenom(k.cdc, denom)
if err != nil {
return err
}
if err := k.nftKeeper.UpdateClass(ctx, *class); err != nil {
return err
}
return ctx.EventManager().EmitTypedEvent(&types.EventTransferDenom{
Id: denom.Id,
Sender: sender,
Receiver: receiver,
})
}
func (k Keeper) GetAllDenoms(ctx sdk.Context) ([]*types.Denom, error) {
var denoms []*types.Denom
classes := k.nftKeeper.GetClasses(ctx)
for _, class := range classes {
denom, err := types.NewDenomFromClass(k.cdc, class)
if err != nil {
return nil, err
}
denoms = append(denoms, denom)
}
return denoms, nil
}
func (k Keeper) GetDenom(ctx sdk.Context, id string) (*types.Denom, error) {
class, found := k.nftKeeper.GetClass(ctx, id)
if !found {
return nil, fmt.Errorf("not found class")
}
return types.NewDenomFromClass(k.cdc, &class)
}