NFT
要编写NFT项目的合约那我们就不得不提到OpenZeppelin这个第三方的库,他们是智能合约标准(ERC20、ERC721 等)的最大维护者之一,允许开发者使用经过彻底审计的代码来开发可靠的合约。
OpenZeppelin ERC721的功能
方法名 | 功能 |
---|---|
Mintable | 将创建一个只能由特权账户调用的 Mint (铸造)函数 |
Autoincrement IDs | 将自动为你的 NFT 分配一个递增的 ID |
Burnable | 销毁代币 |
Pausable | 暂停代币转移、销售等。 |
Votes | 允许访问类似治理的功能,如代表和投票。 |
Enumerable | 启用智能合约的链上令牌枚举 (on-chain Tokens enumeration) 和 “totalSupply” (总发行量)等功能,这在默认的 ERC721 集成中是没有的 |
URI Storage | 以将元数据 (metadata) 和图像关联到每一个 NFT中 |
编写智能合约
以下版本代码为简陋版更多的内容 玩法 需自行添加。
在Remix上编写我的代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts@4.8.1/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts@4.8.1/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts@4.8.1/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts@4.8.1/security/Pausable.sol";
import "@openzeppelin/contracts@4.8.1/access/Ownable.sol";
import "@openzeppelin/contracts@4.8.1/utils/Counters.sol";
contract WalnutTTTT is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
// 最大数量为100
uint256 MAX_SUPPLy = 1000;
constructor() ERC721("WalnutTTTT", "WAT") {}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function safeMint(address to, string memory uri) public {
require(_tokenIdCounter.current() <= MAX_SUPPLY, "I'm sorry we reached the cap");
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_safeMint(to, tokenId);
_setTokenURI(tokenId, uri);
}
function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize)
internal
whenNotPaused
override(ERC721, ERC721Enumerable)
{
super._beforeTokenTransfer(from, to, tokenId, batchSize);
}
// The following functions are overrides required by Solidity.
function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
super._burn(tokenId);
}
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
function supportsInterface(bytes4 interfaceId)public
view
override(ERC721, ERC721Enumerable)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}
编译部署智能合约
把智能合约编译部署上测试网!
上传图片到IPFS
访问filebase.com 并且创建一个账号。 登录之后,点击左侧菜单上的 Buckets 按钮,创建一个新的 Bucket。 访问 Buckets,点击 Upload 按钮,并上传你想用于 NFT 的图片,
上传后,点击它并复制 IPFS 网关的 URL(放入jsonwe年中):
把URL地址放入json文件中并保存为metadata.json
{
"description": "This NFT proves I've created and deployed my first ERC20 smart contract on Goerli with Alchemy Road to Web3",
"external_url": "Alchemy.com/?a=roadtoweb3weekone",
"image": "更改为你的 NFT 图片的 IPFS URL",
"name": "A cool NFT",
"attributes": [
{
"trait_type": "Base",
"value": "Starfish"
},
{
"trait_type": "Eyes",
"value": "Big"
},
{
"trait_type": "Mouth",
"value": "Surprised"
},
{
"trait_type": "Level",
"value": 5
},
{
"trait_type": "Stamina",
"value": 1.4
},
{
"trait_type": "Personality",
"value": "Sad"
},
{
"display_type": "boost_number",
"trait_type": "Aqua Power",
"value": 40
},
{
"display_type": "boost_percentage",
"trait_type": "Stamina Increase",
"value": 10
},
{
"display_type": "number",
"trait_type": "Generation",
"value": 2
}
]
}
返回Remix中铸造你的nft使用safemint
方法,通过的生成tokenid 和你上传的图片关联起来。
完成以上操作就能通过Opensea查看到了(我部署的是测试网所以用的是 Opensea测试网 testnets.opensea.io )
至此一个项目整个的流程就走通了,opensea图片同步可以需要点时间,完成时截图并没有显示出来。
资料
https://docs.alchemy.com/lang-zh/docs/how-to-develop-an-nft-smart-contract-erc721-with-alchemy
文档信息
- 本文作者:WalnutTTTT
- 本文链接:https://walnutTTTT.com/2023/02/08/NFT_ERC721/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)