Metadata storage in NFTs, IPFS and Limits

Tatum partnered with NFT.Storage to offer free IPFS storage for NFTs to developers. The files are stored on IPFS.

📘

IPFS file limit size is up to 50MB. File batch upload is unsupported.

Steps

Step_1: Upload an image, video, audio file, etc to IPFS

Example request:

  • A successful request will return a response that includes an IPFS hash
curl --request POST \
  --url https://api.tatum.io/v3/ipfs \
  --header 'content-type: multipart/form-data' \
  --header 'x-api-key: REPLACE_KEY_VALUE' \
  -F file=@local_path_to_your_file_e_q_test-356.jpg
//Response:
{
  "ipfsHash": "bafybeihrumg5hfzqj6x47q63azflcpf6nkgcvhzzm6f6nhic2eg6uvozlq/test-356.jpg"
}
import {ipfsGet, ipfsGet} from '@tatumio/tatum';
/**
 * Gets data from the IPFS
 * @param id - IPFS CID of the file
 */
  const ipfsId = await ipfsGet('QmXJJ6UF5WkF4WTJvsdhiA1etGwBLfpva7Vr9AudGMe3pj');
 
/**
 * Upload file to the IPFS storage.
 * @param file - data buffer of the file. Content Type: multipart/form-data
 * @returns ipfsHash - IPFS hash of the file
 */
  const ipfsHash = await ipfsUpload('logo.jpg', 'fileName');

Step_2: Create a JSON metadata file

Create a JSON file with the metadata scheme to upload. The required fields are:

  1. Name of NFT
  2. Description of NFT
  3. IPFS hash from step_1

Example file

{
  "name": "Lorem Ipsum Dolor Test",
  "description": "Friendly Lorem OpenSea Creature that enjoys long swims in the ocean.",
  "image": "ipfs://bafybeihrumg5hfzqj6x47q63azflcpf6nkgcvhzzm6f6nhic2eg6uvozlq/test-356.jpg"
}

Step_3: Upload your saved JSON metadata scheme to IPFS

Example request:

  • A successful request will return a response that includes an IPFS hash
curl --request POST \
  --url https://api.tatum.io/v3/ipfs \
  --header 'content-type: multipart/form-data' \
  --header 'x-api-key: REPLACE_KEY_VALUE' \
  -F file=@local_path_to_your_file_e_q_test-356.json
//Response:
{
  "ipfsHash": "bafybeidi7xixphrxar6humruz4mn6ul7nzmres7j4triakpfabiezll4ti/metadata.json"
}

Step_4: Include the response hash in the "url" of your NFT mint request

Example request:

//cURL && PrivateKey
curl --request POST \
  --url https://api.tatum.io/v3/nft/mint \
  --header 'content-type: application/json' \
  --header 'x-api-key: REPLACE_KEY_VALUE' \
  --data '{
      "chain":"MATIC",
      "tokenId":"100000",
      "to":"0x687422eEA2cB73B5d3e242bA5456b782919AFc85",
      "contractAddress":"0x687422eEA2cB73B5d3e242bA5456b782919AFc85",
      "url":"ipfs://bafybeidi7xixphrxar6humruz4mn6ul7nzmres7j4triakpfabiezll4ti/metadata.json",
      "fromPrivateKey":"0x05e150c73f1920ec14caa1e0b6aa09940899678051a78542840c2668ce5080c2"
  }'
//cURL && KMS
curl --request POST \
  --url https://api.tatum.io/v3/nft/mint \
  --header 'content-type: application/json' \
  --header 'x-api-key: REPLACE_KEY_VALUE' \
  --data '{
      "chain":"MATIC",
      "tokenId":"100000",
      "to":"0x687422eEA2cB73B5d3e242bA5456b782919AFc85",
      "contractAddress":"0x687422eEA2cB73B5d3e242bA5456b782919AFc85",
      "url":"ipfs://bafybeidi7xixphrxar6humruz4mn6ul7nzmres7j4triakpfabiezll4ti/metadata.json",
      "index": 0,
      "signatureId": "26d3883e-4e17-48b3-a0ee-09a3e484ac83", //must match existing wallet in your KMS instance
      "nonce": 0 //optional usage. With high transaction volume, use manual nonce
  }'
import {Currency, mintNFTWithUri} from '@tatumio/tatum';
const transactionHash = await mintNFTWithUri(false, {
    to: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85',
    url: 'ipfs://bafybeidi7xixphrxar6humruz4mn6ul7nzmres7j4triakpfabiezll4ti/metadata.json',
    tokenId: '100000',
    chain: Currency.MATIC,
    contractAddress: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85',
    fromPrivateKey: '0x05e150c73f1920ec14caa1e0b6aa09940899678051a78542840c2668ce5080c2'
});