Skip to main content

Mint a NFT Token

Deploy your NFT Contract if Not Deployed

To mint a token we assume you've already deployed your NFT contract.

import { ClientFactory, NftTokenBuilder } from "@1o1art/sdk";
// setup the client
const client = ClientFactory.makeClient(PRIVATE_KEY, RPC_URL);
const nftContractBuilder = client.createNftContractBuilder();
const contractFacets = await client.getPresetFacets("delegatable");

const contractAddr = await nftContractBuilder
.setFacets(contractFacets)
.setImage("ipfs://QmNoDT3M1FfF7d3Pd9DkBfzz8NxHueeudWBPe9owt1PnRM", "offchain")
.setMetadata({
name: "My NFT",
description: "This is my NFT",
symbol: "FIRST",
})
.deploy();

Create your a TokenBuilder

The token builder allows you to reference your deployed NFT contract to mint tokens

import { NftTokenBuilder } from "@1o1art/sdk";
// Prepare to create a token
const nftTokenBuilder = new NftTokenBuilder(
nftContractBuilder.signer,
contractAddr
);

Set the token metadata

We use the builder to set metadata, images, and animation for tokens that are minted for the NFT Contract. The metadata consists of name, desc . The animation and images are also set via the builder. Attributes are translated into an Opensea compatible attributes trait_type format and the images and animation can be onchain or offchain. If it's offchain then the expectation is that it's ipfs://, if it's onchain, then the limit is approximately 30kb ( which can be extended using the advanced interface). Animation is an optional field that should be set if you have audio or movie media data.

nftTokenBuilder
.setImage("ipfs://QmNoDT3M1FfF7d3Pd9DkBfzz8NxHueeudWBPe9owt1PnRM", "offchain")
.setAnimation(
"ipfs://QmTwnLtm7TkmaYJFrYFvsupedP3n51vu6czmVKiED5GyAX",
"offchain"
)
.setDesc("This is my NFT")
.setName("My NFT")
.setAttributes({ key: "value", otherKey: "value" });

Mint a Token

Then we call mint on the tokenBuilder, which will mint a token from the contractAddr specified earlier. We can specify who we're minting to as well

const mintToAddress = nftContractBuilder.signer;
const tokenId = await nftTokenBuilder.mint(mintToAddress);

Putting it altogether

import { ClientFactory, lib, NftTokenBuilder } from "@1o1art/sdk";
import dotenv from "dotenv";

dotenv.config();
const PRIV_KEY = process.env.PRIV_KEY || "throw no private key set";
const RPC_URL = process.env.RPC_URL;
const main = async () => {
const client = await ClientFactory.makeClient(PRIV_KEY, RPC_URL);
const nftContractBuilder = client.createNftContractBuilder();
// Get the components you'd like to add to your blank smart contract
// basic will load the bare minimum to make a contract, delegatable
// will provide a delegatable ERC721 token
const contractFacets = await client.getPresetFacets("delegatable");

// Create the contract and set a contract image
const contractAddr = await nftContractBuilder
.setFacets(contractFacets)
.setImage(
"ipfs://QmNoDT3M1FfF7d3Pd9DkBfzz8NxHueeudWBPe9owt1PnRM",
"offchain"
)
.setMetadata({
name: "My NFT",
description: "This is my NFT",
symbol: "API",
})
.deploy();

// Prepare to create a token
const nftTokenBuilder = new NftTokenBuilder(
nftContractBuilder.signer,
contractAddr
);

// This can be any address you'd like to mint to
const mintToAddress = nftContractBuilder.signer.address;

const tokenID = await nftTokenBuilder
.setImage(
"ipfs://QmNoDT3M1FfF7d3Pd9DkBfzz8NxHueeudWBPe9owt1PnRM",
"offchain"
)
.setAnimation(
"ipfs://QmTwnLtm7TkmaYJFrYFvsupedP3n51vu6czmVKiED5GyAX",
"offchain"
)
.setDesc("This is my NFT")
.setName("My NFT")
.setAttributes({ key: "value", otherKey: "value" })
.mint(mintToAddress);

// get access to the recently launch NFT Contract
const { nftContract } = await client.getNftContractData(contractAddr);

// Use the contract to get the tokenURI aka the token Metadata
const tokenURIBase64Encoded = await nftContract.tokenURI(tokenID);

// get the token Metadata for the minted token
let tokenMetadata: lib.token.TokenMetadata = JSON.parse(
lib.utils.convertTokenUriData(tokenURIBase64Encoded)
) as lib.token.TokenMetadata;

console.log(`Token Metadata: ${JSON.stringify(tokenMetadata, null, 2)}`);
};
main();