Skip to main content
This tutorial teaches you how to create, deploy, and interact with an ERC-721 NFT collection on Monad. You’ll build a mintable NFT contract with OpenZeppelin and learn to mint NFTs using both JavaScript and Python.
Get your own node endpoint todayStart for free and get your app to production levels immediately. No credit card required.You can sign up with your GitHub, X, Google, or Microsoft account.
TLDR:
  • Create an ERC-721 NFT collection contract with OpenZeppelin
  • Deploy to Monad mainnet with Hardhat
  • Mint NFTs programmatically using ethers.js and web3.py
  • Query NFT ownership and metadata
  • Understand why Monad’s 1-second finality is ideal for NFTs

Prerequisites

  • Chainstack account with a Monad node endpoint
  • Node.js v16+ and Python 3.8+
  • Basic Solidity knowledge
  • MON tokens for gas fees

Overview

NFTs on Monad benefit from:
  • Instant ownership confirmation: 1-second finality means buyers see their NFT immediately
  • High throughput: Mint thousands of NFTs without network congestion
  • Low latency: Real-time updates for marketplaces and galleries
  • No reorganizations: Ownership is permanent once confirmed
This tutorial covers the full lifecycle: contract creation, deployment, minting, and querying.

Create the NFT contract

Set up the project

Select “Create a JavaScript project” when prompted.

Configure environment variables

Create a .env file:
.env

Configure Hardhat

Replace hardhat.config.js:
hardhat.config.js

Write the NFT contract

Create contracts/MonadNFT.sol:
contracts/MonadNFT.sol
This contract includes:
  • Mintable NFTs with customizable metadata URIs
  • Max supply to limit collection size
  • Mint price for public mints
  • Owner minting for free mints by the contract owner
  • Events for tracking mints

Deploy the contract

Create scripts/deploy.js:
scripts/deploy.js
Deploy:
Save the deployed contract address for the next steps.

Mint NFTs with JavaScript

Create scripts/mint.js:
scripts/mint.js
Run:

Mint NFTs with Python

Install web3.py:
Create mint.py:
mint.py
Run:

Query NFT data

Get all NFTs owned by an address

Batch minting

For minting multiple NFTs efficiently:

Monad-specific notes

Why Monad is ideal for NFTs:
  • 1-second finality: Buyers see their NFT immediately after purchase. No waiting for confirmations.
  • No reorganizations: Once minted, ownership is permanent. No risk of losing NFTs to chain reorgs.
  • High throughput: Mint large collections or handle high-volume drops without network congestion.
  • Instant marketplace updates: Listings and sales reflect immediately on-chain.
Token URI best practices:
  • Store metadata on IPFS or Arweave for permanence
  • Use a standard metadata format (OpenSea metadata standards)
  • Consider using a base URI + token ID pattern for gas efficiency

Complete project structure

Next steps

Now that you can mint NFTs on Monad, you can:
  • Add metadata to IPFS using services like Pinata or NFT.Storage
  • Build a minting frontend with React or Next.js
  • Create a marketplace interface
  • Implement royalties with ERC-2981
  • Add batch minting for efficient large-scale mints
Last modified on June 22, 2026