This repository contains two Ethereum NFT projects built with Foundry
🛠️ Projects Included:
Basic NFT
A minimal ERC721-compliant NFT with:
Token URI support (off-chain metadata via IPFS/HTTP)
Minting
Mood NFT
An interactive NFT that lets owners change its mood:
Switch between predefined states (e.g., 😊 → 😢)
Demonstrates dynamic NFT behavior
🔧 Tech Stack
Solidity (ERC721 standard)
Foundry (Testing & Deployment)
OpenZeppelin Contracts (Secure base implementations)
Token URI
This repo will let you go through creating 2 different kinds of NFTs.
- IPFS-Hosted NFT
Metadata and assets stored on IPFS (decentralized off-chain).
- On-Chain SVG NFT
100% on-chain (SVG image and metadata embedded in the contract).
- git
- You'll know you did it right if you can run
git --versionand you see a response likegit version x.x.x
- You'll know you did it right if you can run
- foundry
- You'll know you did it right if you can run
forge --versionand you see a response likeforge 0.2.0 (816e00b 2023-03-16T00:05:26.396218Z)
- You'll know you did it right if you can run
git clone https://github.com/fricpto/foundry-nft
cd foundry-nft
forge install
forge build
make anvil
This will default to your local node. You need to have it running in another terminal in order for it to deploy.
make deploy
forge test
or
forge test --fork-url $SEPOLIA_RPC_URL
forge coverage
- Setup environment variables
You'll want to set your SEPOLIA_RPC_URL and PRIVATE_KEY as environment variables. You can add them to a .env file.
PRIVATE_KEY: The private key of your account (like from metamask). NOTE: FOR DEVELOPMENT, PLEASE USE A KEY THAT DOESN'T HAVE ANY REAL FUNDS ASSOCIATED WITH IT.- You can learn how to export it here.
SEPOLIA_RPC_URL: This is url of the goerli testnet node you're working with. You can get setup with one for free from Alchemy
Optionally, add your ETHERSCAN_API_KEY if you want to verify your contract on Etherscan.
- Get testnet ETH
Head over to faucets.chain.link and get some tesnet ETH. You should see the ETH show up in your metamask.
- Deploy (IPFS NFT)
make deploy ARGS="--network sepolia"
- Deploy (SVG NFT)
make deploySvg ARGS="--network sepolia"
To get the base64 of an image, you can use the following command:
echo "data:image/svg+xml;base64,$(base64 -i ./images/dynamicNft/happy.svg)"
Then, you can get the base64 encoding of the json object by placing the imageURI into happy_image_uri.json then running:
echo "data:application/json;base64,$(base64 -i ./images/dynamicNft/happy_image_uri.json)"
You can estimate how much gas things cost by running:
forge snapshot
And you'll see and output file called .gas-snapshot
To run code formatting:
forge fmt
Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.
Foundry consists of:
- Forge: Ethereum testing framework (like Truffle, Hardhat and DappTools).
- Cast: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data.
- Anvil: Local Ethereum node, akin to Ganache, Hardhat Network.
- Chisel: Fast, utilitarian, and verbose solidity REPL.
$ forge build$ forge test$ forge fmt$ forge snapshot$ anvil$ forge script script/Counter.s.sol:CounterScript --rpc-url <your_rpc_url> --private-key <your_private_key>$ cast <subcommand>$ forge --help
$ anvil --help
$ cast --help