Skip to content

Commit 00581e3

Browse files
author
Dreamer
authored
encode & decode class or nft metadata (#323)
* implement ics721 nft_keeper * update logic * fix bug * refactor code * update ics721 * implement ClassMetadataResolver * refactor ClassMetadataResolver * implement TokenMetadataResolver * fix TokenMetadataResolver * reanme ClassMetadataResolver to ClassResolver * refactor code * refactor code * add data validation * fix test error * fix test error * refactor nft builder uint test * creator use hex format * remove ValidateKeywords check when mintToken
1 parent 61bc7a0 commit 00581e3

File tree

15 files changed

+682
-50
lines changed

15 files changed

+682
-50
lines changed

modules/nft/client/cli/cli_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func (s *IntegrationTestSuite) TestNft() {
6363
uri := "uri"
6464
uriHash := "uriHash"
6565
description := "description"
66-
data := "data"
66+
data := "{\"key1\":\"value1\",\"key2\":\"value2\"}"
6767
tokenID := "kitty"
6868
//owner := "owner"
6969
denomName := "name"
@@ -187,12 +187,12 @@ func (s *IntegrationTestSuite) TestNft() {
187187
s.Require().Equal(1, len(collectionItem.Collection.NFTs))
188188

189189
//------test GetCmdEditNFT()-------------
190-
newTokenDate := "newdata"
190+
newTokenData := "{\"key1\":\"value1\",\"key2\":\"value2\"}"
191191
newTokenURI := "newuri"
192192
newTokenURIHash := "newuriHash"
193193
newTokenName := "new Kitty Token"
194194
args = []string{
195-
fmt.Sprintf("--%s=%s", nftcli.FlagData, newTokenDate),
195+
fmt.Sprintf("--%s=%s", nftcli.FlagData, newTokenData),
196196
fmt.Sprintf("--%s=%s", nftcli.FlagURI, newTokenURI),
197197
fmt.Sprintf("--%s=%s", nftcli.FlagURIHash, newTokenURIHash),
198198
fmt.Sprintf("--%s=%s", nftcli.FlagTokenName, newTokenName),
@@ -218,7 +218,7 @@ func (s *IntegrationTestSuite) TestNft() {
218218
s.Require().Equal(newTokenName, newNftItem.Name)
219219
s.Require().Equal(newTokenURI, newNftItem.URI)
220220
s.Require().Equal(newTokenURIHash, newNftItem.UriHash)
221-
s.Require().Equal(newTokenDate, newNftItem.Data)
221+
s.Require().Equal(newTokenData, newNftItem.Data)
222222

223223
//------test GetCmdTransferNFT()-------------
224224
recipient := sdk.AccAddress(crypto.AddressHash([]byte("dgsbl")))
@@ -257,7 +257,7 @@ func (s *IntegrationTestSuite) TestNft() {
257257
//------test GetCmdBurnNFT()-------------
258258
newTokenID := "dgsbl"
259259
args = []string{
260-
fmt.Sprintf("--%s=%s", nftcli.FlagData, newTokenDate),
260+
fmt.Sprintf("--%s=%s", nftcli.FlagData, newTokenData),
261261
fmt.Sprintf("--%s=%s", nftcli.FlagRecipient, from.String()),
262262
fmt.Sprintf("--%s=%s", nftcli.FlagURI, newTokenURI),
263263
fmt.Sprintf("--%s=%s", nftcli.FlagTokenName, newTokenName),

modules/nft/client/testutil/grpc_query_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func (s *IntegrationTestSuite) TestNft() {
6363
uri := "uri"
6464
uriHash := "uriHash"
6565
description := "description"
66-
data := "data"
66+
data := "{\"key1\":\"value1\",\"key2\":\"value2\"}"
6767
tokenID := "kitty"
6868
//owner := "owner"
6969
denomName := "name"

modules/nft/keeper/grpc_query.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ func (k Keeper) Collection(c context.Context, request *types.QueryCollectionRequ
9797
for _, token := range result.Nfts {
9898
owner := k.nk.GetOwner(ctx, request.DenomId, token.Id)
9999

100-
var nftMetadata types.NFTMetadata
101-
if err := k.cdc.Unmarshal(token.Data.GetValue(), &nftMetadata); err != nil {
100+
nftMetadata, err := types.UnmarshalNFTMetadata(k.cdc, token.Data.GetValue())
101+
if err != nil {
102102
return nil, err
103103
}
104104

modules/nft/keeper/keeper_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ var (
5151
denomDescription = "this is a class name of a nft"
5252
denomUri = "denom uri"
5353
denomUriHash = "denom uri hash"
54-
denomData = "denom data"
54+
denomData = "{\"key1\":\"value1\",\"key2\":\"value2\"}"
5555
isCheckTx = false
5656
)
5757

modules/nft/keeper/nft.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ func (k Keeper) UpdateNFT(ctx sdk.Context, denomID,
7575
token.Uri = types.Modify(token.Uri, tokenURI)
7676
token.UriHash = types.Modify(token.UriHash, tokenURIHash)
7777
if types.Modified(tokenNm) || types.Modified(tokenData) {
78-
var nftMetadata types.NFTMetadata
79-
if err := k.cdc.Unmarshal(token.Data.GetValue(), &nftMetadata); err != nil {
78+
nftMetadata, err := types.UnmarshalNFTMetadata(k.cdc, token.Data.GetValue())
79+
if err != nil {
8080
return err
8181
}
8282

@@ -129,8 +129,8 @@ func (k Keeper) TransferOwnership(ctx sdk.Context, denomID,
129129
token.Uri = types.Modify(token.Uri, tokenURI)
130130
token.UriHash = types.Modify(token.UriHash, tokenURIHash)
131131
if tokenMetadataChanged {
132-
var nftMetadata types.NFTMetadata
133-
if err := k.cdc.Unmarshal(token.Data.GetValue(), &nftMetadata); err != nil {
132+
nftMetadata, err := types.UnmarshalNFTMetadata(k.cdc, token.Data.GetValue())
133+
if err != nil {
134134
return err
135135
}
136136

@@ -164,8 +164,8 @@ func (k Keeper) GetNFT(ctx sdk.Context, denomID, tokenID string) (nft exported.N
164164
return nil, sdkerrors.Wrapf(types.ErrUnknownNFT, "not found NFT: %s", denomID)
165165
}
166166

167-
var nftMetadata types.NFTMetadata
168-
if err := k.cdc.Unmarshal(token.Data.GetValue(), &nftMetadata); err != nil {
167+
nftMetadata, err := types.UnmarshalNFTMetadata(k.cdc, token.Data.GetValue())
168+
if err != nil {
169169
return nil, err
170170
}
171171

@@ -184,8 +184,8 @@ func (k Keeper) GetNFT(ctx sdk.Context, denomID, tokenID string) (nft exported.N
184184
func (k Keeper) GetNFTs(ctx sdk.Context, denom string) (nfts []exported.NFT, err error) {
185185
tokens := k.nk.GetNFTsOfClass(ctx, denom)
186186
for _, token := range tokens {
187-
var nftMetadata types.NFTMetadata
188-
if err := k.cdc.Unmarshal(token.Data.GetValue(), &nftMetadata); err != nil {
187+
nftMetadata, err := types.UnmarshalNFTMetadata(k.cdc, token.Data.GetValue())
188+
if err != nil {
189189
return nil, err
190190
}
191191
nfts = append(nfts, types.BaseNFT{

modules/nft/simulation/genesis.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func RandomizedGenState(simState *module.SimulationState) {
4242
// 10% of accounts own an NFT
4343
if simState.Rand.Intn(100) < 10 {
4444
baseNFT := types.NewBaseNFT(
45-
genNFTID(simState.Rand, types.MinDenomLen, types.MaxDenomLen), // id
45+
genNFTID(simState.Rand, 3, 128), // id
4646
simtypes.RandStringOfLength(simState.Rand, 10),
4747
acc.Address,
4848
simtypes.RandStringOfLength(simState.Rand, 45), // tokenURI

modules/nft/simulation/operations.go

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ const (
2727
OpWeightMsgTransferDenom = "op_weight_msg_transfer_denom"
2828
)
2929

30+
var (
31+
data = []string{
32+
"{\"key1\":\"value1\",\"key2\":\"value2\"}",
33+
"{\"irismod:key1\":\"value1\",\"irismod:key2\":\"value2\"}",
34+
}
35+
)
36+
3037
// WeightedOperations returns all the operations from the module with their respective weights
3138
func WeightedOperations(
3239
appParams simtypes.AppParams,
@@ -125,9 +132,9 @@ func SimulateMsgTransferNFT(k keeper.Keeper, ak types.AccountKeeper, bk types.Ba
125132
"",
126133
"",
127134
"",
128-
simtypes.RandStringOfLength(r, 10), // tokenData
129-
ownerAddr.String(), // sender
130-
recipientAccount.Address.String(), // recipient
135+
randData(r), // tokenData
136+
ownerAddr.String(), // sender
137+
recipientAccount.Address.String(), // recipient
131138
)
132139
account := ak.GetAccount(ctx, ownerAddr)
133140

@@ -185,7 +192,7 @@ func SimulateMsgEditNFT(k keeper.Keeper, ak types.AccountKeeper, bk types.BankKe
185192
"",
186193
simtypes.RandStringOfLength(r, 45), // tokenURI
187194
simtypes.RandStringOfLength(r, 32), // tokenURI
188-
simtypes.RandStringOfLength(r, 10), // tokenData
195+
randData(r), // tokenData
189196
ownerAddr.String(),
190197
)
191198

@@ -237,12 +244,12 @@ func SimulateMsgMintNFT(k keeper.Keeper, ak types.AccountKeeper, bk types.BankKe
237244
randomRecipient, _ := simtypes.RandomAcc(r, accs)
238245

239246
msg := types.NewMsgMintNFT(
240-
genNFTID(r, types.MinDenomLen, types.MaxDenomLen), // nft ID
241-
randDenom(ctx, k, r, true, false), // denom
247+
genNFTID(r, 3, 128), // nft ID
248+
randDenom(ctx, k, r, true, false), // denom
242249
"",
243250
simtypes.RandStringOfLength(r, 45), // tokenURI
244251
simtypes.RandStringOfLength(r, 32), // uriHash
245-
simtypes.RandStringOfLength(r, 10), // tokenData
252+
randData(r), // tokenData
246253
randomSender.Address.String(), // sender
247254
randomRecipient.Address.String(), // recipient
248255
)
@@ -421,7 +428,7 @@ func SimulateMsgIssueDenom(k keeper.Keeper, ak types.AccountKeeper, bk types.Ban
421428
simtypes.RandStringOfLength(r, 10),
422429
simtypes.RandStringOfLength(r, 10),
423430
simtypes.RandStringOfLength(r, 32),
424-
simtypes.RandStringOfLength(r, 20),
431+
randData(r),
425432
)
426433
account := ak.GetAccount(ctx, sender.Address)
427434
spendable := bk.SpendableCoins(ctx, account.GetAddress())
@@ -484,7 +491,7 @@ func randNFT(ctx sdk.Context, k keeper.Keeper, r *rand.Rand, mintable, editable
484491
}
485492

486493
func genDenomID(r *rand.Rand) string {
487-
len := simtypes.RandIntBetween(r, types.MinDenomLen, types.MaxDenomLen)
494+
len := simtypes.RandIntBetween(r, 3, 128)
488495
var denomID string
489496
for {
490497
denomID = strings.ToLower(simtypes.RandStringOfLength(r, len))
@@ -527,6 +534,11 @@ func randDenom(ctx sdk.Context, k keeper.Keeper, r *rand.Rand, mintable, editabl
527534
return denoms[idx]
528535
}
529536

537+
func randData(r *rand.Rand) string {
538+
idx := r.Intn(len(data))
539+
return data[idx]
540+
}
541+
530542
func genRandomBool(r *rand.Rand) bool {
531543
return r.Int()%2 == 0
532544
}

0 commit comments

Comments
 (0)