NFT - How to Store NFT Metadata, 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.

How to Store Metadata with IPFS and Tatum

  1. Upload your metadata (image, video, audio file, etc.) to IPFS using the following v3 REST API call.
    Example request:
    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
    
    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');
    
  2. A successful call will return a response that includes an IPFS hash.
    {
      "ipfsHash": "bafybeihrumg5hfzqj6x47q63azflcpf6nkgcvhzzm6f6nhic2eg6uvozlq/test-356.jpg"
    }
    
  3. Using this hash, create a JSON metadata scheme in your development environment and save it. The required fields are:
    1. Name of NFT
    2. Description of NFT
    3. IPFS hash
  4. Here is an Example JSON metadata scheme.
    {
      "name": "Lorem Ipsum Dolor Test",
      "description": "Friendly Lorem OpenSea Creature that enjoys long swims in the ocean.",
      "image": "ipfs://bafybeihrumg5hfzqj6x47q63azflcpf6nkgcvhzzm6f6nhic2eg6uvozlq/test-356.jpg"
    }
    
  5. Now, upload your saved JSON metadata scheme to IPFS using the same v3 REST API call call as above.
  6. Again, a successful upload will return an IPFS hash in the response.
  7. Include this hash in the β€œURL” field of the v3 REST API Mint NFT call when you mint a new NFT.
    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'
    });