OpenZeppelin x Foundry NFT合约部署记录
基于Openzeppelin的ERC721 & Foundry项目框架构建NFT项目。
部署环境:
Windows 11
Rust & Foundry安装完毕
`forge`, `cast`, `anvil`等命令可以正常使用
VSCode
Goerli测试网
环境变量 [.env]
目前还没看到直接能从.env中读取环境变量的方案。
ETH_RPC_URL=https://your-rpc-url-here
PRIVATE_KEY=your-private-key-here不过可以在Powershell中[使用](https://www.delftstack.com/howto/powershell/powershell-refresh-environment-variables/):
Set-Item -Path Env:TEST -Value "TestValue"然后命令行读取:
$Env:TEST
TestValue这样在Foundry中通过命令行部署时:
先设置好环境变量:
Set-Item -Path Env:RPC_Goerli -Value "https://goerli.infura.io/v3/ffe6e3ecb6764c03bf1747644f37c0fc"
Set-Item -Path Env:PRIVATE_KEY -Value "....."执行部署的语法:
forge create --rpc-url $Env:RPC_Goerli --private-key $Env:PRIVATE_KEY src/Counter.sol:Counter这样,部署的流程就打通了。
下面我们基于OpenZeppelin的ERC721合约模板部署合约进行测试。
Reference: https://docs.openzeppelin.com/contracts/5.x/erc721
ERC721
ERC721有一些可选扩展。OpenZeppelin分别实现了不同的扩展的内容,可以灵活组合。
1_ERC721URIStorage
这个实现包含metadata的标准扩展,我们可以基于这个实现来存储NFT的元数据。
代码:
// contracts/GameItem.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {ERC721URIStorage, ERC721} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
contract GameItem is ERC721URIStorage {
uint256 private _nextTokenId;
constructor() ERC721("GameItem", "ITM") {}
function awardItem(address player, string memory tokenURI)
public
returns (uint256)
{
uint256 tokenId = _nextTokenId++;
_mint(player, tokenId);
_setTokenURI(tokenId, tokenURI);
return tokenId;
}
}执行部署:
forge create --rpc-url $Env:RPC_Goerli --private-key $Env:PRIVATE_KEY src/2_ERC721Metadata.sol:GameItem部署信息:
Deployer: 0x1612Da1CDAC4AF5451D3FB750f7d4f46d34675Fd
Deployed to: 0xDb843512812c74FBdae3311e1E9CcEC6a49A4D8d
Transaction hash: 0x242afcac31b9fbd3e6ebefd1383eb508060c03af95a184b627326cba4a203ae7部署 + 验证合约:
forge create --rpc-url $Env:RPC_Goerli --private-key $Env:PRIVATE_KEY --etherscan-api-key $Env:EtherscanAPI --verify src/2_ERC721Metadata.sol:GameItem 结果:
[⠢] Compiling...
No files changed, compilation skipped
Deployer: 0x1612Da1CDAC4AF5451D3FB750f7d4f46d34675Fd
Deployed to: 0xC5f882924A4d8a9B7C952193C2543117051a6791
Transaction hash: 0x0e2815369ad62b3d40694ba1e6ffd6cdc241c1cbe594fc9c8bca0e359d5cff72
Starting contract verification...
Waiting for etherscan to detect contract deployment...
Start verifying contract `0xC5f882924A4d8a9B7C952193C2543117051a6791` deployed on goerli
Submitting verification for [src/2_ERC721Metadata.sol:GameItem] "0xC5f882924A4d8a9B7C952193C2543117051a6791".
Submitting verification for [src/2_ERC721Metadata.sol:GameItem] "0xC5f882924A4d8a9B7C952193C2543117051a6791".
Submitted contract for verification:
Response: `OK`
GUID: `bmdnrpud6ikzpgqmmmh8sjnuzskcyaprnfhrgspiydhf2wtxqj`
URL:
https://goerli.etherscan.io/address/0xc5f882924a4d8a9b7c952193c2543117051a6791
Contract verification status:
Response: `NOTOK`
Details: `Pending in queue`
Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified可以调用此合约方法AwardItem来铸造NFT:
https://goerli.etherscan.io/address/0xc5f882924a4d8a9b7c952193c2543117051a6791
单独验证合约:
// TODO


