-
Notifications
You must be signed in to change notification settings - Fork 3.6k
/
genesis.go
62 lines (55 loc) · 1.43 KB
/
genesis.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
package keeper
import (
"sort"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/nft"
)
// InitGenesis initializes the nft module's genesis state from a given
// genesis state.
func (k Keeper) InitGenesis(ctx sdk.Context, data *nft.GenesisState) {
for _, class := range data.Classes {
if err := k.SaveClass(ctx, *class); err != nil {
panic(err)
}
}
for _, entry := range data.Entries {
for _, nft := range entry.Nfts {
owner := sdk.MustAccAddressFromBech32(entry.Owner)
if err := k.Mint(ctx, *nft, owner); err != nil {
panic(err)
}
}
}
}
// ExportGenesis returns a GenesisState for a given context.
func (k Keeper) ExportGenesis(ctx sdk.Context) *nft.GenesisState {
classes := k.GetClasses(ctx)
nftMap := make(map[string][]*nft.NFT)
for _, class := range classes {
nfts := k.GetNFTsOfClass(ctx, class.Id)
for i, n := range nfts {
owner := k.GetOwner(ctx, n.ClassId, n.Id)
nftArr, ok := nftMap[owner.String()]
if !ok {
nftArr = make([]*nft.NFT, 0)
}
nftMap[owner.String()] = append(nftArr, &nfts[i])
}
}
owners := make([]string, 0, len(nftMap))
for owner := range nftMap {
owners = append(owners, owner)
}
sort.Strings(owners)
entries := make([]*nft.Entry, 0, len(nftMap))
for _, owner := range owners {
entries = append(entries, &nft.Entry{
Owner: owner,
Nfts: nftMap[owner],
})
}
return &nft.GenesisState{
Classes: classes,
Entries: entries,
}
}