BACKEND (API) DOCUMENTATION
Defines dependencies like express, mongoose, dotenv, etc.
Project name updated from "XDC NFT" ➡️ "ValidNFT" .
Stores environment variables: PORT, MONGO_URI, INFURA_API_KEY, etc.
No name or color changes here, but critical for setup .
3. config/database.js or db.js
Mongoose connection to MongoDB.
Infrastructure unchanged, only branding updates.
Core Project Structure (Predicted)
/api
├── server.js # Entry point
├── routes/ # Express route handlers
├── controllers/ # Logic for each API route
├── models/ # Mongoose schemas
├── middleware/ # Auth, error handling
└── config/ # DB and app config
Major Files Changed (Backend)
server.js → Updated log/response messages from "XDC NFT" to "ValidNFT"
routes/*.js → Adjusted branding text in API endpoints
controllers/*.js → Updated JSON responses & log messages
models/*.js → Schema definitions & collection names updated
README.md → Renamed project description/install instructions
Name: "XDC NFT" ➡️ "ValidNFT"
Titles, headers, footers, meta tags, favicon alt text
Colors: Purple ➡️ Blue
CSS / Tailwind styling
Buttons, headers, backgrounds
/frontend
├── public/ # Static assets (logos, favicon)
├── src/
│ ├── components/ # UI components
│ ├── pages/ or views/ # React pages or routes
│ ├── styles/ # Global CSS or Tailwind config
│ ├── App.js / App.jsx # Main component
│ ├── index.js # Entry point
│ └── config.js # API endpoints, constants
Major Files Changed (Frontend)
index.html → <title>ValidNFT</title>, updated meta + favicon
App.js, Navbar.js, Footer.js, Header.js → Branding updates
config.js → Updated constants/network configs
*.module.css → Color palette changes
// Tailwind Example
module . exports = {
theme : {
extend : {
colors : {
primary : '#3B82F6' , // blue-500
}
}
}
}
public/logo.svg → New branding logo
README.md and /docs/ → Updated documentation
Databases cleared for clean deployment.
Network: XDC
Tested on: XDC Apothem Testnet
Standard: ERC721-compatible (OpenZeppelin-based)
Smart Contracts: Solidity (XRC721 with royalties + pricing)
Frontend: React (Material UI, Redux, Web3.js)
Backend: Node.js + Express + MongoDB
Smart Contract (XRC721.sol) — Changes Made
ERC721 + Metadata via ERC721URIStorage
Royalty Support via ERC2981
Ownership Restriction (Ownable)
On-chain price mapping
function mint (
string memory tokenURI ,
address royaltyReceiver ,
uint96 royaltyFeeInBips ,
uint256 priceInWei
) public returns (uint256 )
Auto-incrementing Token IDs
Store tokenURI
_setTokenRoyalty() sets royalty details
tokenPrices[tokenId] = priceInWei
Feature
Original
After Changes
mint()
No price
Includes priceInWei
tokenPrices
Not defined
Added mapping
ABI Updates
Static
Regenerated
Payable?
No
Still non-payable
FRONTEND (Create-single.js) — Changes Made
Full form validation
NFT preview section + modals
Dynamic price input (supports XDC, BLKZ)
Toggles for sale/auction/unlockable
contract . methods . mint ( tokenURI , royaltyReceiver , royaltyFeeInBips , priceInWei )
Upload file → metadata to IPFS
On success → get tokenURI
Call mint() with metadata + price + royalty
Display success/failure messages
Step-by-step modal: Approve ➜ Mint ➜ (optional) Sign
Toast notifications (success, error)
Listens for Transfer event
Extracts tokenId from logs
Pushes minted token to backend DB
BACKEND (MongoDB / Express) — Changes Made
collections → NFT collections
tokens → Minted NFT metadata
owners → Token ownership & listing
TokenAddItemAction Payload
{
"Name" : " My NFT" ,
"ipfsimage" : " Qm..." ,
"Price" : " 10" ,
"Royalities" : " 500" ,
"Count" : 1 ,
"Creator" : " 0x..." ,
"ContractAddress" : " 0x..." ,
"collection" : " OG Collection"
}
Changes to Support New Mint
IPFS metadata stored + saved hash
Price field added
Royalties stored + enforced
getUserCollection() → fetches user NFTs
CreateTokenValidationAction() → validates price, royalty %, file size
Connect Wallet (MetaMask)
Fill Form → upload media, set royalty %, price, etc.
IPFS Upload → returns ipfsmeta + ipfsimage
Smart Contract → call mint()
Backend Sync → save ownership, metadata, listing
UI Feedback → modal with Approve ➜ Mint ➜ Confirm ➜ Done
VALIDATIONS & LIMITATIONS
Name must not contain emoji
Price > 0, numeric only
File size < 30MB
Royalties ≤ 20%
Limitation
Reason
Cannot edit minted NFTs
No admin update function
Price not enforced on-chain
Stored in mapping, read off-chain
Royalty enforcement
Depends on marketplace compliance
Restrict mint() (admin/onlyOwner optional)
Validate royaltyReceiver in frontend
Compress IPFS images before upload
Dropdown for royalties (0%, 5%, 10%, etc.)
To switch XDC ➜ ETH :
Update network version and chainID fields in config.js