From a61dbefc024b0d9de8f9112e3a7d75778bdff170 Mon Sep 17 00:00:00 2001 From: Dreamer <745124335@qq.com> Date: Wed, 1 Feb 2023 13:58:08 +0800 Subject: [PATCH] fix empty json data for class/nft metadata (#332) --- modules/nft/types/builder.go | 36 ++++++++++++++++++++----------- modules/nft/types/builder_test.go | 4 ++-- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/modules/nft/types/builder.go b/modules/nft/types/builder.go index db9d0368..5de91307 100644 --- a/modules/nft/types/builder.go +++ b/modules/nft/types/builder.go @@ -72,6 +72,10 @@ func (cb ClassBuilder) BuildMetadata(class nft.Class) (string, error) { //when classData is not a legal json, there is no need to parse the data return base64.RawStdEncoding.EncodeToString([]byte(metadata.Data)), nil } + //note: if metadata.Data is null, it may cause map to be redefined as nil + if kvals == nil { + kvals = make(map[string]interface{}) + } } creator, err := sdk.AccAddressFromBech32(metadata.Creator) if err != nil { @@ -210,9 +214,13 @@ func (cb ClassBuilder) Build(classID, classURI, classData string) (nft.Class, er } } - data, err := json.Marshal(dataMap) - if err != nil { - return nft.Class{}, err + var data = "" + if len(dataMap) > 0 { + dataBz, err := json.Marshal(dataMap) + if err != nil { + return nft.Class{}, err + } + data = string(dataBz) } any, err := codectypes.NewAnyWithValue(&DenomMetadata{ @@ -220,7 +228,7 @@ func (cb ClassBuilder) Build(classID, classURI, classData string) (nft.Class, er Schema: schema, MintRestricted: mintRestricted, UpdateRestricted: updateRestricted, - Data: string(data), + Data: data, }) if err != nil { return nft.Class{}, err @@ -261,6 +269,10 @@ func (tb TokenBuilder) BuildMetadata(token nft.NFT) (string, error) { //when nftMetadata is not a legal json, there is no need to parse the data return base64.RawStdEncoding.EncodeToString([]byte(nftMetadata.Data)), nil } + //note: if nftMetadata.Data is null, it may cause map to be redefined as nil + if kvals == nil { + kvals = make(map[string]interface{}) + } } kvals[TokenKeyName] = MediaField{Value: nftMetadata.Name} kvals[TokenKeyURIhash] = MediaField{Value: token.UriHash} @@ -317,14 +329,18 @@ func (tb TokenBuilder) Build(classId, tokenId, tokenURI, tokenData string) (nft. } } - data, err := json.Marshal(dataMap) - if err != nil { - return nft.NFT{}, err + var data = "" + if len(dataMap) > 0 { + dataBz, err := json.Marshal(dataMap) + if err != nil { + return nft.NFT{}, err + } + data = string(dataBz) } metadata, err := codectypes.NewAnyWithValue(&NFTMetadata{ Name: name, - Data: string(data), + Data: data, }) if err != nil { return nft.NFT{}, err @@ -338,7 +354,3 @@ func (tb TokenBuilder) Build(classId, tokenId, tokenURI, tokenData string) (nft. Data: metadata, }, nil } - -func PopIfExist() { - -} diff --git a/modules/nft/types/builder_test.go b/modules/nft/types/builder_test.go index 2ddd7512..d8052a90 100644 --- a/modules/nft/types/builder_test.go +++ b/modules/nft/types/builder_test.go @@ -203,7 +203,7 @@ func TestClassBuilder_Build(t *testing.T) { args: args{ classData: `{"irismod:creator":{"value":"f8a9eee6bce5bc043e5feec2baef355f87dbfcdf"},"irismod:description":{"value":"digital cat"},"irismod:mint_restricted":{"value":true},"irismod:name":{"value":"kitty"},"irismod:schema":{"value":"{}"},"irismod:symbol":{"value":"symbol"},"irismod:update_restricted":{"value":true},"irismod:uri_hash":{"value":"uri_hash"}}`, }, - want: `{"@type":"/cosmos.nft.v1beta1.Class","id":"cat","name":"kitty","symbol":"symbol","description":"digital cat","uri":"uri","uri_hash":"uri_hash","data":{"@type":"/irismod.nft.DenomMetadata","creator":"cosmos1lz57ae4uuk7qg0jlampt4me4t7rahlxl5pnn3y","schema":"{}","mint_restricted":true,"update_restricted":true,"data":"{}"}}`, + want: `{"@type":"/cosmos.nft.v1beta1.Class","id":"cat","name":"kitty","symbol":"symbol","description":"digital cat","uri":"uri","uri_hash":"uri_hash","data":{"@type":"/irismod.nft.DenomMetadata","creator":"cosmos1lz57ae4uuk7qg0jlampt4me4t7rahlxl5pnn3y","schema":"{}","mint_restricted":true,"update_restricted":true,"data":""}}`, wantErr: false, }, { @@ -240,7 +240,7 @@ func TestClassBuilder_Build(t *testing.T) { require.NoError(t, err, " class cdc.MarshalInterfaceJSON failed") if string(got) != tt.want { - t.Errorf("ClassBuilder.BuildMetadata() = %v, want %v", got, tt.want) + t.Errorf("ClassBuilder.BuildMetadata() = %v, want %v", string(got), tt.want) } }) }