From 0460f7f3587d1500e010bf216147c1080a626e84 Mon Sep 17 00:00:00 2001 From: Bjarte Stien Karlsen Date: Fri, 11 Oct 2024 20:12:04 +0200 Subject: [PATCH 1/4] added display-type to generated serialized json for attributes --- cadence/contracts/utils/SerializeMetadata.cdc | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/cadence/contracts/utils/SerializeMetadata.cdc b/cadence/contracts/utils/SerializeMetadata.cdc index 3cff96de..d90fed98 100644 --- a/cadence/contracts/utils/SerializeMetadata.cdc +++ b/cadence/contracts/utils/SerializeMetadata.cdc @@ -84,13 +84,13 @@ access(all) contract SerializeMetadata { // Append results from the token-level Display view to the serialized JSON compatible string if nftDisplay != nil { serializedResult = serializedResult - .concat(name).concat(Serialize.tryToJSONString(nftDisplay!.name)!).concat(", ") - .concat(description).concat(Serialize.tryToJSONString(nftDisplay!.description)!).concat(", ") - .concat(image).concat(Serialize.tryToJSONString(nftDisplay!.thumbnail.uri())!) + .concat(name).concat(Serialize.tryToJSONString(nftDisplay!.name)!).concat(", ") + .concat(description).concat(Serialize.tryToJSONString(nftDisplay!.description)!).concat(", ") + .concat(image).concat(Serialize.tryToJSONString(nftDisplay!.thumbnail.uri())!) // Append the `externa_url` value from NFTCollectionDisplay view if present if collectionDisplay != nil { return serializedResult.concat(", ") - .concat(externalURL).concat(Serialize.tryToJSONString(collectionDisplay!.externalURL.url)!) + .concat(externalURL).concat(Serialize.tryToJSONString(collectionDisplay!.externalURL.url)!) } } @@ -100,10 +100,10 @@ access(all) contract SerializeMetadata { // Without token-level view, serialize as contract-level metadata return serializedResult - .concat(name).concat(Serialize.tryToJSONString(collectionDisplay!.name)!).concat(", ") - .concat(description).concat(Serialize.tryToJSONString(collectionDisplay!.description)!).concat(", ") - .concat(image).concat(Serialize.tryToJSONString(collectionDisplay!.squareImage.file.uri())!).concat(", ") - .concat(externalLink).concat(Serialize.tryToJSONString(collectionDisplay!.externalURL.url)!) + .concat(name).concat(Serialize.tryToJSONString(collectionDisplay!.name)!).concat(", ") + .concat(description).concat(Serialize.tryToJSONString(collectionDisplay!.description)!).concat(", ") + .concat(image).concat(Serialize.tryToJSONString(collectionDisplay!.squareImage.file.uri())!).concat(", ") + .concat(externalLink).concat(Serialize.tryToJSONString(collectionDisplay!.externalURL.url)!) } /// Serializes given Traits view as a JSON compatible string. If a given Trait is not serializable, it is skipped @@ -129,9 +129,10 @@ access(all) contract SerializeMetadata { continue } serializedResult = serializedResult.concat("{") - .concat("\"trait_type\": ").concat(Serialize.tryToJSONString(trait.name)!) - .concat(", \"value\": ").concat(value!) - .concat("}") + .concat("\"trait_type\": ").concat(Serialize.tryToJSONString(trait.name)!) + .concat(", \"display_type\": ").concat(Serialize.tryToJSONString(trait.display_type)!) + .concat(", \"value\": ").concat(value!) + .concat("}") if i < traits!.traits.length - 1 { serializedResult = serializedResult.concat(",") } @@ -160,11 +161,11 @@ access(all) contract SerializeMetadata { let externalLink = "\"external_link\": " return "data:application/json;utf8,{" - .concat(name).concat(Serialize.tryToJSONString(ftDisplay.name)!).concat(", ") - .concat(symbol).concat(Serialize.tryToJSONString(ftDisplay.symbol)!).concat(", ") - .concat(description).concat(Serialize.tryToJSONString(ftDisplay.description)!).concat(", ") - .concat(externalLink).concat(Serialize.tryToJSONString(ftDisplay.externalURL.url)!) - .concat("}") + .concat(name).concat(Serialize.tryToJSONString(ftDisplay.name)!).concat(", ") + .concat(symbol).concat(Serialize.tryToJSONString(ftDisplay.symbol)!).concat(", ") + .concat(description).concat(Serialize.tryToJSONString(ftDisplay.description)!).concat(", ") + .concat(externalLink).concat(Serialize.tryToJSONString(ftDisplay.externalURL.url)!) + .concat("}") } /// Derives a symbol for use as an ERC20 or ERC721 symbol from a given string, presumably a Cadence contract name. From b4418881d7b707a761ad3a428173530dc76050e4 Mon Sep 17 00:00:00 2001 From: Giovanni Sanchez <108043524+sisyphusSmiling@users.noreply.github.com> Date: Tue, 22 Oct 2024 17:04:48 -0600 Subject: [PATCH 2/4] fix failing serialization test --- cadence/contracts/utils/SerializeMetadata.cdc | 2 +- cadence/tests/serialize_metadata_tests.cdc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cadence/contracts/utils/SerializeMetadata.cdc b/cadence/contracts/utils/SerializeMetadata.cdc index d90fed98..3f3911df 100644 --- a/cadence/contracts/utils/SerializeMetadata.cdc +++ b/cadence/contracts/utils/SerializeMetadata.cdc @@ -130,7 +130,7 @@ access(all) contract SerializeMetadata { } serializedResult = serializedResult.concat("{") .concat("\"trait_type\": ").concat(Serialize.tryToJSONString(trait.name)!) - .concat(", \"display_type\": ").concat(Serialize.tryToJSONString(trait.display_type)!) + .concat(", \"display_type\": ").concat(Serialize.tryToJSONString(trait.displayType)!) .concat(", \"value\": ").concat(value!) .concat("}") if i < traits!.traits.length - 1 { diff --git a/cadence/tests/serialize_metadata_tests.cdc b/cadence/tests/serialize_metadata_tests.cdc index 40498d5c..0b5b6b98 100644 --- a/cadence/tests/serialize_metadata_tests.cdc +++ b/cadence/tests/serialize_metadata_tests.cdc @@ -57,8 +57,8 @@ fun testSerializeNFTSucceeds() { let heightString = mintedBlockHeight.toString() let expectedPrefix = "data:application/json;utf8,{\"name\": \"ExampleNFT\", \"description\": \"Example NFT Collection\", \"image\": \"https://flow.com/examplenft.jpg\", \"external_url\": \"https://example-nft.onflow.org\", " - let altSuffix1 = "\"attributes\": [{\"trait_type\": \"mintedBlock\", \"value\": \"".concat(heightString).concat("\"},{\"trait_type\": \"foo\", \"value\": \"nil\"}]}") - let altSuffix2 = "\"attributes\": [{\"trait_type\": \"foo\", \"value\": \"nil\"}]}, {\"trait_type\": \"mintedBlock\", \"value\": \"".concat(heightString).concat("\"}") + let altSuffix1 = "\"attributes\": [{\"trait_type\": \"mintedBlock\", \"display_type\": \"nil\", \"value\": \"".concat(heightString).concat("\"},{\"trait_type\": \"foo\", \"display_type\": \"nil\", \"value\": \"nil\"}]}") + let altSuffix2 = "\"attributes\": [{\"trait_type\": \"foo\", \"display_type\": \"nil\", \"value\": \"nil\"}]}, {\"trait_type\": \"mintedBlock\", \"display_type\": \"nil\", \"value\": \"".concat(heightString).concat("\"}") let idsResult = executeScript( "../scripts/nft/get_ids.cdc", From 6f57cf506a549f97f1779f0671324c1333d0dc72 Mon Sep 17 00:00:00 2001 From: Giovanni Sanchez <108043524+sisyphusSmiling@users.noreply.github.com> Date: Tue, 22 Oct 2024 17:58:01 -0600 Subject: [PATCH 3/4] update displayType trait serialization --- cadence/contracts/utils/SerializeMetadata.cdc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/cadence/contracts/utils/SerializeMetadata.cdc b/cadence/contracts/utils/SerializeMetadata.cdc index 3f3911df..7a93695b 100644 --- a/cadence/contracts/utils/SerializeMetadata.cdc +++ b/cadence/contracts/utils/SerializeMetadata.cdc @@ -112,7 +112,7 @@ access(all) contract SerializeMetadata { /// @param traits: The Traits view to be serialized /// /// @returns: A JSON compatible string containing the serialized traits as: - /// `\"attributes\": [{\"trait_type\": \"\", \"value\": \"\"}, {...}]` + /// `\"attributes\": [{\"trait_type\": \"\", \"display_type\": \"\", \"value\": \"\"}, {...}]` /// access(all) fun serializeNFTTraitsAsAttributes(_ traits: MetadataViews.Traits): String { @@ -129,10 +129,13 @@ access(all) contract SerializeMetadata { continue } serializedResult = serializedResult.concat("{") - .concat("\"trait_type\": ").concat(Serialize.tryToJSONString(trait.name)!) - .concat(", \"display_type\": ").concat(Serialize.tryToJSONString(trait.displayType)!) - .concat(", \"value\": ").concat(value!) - .concat("}") + .concat("\"trait_type\": ").concat(Serialize.tryToJSONString(trait.name)!) + if trait.displayType != nil { + serializedResult = serializedResult.concat(", \"display_type\": ") + .concat(Serialize.tryToJSONString(trait.displayType)!) + } + serializedResult = serializedResult.concat(", \"value\": ").concat(value!) + .concat("}") if i < traits!.traits.length - 1 { serializedResult = serializedResult.concat(",") } From 4a11fd27b6892a1e1f8098152a1eca236136ef74 Mon Sep 17 00:00:00 2001 From: Giovanni Sanchez <108043524+sisyphusSmiling@users.noreply.github.com> Date: Tue, 22 Oct 2024 18:03:51 -0600 Subject: [PATCH 4/4] fix failing test case --- cadence/tests/serialize_metadata_tests.cdc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cadence/tests/serialize_metadata_tests.cdc b/cadence/tests/serialize_metadata_tests.cdc index 0b5b6b98..40498d5c 100644 --- a/cadence/tests/serialize_metadata_tests.cdc +++ b/cadence/tests/serialize_metadata_tests.cdc @@ -57,8 +57,8 @@ fun testSerializeNFTSucceeds() { let heightString = mintedBlockHeight.toString() let expectedPrefix = "data:application/json;utf8,{\"name\": \"ExampleNFT\", \"description\": \"Example NFT Collection\", \"image\": \"https://flow.com/examplenft.jpg\", \"external_url\": \"https://example-nft.onflow.org\", " - let altSuffix1 = "\"attributes\": [{\"trait_type\": \"mintedBlock\", \"display_type\": \"nil\", \"value\": \"".concat(heightString).concat("\"},{\"trait_type\": \"foo\", \"display_type\": \"nil\", \"value\": \"nil\"}]}") - let altSuffix2 = "\"attributes\": [{\"trait_type\": \"foo\", \"display_type\": \"nil\", \"value\": \"nil\"}]}, {\"trait_type\": \"mintedBlock\", \"display_type\": \"nil\", \"value\": \"".concat(heightString).concat("\"}") + let altSuffix1 = "\"attributes\": [{\"trait_type\": \"mintedBlock\", \"value\": \"".concat(heightString).concat("\"},{\"trait_type\": \"foo\", \"value\": \"nil\"}]}") + let altSuffix2 = "\"attributes\": [{\"trait_type\": \"foo\", \"value\": \"nil\"}]}, {\"trait_type\": \"mintedBlock\", \"value\": \"".concat(heightString).concat("\"}") let idsResult = executeScript( "../scripts/nft/get_ids.cdc",