From e903f27de44bef8e2b04d999576b4b2552bfcb15 Mon Sep 17 00:00:00 2001 From: Damian Date: Wed, 15 May 2024 00:14:42 +0300 Subject: [PATCH 1/5] chore: package v up --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a5130e1..c7ef5fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@itheum/sdk-mx-data-nft", - "version": "3.5.0-alpha.3", + "version": "3.5.0-alpha.4", "description": "SDK for Itheum's Data NFT Technology on MultiversX Blockchain", "main": "out/index.js", "types": "out/index.d.js", From 396d63512b486c8c2fa1cba4208061177da7787a Mon Sep 17 00:00:00 2001 From: Damian Date: Wed, 15 May 2024 00:33:35 +0300 Subject: [PATCH 2/5] fix: switch nft.storage to pinata --- src/common/mint-utils.ts | 68 ++++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/src/common/mint-utils.ts b/src/common/mint-utils.ts index 7a2f747..a0b7dc3 100644 --- a/src/common/mint-utils.ts +++ b/src/common/mint-utils.ts @@ -37,23 +37,61 @@ export async function dataNFTDataStreamAdvertise( export async function storeToIpfs( storageToken: string, - traits: File, - image: File + traits: object, + image: Blob ): Promise<{ imageOnIpfsUrl: string; metadataOnIpfsUrl: string }> { - let res; try { - const nftstorage = new NFTStorage({ - token: storageToken - }); - const dir = [image, traits]; - res = await nftstorage.storeDirectory(dir); + const imageHash = await storeImageToIpfs(image, storageToken); + const traitsHash = await storeTraitsToIpfs(traits, storageToken); + return { + imageOnIpfsUrl: `https://ipfs.io/ipfs/${imageHash}`, + metadataOnIpfsUrl: `https://ipfs.io/ipfs/${traitsHash}` + }; } catch (error) { throw error; } - return { - imageOnIpfsUrl: `https://ipfs.io/ipfs/${res}/image.png`, - metadataOnIpfsUrl: `https://ipfs.io/ipfs/${res}/metadata.json` +} + +async function storeImageToIpfs(image: Blob, storageToken: string) { + const form = new FormData(); + form.append('file', image); + form.append('pinataMetadata', '{\n "name": "image"\n}'); + form.append('pinataOptions', '{\n "cidVersion": 1\n}'); + + const options = { + method: 'POST', + headers: { + Authorization: `Bearer ${storageToken}`, + 'Content-Type': 'multipart/form-data' + }, + body: form }; + const response = await fetch( + 'https://api.pinata.cloud/pinning/pinFileToIPFS', + options + ); + const res = await response.json(); + const imageHash = res.IpfsHash; + return imageHash; +} + +async function storeTraitsToIpfs(traits: object, storageToken: string) { + const options = { + method: 'POST', + headers: { + Authorization: `Bearer ${storageToken}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify(traits) + }; + + const response = await fetch( + 'https://api.pinata.cloud/pinning/pinJSONToIPFS', + options + ); + const res = await response.json(); + const traitsHash = res.IpfsHash; + return traitsHash; } export function createIpfsMetadata( @@ -96,11 +134,11 @@ export async function createFileFromUrl( ) { let res: any = ''; let data: any = ''; - let _imageFile: File = new File([], ''); + let _imageFile: Blob = new Blob(); if (url) { res = await fetch(url); data = await res.blob(); - _imageFile = new File([data], 'image.png', { type: 'image/png' }); + _imageFile = data; } const traits = createIpfsMetadata( res.headers.get('x-nft-traits') || '', @@ -110,8 +148,6 @@ export async function createFileFromUrl( address, extraAssets ); - const _traitsFile = new File([JSON.stringify(traits)], 'metadata.json', { - type: 'application/json' - }); + const _traitsFile = traits; return { image: _imageFile, traits: _traitsFile }; } From b661726bf8b2966cc980b18938fd2f902f149818 Mon Sep 17 00:00:00 2001 From: Damian Date: Wed, 15 May 2024 00:36:10 +0300 Subject: [PATCH 3/5] chore: package v up --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c7ef5fe..ec189e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@itheum/sdk-mx-data-nft", - "version": "3.5.0-alpha.4", + "version": "3.5.0-alpha.5", "description": "SDK for Itheum's Data NFT Technology on MultiversX Blockchain", "main": "out/index.js", "types": "out/index.d.js", From 7547e833e879d39b73ad28848c98ddda17385839 Mon Sep 17 00:00:00 2001 From: Damian Date: Wed, 15 May 2024 00:45:33 +0300 Subject: [PATCH 4/5] fix: pinata image upload --- package-lock.json | 4 ++-- package.json | 2 +- src/common/mint-utils.ts | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 604d7f5..81db0c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@itheum/sdk-mx-data-nft", - "version": "3.4.0", + "version": "3.5.0-alpha.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@itheum/sdk-mx-data-nft", - "version": "3.4.0", + "version": "3.5.0-alpha.6", "license": "GPL-3.0-only", "dependencies": { "@multiversx/sdk-core": "12.18.0", diff --git a/package.json b/package.json index ec189e0..54b53ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@itheum/sdk-mx-data-nft", - "version": "3.5.0-alpha.5", + "version": "3.5.0-alpha.6", "description": "SDK for Itheum's Data NFT Technology on MultiversX Blockchain", "main": "out/index.js", "types": "out/index.d.js", diff --git a/src/common/mint-utils.ts b/src/common/mint-utils.ts index a0b7dc3..3cae9bb 100644 --- a/src/common/mint-utils.ts +++ b/src/common/mint-utils.ts @@ -61,8 +61,7 @@ async function storeImageToIpfs(image: Blob, storageToken: string) { const options = { method: 'POST', headers: { - Authorization: `Bearer ${storageToken}`, - 'Content-Type': 'multipart/form-data' + Authorization: `Bearer ${storageToken}` }, body: form }; From fda3f0ffbaefaddc850374f3d1f0c2b99b7e3389 Mon Sep 17 00:00:00 2001 From: Damian Date: Wed, 15 May 2024 00:53:30 +0300 Subject: [PATCH 5/5] fix: pinata image upload --- package.json | 2 +- src/common/mint-utils.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 54b53ac..851e2a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@itheum/sdk-mx-data-nft", - "version": "3.5.0-alpha.6", + "version": "3.5.0-alpha.7", "description": "SDK for Itheum's Data NFT Technology on MultiversX Blockchain", "main": "out/index.js", "types": "out/index.d.js", diff --git a/src/common/mint-utils.ts b/src/common/mint-utils.ts index 3cae9bb..caadeff 100644 --- a/src/common/mint-utils.ts +++ b/src/common/mint-utils.ts @@ -56,7 +56,7 @@ async function storeImageToIpfs(image: Blob, storageToken: string) { const form = new FormData(); form.append('file', image); form.append('pinataMetadata', '{\n "name": "image"\n}'); - form.append('pinataOptions', '{\n "cidVersion": 1\n}'); + form.append('pinataOptions', '{\n "cidVersion": 0\n}'); const options = { method: 'POST', @@ -81,7 +81,11 @@ async function storeTraitsToIpfs(traits: object, storageToken: string) { Authorization: `Bearer ${storageToken}`, 'Content-Type': 'application/json' }, - body: JSON.stringify(traits) + body: JSON.stringify({ + pinataOptions: { cidVersion: 0 }, + pinataMetadata: { name: 'metadata' }, + pinataContent: traits + }) }; const response = await fetch(