Skip to content

Commit 4c8f6cb

Browse files
authored
Support NFT base64 uri and properties (#66)
1 parent 2047ec5 commit 4c8f6cb

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

Thirdweb.Tests/Thirdweb.Storage/Thirdweb.Storage.Tests.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace Thirdweb.Tests.Storage;
1+
using Newtonsoft.Json;
2+
3+
namespace Thirdweb.Tests.Storage;
24

35
public class StorageTests : BaseTests
46
{
@@ -55,6 +57,19 @@ public async Task DownloadTest_Bytes()
5557
Assert.NotEmpty(res);
5658
}
5759

60+
[Fact(Timeout = 120000)]
61+
public async Task DownloadTest_Base64Uri()
62+
{
63+
var uri =
64+
"data:application/json;base64,eyJuYW1lIjogIllvbml4IiwgImRlc2NyaXB0aW9uIjogIkZyb20gYSBkaXN0YW50IGZ1dHVyZSwgVGFpa28gTGFicyBoYXMgZGV2ZWxvcGVkIGEgc2VjcmV0IHdlYXBvbiB0byBjb21iYXQgdGhlIGdyZWF0IGNhbGFtaXR5IGtub3duIGFzICdGZWVzLCcgYSBtYXNzaXZlIGdhcyBjbG91ZCB0aGF0IHBvaXNvbnMgdGhlIGVudGlyZSBwbGFuZXQsIHB1dHRpbmcgYWxsIGNpdGl6ZW5zIGF0IHJpc2suIEFsdGhvdWdoIHRoZSBpZGVhIGlzIGJyaWxsaWFudCwgdGhlIFRhaWtvIE1vbmtleXMgYXJlIHN0aWxsIGltbWF0dXJlLCBhbG1vc3Qgc3R1cGlkISBUaGUgb25seSB3YXkgdG8gZmlnaHQgdGhpcyBzY291cmdlIGlzIHRvIGZpbmQgYSB3YXkgdG8gdHJhaW4gdGhlbSwgdHVybmluZyB0aGVtIGludG8gdGhlIG1vc3QgcG93ZXJmdWwgc2VjcmV0IHdlYXBvbiBvZiBhbGwuIEJ5IGNoYW5jZSwgYSBicmlkZ2UgaGFzIG9wZW5lZCBiZXR3ZWVuIHR3byB3b3JsZHMsIGFuZCBpdCBzZWVtcyB0aGF0IHRoZSBNb25rZXkgUmVhbG0gaXMgdGhlIGJlc3QgcGxhY2UgdG8gaW1wbGVtZW50IHRoZSBncmFuZCBwbGFuISBGaWdodCBhbmQgYmVjb21lIHRoZSBiZXN0IG1vbmtleTsgb25seSB5b3UgY2FuIG1ha2UgR2FzIEZlZXMgYSBkaXN0YW50IG1lbW9yeS4iLCAiaW1hZ2UiOiAiaXBmczovL1FtVzFqOFRKZGRSOVdVWEhDODFlb05SWGoyYVY4NndzRnJWWnJVYTRyY1dyejIvU01UYWlrb0xvdy5qcGciLCAiYW5pbWF0aW9uX3VybCI6ICJpcGZzOi8vUW1XMWo4VEpkZFI5V1VYSEM4MWVvTlJYajJhVjg2d3NGclZaclVhNHJjV3J6Mi9TTVRhaWtvSGlnaC5qcGciLCAicHJvcGVydGllcyI6IHsiTnVtYmVyIjogMSwgIlJQRyBDbGFzcyI6ICJOb25lIiwgIkNsYW4iOiAiU3R1cGlkIE1vbmtzIiwgIkxldmVsIjogMX19";
65+
66+
var client = ThirdwebClient.Create(secretKey: this.SecretKey);
67+
var res = await ThirdwebStorage.Download<NFTMetadata>(client, uri);
68+
Assert.NotNull(res.Properties);
69+
var propertiesObj = JsonConvert.DeserializeObject<Dictionary<string, object>>(JsonConvert.SerializeObject(res.Properties));
70+
Assert.True(propertiesObj!.Count > 0);
71+
}
72+
5873
[Fact(Timeout = 120000)]
5974
public async Task DownloadTest_400()
6075
{

Thirdweb/Thirdweb.Extensions/ExtensionTypes.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,12 @@ public struct NFTMetadata
236236
/// </summary>
237237
[JsonProperty("attributes")]
238238
public object Attributes { get; set; }
239+
240+
/// <summary>
241+
/// Gets or sets the properties of the NFT.
242+
/// </summary>
243+
[JsonProperty("properties")]
244+
public object Properties { get; set; }
239245
}
240246

241247
#endregion

Thirdweb/Thirdweb.Storage/ThirdwebStorage.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ public static async Task<T> Download<T>(ThirdwebClient client, string uri, int?
2424
throw new ArgumentNullException(nameof(uri));
2525
}
2626

27+
if (uri.StartsWith("data:application/json;base64,"))
28+
{
29+
var base64Data = uri["data:application/json;base64,".Length..];
30+
var jsonData = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(base64Data));
31+
return JsonConvert.DeserializeObject<T>(jsonData);
32+
}
33+
2734
uri = uri.ReplaceIPFS($"https://{client.ClientId}.ipfscdn.io/ipfs/");
2835

2936
using var cts = new CancellationTokenSource(requestTimeout ?? client.FetchTimeoutOptions.GetTimeout(TimeoutType.Storage));
@@ -94,8 +101,6 @@ public static async Task<IPFSUploadResult> UploadRaw(ThirdwebClient client, byte
94101
/// <exception cref="ArgumentNullException">Thrown if the path is null or empty.</exception>
95102
public static async Task<IPFSUploadResult> Upload(ThirdwebClient client, string path)
96103
{
97-
return string.IsNullOrEmpty(path)
98-
? throw new ArgumentNullException(nameof(path))
99-
: await UploadRaw(client, await File.ReadAllBytesAsync(path).ConfigureAwait(false)).ConfigureAwait(false);
104+
return string.IsNullOrEmpty(path) ? throw new ArgumentNullException(nameof(path)) : await UploadRaw(client, await File.ReadAllBytesAsync(path).ConfigureAwait(false)).ConfigureAwait(false);
100105
}
101106
}

0 commit comments

Comments
 (0)