A high-performance NFT collection optimized for gaming assets with rarity tiers, batch minting, and metadata storage.
Monad's 10,000 TPS enables:
Traditional NFTs work for art, but games need:
solidityโ ERC-721 standard (NFT base)
โ Rarity tiers (1-4 levels)
โ URI storage (metadata/images)
โ Batch minting (gas-optimized)
โ Burnable (destroy items)
โ Max supply cap (10,000 default)solidityconstructor() ERC721("GameAsset", "GAST") Ownable(msg.sender) {}Update these:
"GameAsset" โ Your game's asset name"GAST" โ Short symbolsoliditymapping(uint256 => uint256) public tokenRarity;
// 1 = Common (70% drop rate)
// 2 = Rare (20% drop rate)
// 3 = Epic (8% drop rate)
// 4 = Legendary (2% drop rate)solidityuint256 public mintPrice = 0.01 ether;Adjust based on your game economy.
Store metadata on IPFS or your server:
json{
"name": "Legendary Sword #1234",
"description": "A mythical blade forged in dragon fire",
"image": "ipfs://QmXxxx.../sword.png",
"attributes": [
{ "trait_type": "Rarity", "value": "Legendary" },
{ "trait_type": "Attack", "value": 95 },
{ "trait_type": "Durability", "value": 100 },
{ "trait_type": "Element", "value": "Fire" }
]
}javascriptconst mintPrice = await nft.mintPrice();
await nft.mint(
playerAddress,
"ipfs://QmXxxx/metadata.json",
2, // Rarity: Rare
{ value: mintPrice }
);javascript// Award 100 players at once
const recipients = [...playerAddresses]; // 100 addresses
const uris = [...metadataURIs]; // 100 URIs
const rarities = [...rarityLevels]; // 100 rarity values
await nft.batchMint(recipients, uris, rarities);Monad advantage: Batch 1000 NFTs in seconds, costs pennies!
1. Select "Gaming NFT Collection" template
2. Customize name, symbol, max supply
3. Run security analysis
4. Deploy to Monad Testnet
5. Test minting in your game
Gas Cost: ~2,500,000 gas (deployment)
csharpusing Web3Unity.Scripts.Library.Ethers.Contracts;
public async Task<string> MintGameAsset(string playerAddress) {
string contract = "0xYourNFTContract";
string method = "mint";
string[] args = {
playerAddress,
"ipfs://metadata.json",
"2" // Rare item
};
string value = "10000000000000000"; // 0.01 MON
string response = await ERC721.MintNFT(contract, method, args, value);
return response;
}cpp#include "Web3/MonadWeb3.h"
void AMintNFT::MintAsset(FString PlayerAddress) {
UMonadWeb3* Web3 = UMonadWeb3::GetInstance();
Web3->CallContractFunction(
"0xYourNFTContract",
"mint",
{PlayerAddress, "ipfs://metadata.json", "2"}
);
}Allow players to trade NFTs:
solidity// In your game contract
function listForSale(uint256 tokenId, uint256 price) external {
require(nft.ownerOf(tokenId) == msg.sender, "Not owner");
nft.transferFrom(msg.sender, address(this), tokenId);
listings[tokenId] = Listing(msg.sender, price);
}
function buyAsset(uint256 tokenId) external payable {
Listing memory listing = listings[tokenId];
require(msg.value >= listing.price, "Insufficient payment");
nft.transferFrom(address(this), msg.sender, tokenId);
payable(listing.seller).transfer(msg.value);
}solidityfunction dropLoot(address player, uint256 bossLevel) external onlyGame {
uint256 rarity = calculateRarity(bossLevel); // Higher boss = better loot
string memory uri = generateMetadata(bossLevel, rarity);
_mint(player, uri, rarity);
}solidityfunction awardSeasonReward(address[] memory topPlayers) external onlyOwner {
string[] memory uris = new string[](topPlayers.length);
uint256[] memory rarities = new uint256[](topPlayers.length);
for (uint i = 0; i < topPlayers.length; i++) {
uris[i] = "ipfs://season1/reward.json";
rarities[i] = i < 10 ? 4 : 3; // Top 10 get Legendary
}
batchMint(topPlayers, uris, rarities);
}solidityfunction openCardPack(address player) external payable {
require(msg.value >= packPrice, "Insufficient payment");
uint256[] memory cards = generateRandomCards(5); // 5 cards per pack
for (uint i = 0; i < 5; i++) {
uint256 rarity = determineRarity(cards[i]);
_mint(player, getCardMetadata(cards[i]), rarity);
}
}solidity// โ DON'T: Loop externally
for (let i = 0; i < 100; i++) {
await nft.mint(addresses[i], uris[i], rarities[i]);
}
// โ
DO: Single batch transaction
await nft.batchMint(addresses, uris, rarities);solidity// Store heavy data off-chain
_setTokenURI(tokenId, "ipfs://Qm.../metadata.json");
// Not on-chain:
// โ string public stats = "ATK:95,DEF:80,SPD:70";solidityevent AssetMinted(
address indexed to,
uint256 indexed tokenId,
uint256 rarity
);
// Your backend listens and updates game DBImplement fair randomness:
solidityfunction getRarity() private view returns (uint256) {
uint256 random = uint256(keccak256(abi.encodePacked(
block.timestamp,
block.prevrandao,
msg.sender
))) % 100;
if (random < 2) return 4; // 2% Legendary
if (random < 10) return 3; // 8% Epic
if (random < 30) return 2; // 20% Rare
return 1; // 70% Common
}โ ๏ธ For production: Use Chainlink VRF for provably fair randomness.
Monitor your NFT economy:
javascript// Total minted by rarity
const legendary = await nft.filters.AssetMinted(null, null, 4);
const legendaryCount = await nft.queryFilter(legendary);
// Top holders
const transfers = await nft.filters.Transfer();
// Process and rank holdersSolution: Increase MAX_SUPPLY or implement burning for recycling:
solidityfunction burnAndMint(uint256 tokenIdToBurn, address to, string memory uri, uint256 rarity) external {
require(ownerOf(tokenIdToBurn) == msg.sender, "Not owner");
burn(tokenIdToBurn);
mint(to, uri, rarity);
}Solution: Ensure all arrays in batchMint have same length:
javascriptconsole.assert(
recipients.length === uris.length &&
uris.length === rarities.length
);๐ฎ Build a Staking System: Let players earn rewards for holding NFTs
๐ฑ Create In-Game DEX: Enable instant trades between players
๐ Add Achievements: Mint special NFTs for milestones
---
Ready to mint? Deploy your gaming NFT collection now! ๐ฎ