如何使用 Ethers.js 铸造 NFT

本教程介绍了如何通过 ethers.js 库使用以太币在以太坊区块链上铸造 NFT,以及我们来自第一部分的智能合约:如何创建 NFT。我们还将探讨基本测试。

完成本指南的预计时间:~10 分钟

在本练习中,我们将引导您完成使用OpenZeppelin 库版本 4以及Ethers.js 以太坊库而不是 Web3 的替代实现。

我们还将介绍使用Hardhat 和 Waffle测试您的合约的基础知识。对于本教程,我使用的是 Yarn,但如果您愿意,也可以使用 npm/npx。

最后,我们将使用 TypeScript。这已被很好地记录下来,所以我们不会在这里介绍它。

在所有其他方面,本教程与 Web3 版本的工作方式相同,包括 Pinata 和 IPFS 等工具。

快速提醒

提醒一下,“铸造 NFT”是在区块链上发布您的 ERC721 代币的唯一实例的行为。本教程假设您已经在 NFT 教程系列的第一部分中成功将智能合约部署到 Goerli 网络,其中包括 .

第 1 步:创建您的 Solidity 合约

OpenZeppelin 是用于安全智能合约开发的库。您只需继承他们对 ERC20 或 ERC721 等流行标准的实现,并根据您的需要扩展行为。我们将把这个文件放在 contracts/MyNFT.sol 中。

// Contract based on https://docs.openzeppelin.com/contracts/4.x/erc721
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract MyNFT is ERC721URIStorage {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() ERC721("MyNFT", "MNFT") {}

    function mintNFT(address recipient, string memory tokenURI)
    public
    returns (uint256)
    {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }
}

第 2 步:创建 Hardhat 任务以部署我们的合约并铸造 NFT

创建包含以下内容的文件 tasks/nft.ts:

第 3 步:创建助手

您会注意到我们的任务导入了一些助手。他们来了。

合同.ts

环境文件

供应商.ts

请注意,最终的 getProvider() 函数使用 ropsten 网络。此参数是可选的,如果省略则默认为“homestead”。当然,我们使用的是 Alchemy,但有多种受支持的替代方案

钱包.ts

第 4 步:创建测试

在您的测试目录下,创建这些文件。请注意,这些测试并不全面。他们测试了 OpenZeppelin 库提供的一小部分 ERC721 功能,旨在为您提供构建块以创建更强大的测试。

test/MyNFT.spec.ts(单元测试)

tasks.spec.ts(集成规范)

test-helpers.ts请注意,这需要导入 NPM 库,包括 sinon、chai 和 sinon-chai。由于使用存根,因此需要调用sinon.restore() 。

第 5 步:配置

这是我们相当简单的hardhat.config.ts

请注意,如果我们不运行测试,则只调用 dotenv 的条件。您可能不想在生产环境中运行它,但请放心,如果 .env 文件不存在,dotenv 将默默地忽略它。

运行我们的任务

现在我们已经将这些文件放在适当的位置,我们可以运行 hardhat 来查看我们的任务(为简洁起见,不包括内置任务)。

忘记了任务的论据?没问题。

运行我们的测试

为了运行我们的测试,我们运行hardhat test

概括

在本教程中,我们为基于 Solidity 的经过良好测试的 NFT 基础设施奠定了坚实的基础。waffle.provider.getWallets()提供的钱包链接到一个本地假Hardhat Network帐户,该帐户方便地预装了一个 eth 余额,我们可以用它来为我们的测试交易提供资金。

最后更新于