Market Cap: $2.1755T 0.09%
Volume(24h): $71.3867B -7.91%
Fear & Greed Index:

20 - Extreme Fear

  • Market Cap: $2.1755T 0.09%
  • Volume(24h): $71.3867B -7.91%
  • Fear & Greed Index:
  • Market Cap: $2.1755T 0.09%
Cryptos
Topics
Cryptospedia
News
CryptosTopics
Videos
Top Cryptospedia

Select Language

Select Language

Select Currency

Cryptos
Topics
Cryptospedia
News
CryptosTopics
Videos

How to deploy NFT smart contracts? (Hardhat & Remix tutorial)

Set up Hardhat, write an ERC-721 NFT contract with OpenZeppelin, test locally, then deploy to Sepolia via script or Remix—ensuring proper URI handling and ownership control.

Feb 23, 2026 at 12:20 pm

Setting Up the Development Environment

1. Install Node.js and npm to ensure compatibility with Hardhat’s toolchain and dependency management.

2. Run npm install --save-dev hardhat in an empty project directory to initialize a Hardhat workspace.

3. Execute npx hardhat init and select the sample project option to generate boilerplate files including contracts, scripts, and test folders.

4. Configure hardhat.config.js with network endpoints such as Sepolia or Mumbai for testnet deployments.

5. Install OpenZeppelin Contracts via npm install @openzeppelin/contracts to leverage audited ERC-721 implementations.

Writing the NFT Contract

1. Create contracts/MyNFT.sol inheriting from ERC721 and Ownable for ownership control.

2. Define a public _baseTokenURI string to support dynamic metadata resolution through IPFS or centralized servers.

3. Implement a minting function that checks caller authorization and assigns sequential token IDs using _safeMint.

4. Add a setBaseURI function restricted to the contract owner to allow post-deployment URI updates.

5. Include supportsInterface override to comply fully with ERC-721 standard interface detection requirements.

Compiling and Testing Locally

1. Use npx hardhat compile to generate ABI and bytecode artifacts in the artifacts/ folder.

2. Write a test script in test/MyNFT.test.js verifying minting logic, ownership transfer, and URI consistency.

3. Launch a local Ethereum node with npx hardhat node to simulate blockchain behavior without external dependencies.

4. Run tests using npx hardhat test and confirm all assertions pass before proceeding to deployment.

5. Verify contract bytecode matches expected opcodes by inspecting compilation output and comparing against EVM version constraints.

Deploying via Hardhat Scripts

1. Create scripts/deploy.js importing the contract artifact and initializing deployment parameters like name, symbol, and base URI.

2. Instantiate the contract factory using await ethers.getContractFactory('MyNFT') inside the deployment script.

3. Call deploy() with constructor arguments and await transaction confirmation on the selected network.

4. Log the deployed contract address and verify it appears on Etherscan after successful mining.

5. Store the address in a JSON file or environment variable for subsequent interaction scripts or frontend integration.

Deploying via Remix IDE

1. Navigate to remix.ethereum.org and create a new Solidity file named MyNFT.sol.

2. Paste the same contract code used in Hardhat, ensuring compiler version matches the one specified in hardhat.config.js.

3. Select Injected Provider - MetaMask as the environment and connect to Sepolia or another supported testnet.

4. Click Deploy after confirming constructor arguments and gas estimation in the transaction popup.

5. Confirm receipt in MetaMask and verify contract creation on the corresponding block explorer using the transaction hash.

Frequently Asked Questions

Q: Can I deploy an ERC-721 contract without owning ETH?A: No. Every deployment consumes gas paid in ETH. Testnet ETH must be acquired from faucets before deploying on networks like Sepolia.

Q: Why does my mint function revert with “ERC721: transfer to the zero address”?A: This occurs when _safeMint receives a zero address as the recipient. Ensure the caller passes a valid non-zero Ethereum address.

Q: Is it possible to change the token URI after minting?A: Yes, if the contract includes a tokenURI override that reads from a mutable base URI and appends the token ID. The metadata itself remains immutable once published to IPFS.

Q: What happens if I forget to call _setBaseURI before minting?A: Tokens will resolve URIs using the default empty string, resulting in broken or inaccessible metadata unless updated later via an owner-only setter.

Disclaimer:info@kdj.com

The information provided is not trading advice. kdj.com does not assume any responsibility for any investments made based on the information provided in this article. Cryptocurrencies are highly volatile and it is highly recommended that you invest with caution after thorough research!

If you believe that the content used on this website infringes your copyright, please contact us immediately (info@kdj.com) and we will delete it promptly.

Related knowledge

See all articles

User not found or password invalid

Your input is correct