71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package keeper
|
|
|
|
import (
|
|
"context"
|
|
"sort"
|
|
|
|
"cosmossdk.io/x/nft"
|
|
)
|
|
|
|
// InitGenesis initializes the nft module's genesis state from a given
|
|
// genesis state.
|
|
func (k Keeper) InitGenesis(ctx context.Context, data *nft.GenesisState) error {
|
|
for _, class := range data.Classes {
|
|
if err := k.SaveClass(ctx, *class); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
for _, entry := range data.Entries {
|
|
for _, nft := range entry.Nfts {
|
|
owner, err := k.ac.StringToBytes(entry.Owner)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := k.Mint(ctx, *nft, owner); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ExportGenesis returns a GenesisState for a given context.
|
|
func (k Keeper) ExportGenesis(ctx context.Context) (*nft.GenesisState, error) {
|
|
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)
|
|
ownerStr, err := k.ac.BytesToString(owner.Bytes())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
nftArr, ok := nftMap[ownerStr]
|
|
if !ok {
|
|
nftArr = make([]*nft.NFT, 0)
|
|
}
|
|
nftMap[ownerStr] = 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,
|
|
}, nil
|
|
}
|