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.
- v3 REST API endpoint - Store data to IPFS
IPFS file limit size is up to 50MB. File batch upload is unsupported.
How to Store Metadata with IPFS and Tatum
- 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');
- A successful call will return a response that includes an IPFS hash.
{ "ipfsHash": "bafybeihrumg5hfzqj6x47q63azflcpf6nkgcvhzzm6f6nhic2eg6uvozlq/test-356.jpg" }
- Using this hash, create a JSON metadata scheme in your development environment and save it. The required fields are:
- Name of NFT
- Description of NFT
- IPFS hash
- 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" }
- Now, upload your saved JSON metadata scheme to IPFS using the same v3 REST API call call as above.
- Again, a successful upload will return an IPFS hash in the response.
- 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' });
Updated 16 days ago