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 6b07534..a5d50ba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@itheum/sdk-mx-data-nft", - "version": "3.5.0", + "version": "3.5.1", "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 7a2f747..caadeff 100644 --- a/src/common/mint-utils.ts +++ b/src/common/mint-utils.ts @@ -37,23 +37,64 @@ 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": 0\n}'); + + const options = { + method: 'POST', + headers: { + Authorization: `Bearer ${storageToken}` + }, + 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({ + pinataOptions: { cidVersion: 0 }, + pinataMetadata: { name: 'metadata' }, + pinataContent: 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 +137,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 +151,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 }; }