66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package keeper
|
|
|
|
import (
|
|
"sort"
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
"github.com/cosmos/cosmos-sdk/x/nft"
|
|
)
|
|
|
|
// InitGenesis new nft genesis
|
|
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, err := sdk.AccAddressFromBech32(entry.Owner)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
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,
|
|
}
|
|
}
|