编写一个NFT项目

2023/02/08 Solidity 共 3153 字,约 10 分钟
咔咔咔酷酷

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 访问 Buckets,点击 Upload 按钮,并上传你想用于 NFT 的图片,

上传后,点击它并复制 IPFS 网关的 URL(放入jsonwe年中): 创建buckets

把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 和你上传的图片关联起来。 创建buckets

完成以上操作就能通过Opensea查看到了(我部署的是测试网所以用的是 Opensea测试网 testnets.opensea.io )
NFT

至此一个项目整个的流程就走通了,opensea图片同步可以需要点时间,完成时截图并没有显示出来。


资料

https://docs.alchemy.com/lang-zh/docs/how-to-develop-an-nft-smart-contract-erc721-with-alchemy

文档信息

Search

    Table of Contents