使用Hardhat Tasks创建智能合约开发工作流

如何实现智能合约部署脚本的自动化

使用Hardhat Tasks创建智能合约开发工作流

翻译:团长(https://twitter.com/quentangle_

智能合约开发除了测试和部署之外,还可能涉及到一些任务。也许你想在部署后立即与合约互动,或者更新文件中的已部署合约地址列表。

一般情况下可以为每个任务编写脚本并单独运行它们,但当每次都要运行多个脚本时,这就变得很麻烦。

Hardhat任务是一种为智能合约开发工作流程添加自动化的方式。它提供了一种更加结构化的方式来创建脚本。它还允许将多个脚本合并为一个。Hardhat任务也使解析参数更容易,因为它提供了参数类型验证。

在这篇文章中,我们将使用hardhat任务创建一个工作流。我们将创建并部署一个NFT智能合约到Goerli测试网,在Etherscan上验证地址,并空投一些代币。

设置Hardhat项目

本教程将使用 node js 第 16 版。如果你还没有 NodeJS,我建议安装 node 版本管理器(nvm)。之后运行以下命令:$ nvm install 16
$ nvm use 16

安装node,创建项目目录。进入该目录,运行npx hardhat生成hardhat 样板文件。$ mkdir hardhat-tasks
$ cd hardhat-tasks
$ npx hardhat

Hardhat会提示你选择要使用的项目类型。在本例中我们使用TypeScript。

选择了项目的类型后,回答所有的提示,回答 “y”来安装项目的依赖,然后等待hardhat生成模板。

完成后,你的项目目录长这样:

环境变量和Hardhat配置

.env.example文件中添加你的合约部署器私钥、Etherscan API密钥和Alchemy密钥。在本教程中使用Goerli Ethereum测试网络。

在添加完密钥后,将.env.example重命名为.env .

如果你在合约部署中需要eth,你可以得到一些。对于Etherscan的API密钥,你可以在这里注册。要获得Alchemy密钥,你可以在这里注册。

你的 env 文件现在应该看起来像这样:

看一下hardhat.config.ts 。这是一个设置使用哪种网络和私钥的文件,以及其他配置事项。配置文件从.env文件中读取必要的环境变量。

你需要在配置变量的networks属性中设置Goerli网络配置。

.eslintrc.js (可选)

将这些添加到.eslintrc.js文件中,以删除VSCode中的警告。这一步是可选的,因为没有这些配置,项目仍应运行。

智能合约

本教程将使用Open Zeppelin的标准ERC721创建一个NFT合约。要做到这一点,你必须安装Open Zeppelin。$ npm i -S @openzeppelin/contracts

创建一个名为NFT.sol的新文件。我们的合约将继承Open Zeppelin的ERC721合约以获得标准的ERC721功能。

任务

现在已经准备好了你的智能合约,要创建的第一个任务是部署任务。创建一个名为tasks的目录,并创建名为compile.tsdeploy.tsindex.ts的文件。

部署任务

deploy.ts中创建部署任务,在目录./tasks/deploy.ts中进行编译,并将我们的合约部署到测试网络中。

./tasks.index.ts中添加导出任务// tasks/index.ts
export * from "./deploy";

然后将tasks目录添加到tsconfig.json文件中,使TypeScript包含tasks文件夹。

验证任务

现在创建验证任务,它将验证在Etherscan上部署的合约。创建文件 ./tasks/verify-etherscan.ts

该任务希望有一个字符串参数,你可以插入contractAddress。不要忘记在./tasks/index.ts中添加导出文件。

然后用这段代码在./tasks/index.ts中添加导出。// tasks/index.ts
export * from "./deploy";
export * from "./verify-etherscan";

空投任务

现在是最后一项任务,你将向几个钱包地址空投代币。用以下代码创建文件./tasks/airdrop.ts

在./tasks/index.ts中添加导出的内容// tasks/index.ts export * from "./deploy";export * from "./verify-etherscan";export * from "./airdrop";

合并任务

现在,对于最后一项任务,把创建的所有任务合并为一个单一的任务。让我们用下面的代码创建./tasks/deploy-verify-airdrop.ts

同样,不要忘记在./tasks/index.ts中添加导出。// tasks/index.ts
export * from "./deploy";
export * from "./verify-etherscan";
export * from "./airdrop";
export * from "./deploy-verify-airdrop";

运行任务

现在已经创建了任务,可以通过运行npx hardhat看看所有可用的任务。

现在让我们通过以下命令来运行 deploy-verify-airdrop 任务:npx hardhat deploy-verify-airdrop --network goerli --airdrop-address 0x42D57aAA086Ee6575Ddd3b502af1b07aEa91E495

我在这里使用我生成的一个钱包地址作为空投地址,你可以把它改为你喜欢的任何钱包地址。

从日志的输出中,你可以看到部署的NFT合约地址,可以在Etherscan上看到部署的合约链接,以及成功空投到指定的地址。

总结

恭喜你,你已经成功地部署了一个智能合约,在Etherscan上验证了部署,并在一个单一的命令中与它进行了互动。你所写的脚本保持了小规模和模块化。此外,你创建的任务列表可以通过npx hardhat模块轻松查看。

Hardhat任务是任何智能合约开发者和你应该利用的最有用的工具之一,因为它通过保持代码库更有条理来提高你的生产力。