使用場景:
ERC-721 的特點是每個代幣都是**獨一無二**的,所以才造就了NFT,使用場景大多用於 典
藏、身份識別...。
詳細說明
[前篇](<https://juniper-pecorino-0ba.notion.site/20-ERC721-44b67a1b75ab4256b4127f25044b07cd>)解釋了ERC721的function 與 even
大家也可以做個小範例
NFT SmartContract To Opensource
以下用OpenZeppelin 實作,當然實作方式很多以下係使用
ERC721URIStorage、ERC721PresetMinterPauserAutoId
設定新的NFT(也是簡單搞定...)
ERC721URIStorage
// contracts/GameItem.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "<https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.5.0/contracts/token/ERC721/extensions/ERC721URIStorage.sol>";
import "<https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.5.0/contracts/utils/Counters.sol>";
contract GameItem is ERC721URIStorage {
using Counters for Counters.Counter; // utils 提供的Lab可使用(計數)
Counters.Counter private _tokenIds;
constructor() ERC721("GameItem", "ITM") {}
function awardItem(address player, string memory tokenURI)
public
returns (uint256)
{
_tokenIds.increment();// 增號
uint256 newItemId = _tokenIds.current(); //現在的代號
_mint(player, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
}
上面有引用
using Counters
for Counters.Counter 這是引用OpenZeppelin的 utils
ERC721URIStorage 就是設定NFT 路徑_setTokenURI
的實作。
ERC721PresetMinterPauserAutoId
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "<https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.5.0/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol>";
contract OpenzeppelinPresetMinterPauserAutoId is ERC721PresetMinterPauserAutoId {
constructor() ERC721PresetMinterPauserAutoId("TEST NFT","TNF","<https://test>"){}
function setTokenURI(uint256 tokenId, string memory tokenURI) public {
require(hasRole(MINTER_ROLE, _msgSender()), "web3 CLI: must have minter role to update tokenURI");
setTokenURI(tokenId, tokenURI);
}
}
如果我們使用 ERC721PresetMinterPauserAutoId 建立NFT,自動提供如下角色及特色
身份:
MINTER_ROLE 鑄造者角色
PAUSER_ROLE 暫停角色