Skip to main content

Deploy an ERC-721 Token

OpenZeppelin provides secure, community-vetted smart contract templates that follow best practices for ERC-721 (NFT) development.

Step 0: Setup Foundry

If your Foundry project isn’t set up yet, please go to the Foundry setup section before proceeding.

Step 1: Create the ERC-721 Contract

Create a contract script in src/MyERC721.sol. Run:
touch src/MyERC721.sol
Add the code:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract MyERC721 is ERC721 {
    uint256 private _nextTokenId;

    constructor() ERC721("MyNFT", "MNFT") {}

    function mint(address to) public {
        uint256 tokenId = _nextTokenId;
        _safeMint(to, tokenId);
        _nextTokenId++;
    }

    function getNextTokenId() public view returns (uint256) {
        return _nextTokenId;
    }
}
This contract:
  • Inherits from OpenZeppelin’s ERC721 contract
  • Sets the name to "MyNFT" and symbol "MNFT"
  • Includes a mint function allowing the creation of NFTs
  • Tracks the next available token ID

Step 2: Compile the Contract

Compile your contract:
forge build

Step 3: Prepare Signer for Deployment

This tutorial uses the Foundry Keystore for increased security. Create a new keystore:
cast wallet import skale-deployer --private-key $(cast wallet new | grep 'Private key:' | awk '{print $3}')
Provide a password to encrypt the keystore file when running the command. If you forget the password, it cannot be recovered.
Get your wallet address:
cast wallet address --account skale-deployer
Visit the sFUEL Station, toggle testnet, and fill up on sFUEL.
Make sure testnet mode is enabled on the sFUEL Station if you’re using a testnet SKALE Chain!

Step 4: Deploy the Contract

Deploy your ERC-721 contract:
forge create src/MyERC721.sol:MyERC721 \
    --account skale-deployer \
    --rpc-url skale_testnet \
    --broadcast \
    --legacy
The --legacy flag is required for SKALE Chains. For more information, see Troubleshooting.
Example deployment output:
Enter keystore password:
Deployer: 0x63a38D694de837dDF765f9b2704814275586D812
Deployed to: 0x4A435f6E471f773173774E860EBDcd17B132a2b4
Transaction hash: 0x3f6cc66e860cb82a6a62e3f5181c401e5558d60d622a9157437002e16c1ce488

Step 5: Verify Your Smart Contract

Verify the contract on the block explorer:
forge verify-contract \
    --rpc-url skale_testnet \
    <DEPLOYED_ADDRESS> \
    src/MyERC721.sol:MyERC721 \
    --verifier blockscout \
    --verifier-url https://juicy-low-small-testnet.explorer.testnet.skalenodes.com/api
Replace <DEPLOYED_ADDRESS> with your smart contract address.

Next Steps

Congratulations! You’ve successfully deployed an ERC-721 token on SKALE. You can now:
  • Mint unique NFTs
  • Transfer NFTs between addresses
  • Approve operators
  • Build NFT marketplaces or dApps on SKALE