Triển khai NFT chuẩn ERC721 (OpenZeppelin) sử dụng Foundry / Forge.
- Foundry toolchain:
curl -L https://foundry.paradigm.xyz | bashsau đófoundryup - Git (Foundry dùng git submodule để quản lý dependency)
foundry-nft/
├── src/ # Smart contract (NFT.sol)
├── script/ # Forge script để deploy (Deploy.s.sol)
├── test/ # Unit test (Solidity-native, Forge test)
├── lib/ # Dependency (OpenZeppelin, forge-std...)
├── foundry.toml # Cấu hình project
└── .env # Biến môi trường (KHÔNG commit)
cd foundry-nft
forge installNếu cần cài thêm OpenZeppelin:
forge install OpenZeppelin/openzeppelin-contracts --no-commitTạo file .env:
PRIVATE_KEY=<your_wallet_private_key>
SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/<project_id>
ETHERSCAN_API_KEY=<your_key>Load biến môi trường trước khi chạy lệnh:
source .envforge buildforge test -vvv-vvv để hiện log chi tiết (traces) khi test fail hoặc dùng console.log.
Foundry cho phép giả lập địa chỉ người gọi hàm bằng vm.prank():
vm.prank(userAddress);
nft.mint(tokenId);Dùng để test quyền hạn (access control) — ví dụ kiểm tra chỉ owner mới được mint.
Lưu ý: Goerli đã deprecated, dùng Sepolia thay thế.
forge script script/Deploy.s.sol \
--rpc-url $SEPOLIA_RPC_URL \
--private-key $PRIVATE_KEY \
--broadcast \
--verify \
--etherscan-api-key $ETHERSCAN_API_KEYHoặc deploy an toàn hơn bằng seed phrase / keystore thay vì private key thô:
forge script script/Deploy.s.sol \
--rpc-url $SEPOLIA_RPC_URL \
--account <keystore_account_name> \
--broadcast \
--verifycast call <contract_address> "ownerOf(uint256)(address)" 1 --rpc-url $SEPOLIA_RPC_URLMIT