Skip to main content

NFTs

Mint, transfer, and query NFTs (ERC-721 and ERC-1155) on EVM-compatible chains.

Minting NFTs

Programmatic

const nft = await app.onchain.nft.mint({
contractAddress: "0xMyNFTContract...",
to: "0xrecipient...5678",
tokenURI: "https://api.myapp.com/metadata/1",
chain: "arbitrum",
walletId: "65a1b2c3...",
});

console.log(nft.tokenId); // "1"
console.log(nft.txHash); // "0xabc..."

REST API

curl -X POST http://localhost:3000/onchain/nft/mint \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGci..." \
-d '{
"contractAddress": "0xMyNFTContract...",
"to": "0xrecipient...5678",
"tokenURI": "https://api.myapp.com/metadata/1",
"chain": "arbitrum",
"walletId": "65a1b2c3d4e5f6a7b8c9d0e1"
}'

Response (200):

{
"tokenId": "1",
"txHash": "0xabc123...",
"contractAddress": "0xMyNFTContract...",
"to": "0xrecipient...5678",
"chain": "arbitrum",
"status": "pending"
}

Transferring NFTs

const tx = await app.onchain.nft.transfer({
contractAddress: "0xMyNFTContract...",
from: "0xowner...1234",
to: "0xrecipient...5678",
tokenId: "1",
chain: "arbitrum",
walletId: "65a1b2c3...",
});
curl -X POST http://localhost:3000/onchain/nft/transfer \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGci..." \
-d '{
"contractAddress": "0xMyNFTContract...",
"to": "0xrecipient...5678",
"tokenId": "1",
"chain": "arbitrum",
"walletId": "65a1b2c3d4e5f6a7b8c9d0e1"
}'

Querying NFT Metadata

const metadata = await app.onchain.nft.getMetadata({
contractAddress: "0xMyNFTContract...",
tokenId: "1",
chain: "arbitrum",
});

console.log(metadata.name); // "My NFT #1"
console.log(metadata.description); // "A unique digital asset"
console.log(metadata.image); // "https://..."
console.log(metadata.attributes); // [{ trait_type: "...", value: "..." }]
curl "http://localhost:3000/onchain/nft/0xMyNFTContract.../1?chain=arbitrum" \
-H "Authorization: Bearer eyJhbGci..."

Response (200):

{
"contractAddress": "0xMyNFTContract...",
"tokenId": "1",
"owner": "0xrecipient...5678",
"tokenURI": "https://api.myapp.com/metadata/1",
"metadata": {
"name": "My NFT #1",
"description": "A unique digital asset",
"image": "https://example.com/nft-1.png",
"attributes": [
{ "trait_type": "Rarity", "value": "Legendary" }
]
}
}

Listing NFTs by Owner

const nfts = await app.onchain.nft.getByOwner({
contractAddress: "0xMyNFTContract...",
owner: "0xowner...1234",
chain: "arbitrum",
});
curl "http://localhost:3000/onchain/nft/0xMyNFTContract.../owner/0xowner...1234?chain=arbitrum" \
-H "Authorization: Bearer eyJhbGci..."

ERC-1155 Support

For ERC-1155 (multi-token) contracts, specify the amount:

// Mint multiple copies
await app.onchain.nft.mint({
contractAddress: "0xMyERC1155...",
to: "0xrecipient...",
tokenId: "1",
amount: 100,
chain: "arbitrum",
walletId: "65a1b2c3...",
standard: "erc1155",
});

// Transfer with amount
await app.onchain.nft.transfer({
contractAddress: "0xMyERC1155...",
to: "0xrecipient...",
tokenId: "1",
amount: 10,
chain: "arbitrum",
walletId: "65a1b2c3...",
standard: "erc1155",
});

Metadata Hosting

FluxKit can host NFT metadata for you via the Store wire:

import { store } from "@fluxkitdev/store";
import { onchain } from "@fluxkitdev/onchain";

const app = new FluxKit({
wires: [store(), onchain()],
database: { uri: process.env.MONGODB_URI },
});

// Create metadata and get a URL
const metadataUrl = await app.onchain.nft.createMetadata({
name: "My NFT #1",
description: "A unique digital asset",
image: imageBuffer, // Uploaded via store wire
attributes: [
{ trait_type: "Rarity", value: "Legendary" },
],
});
// => "https://myapp.com/onchain/metadata/abc123"