扁平化合约

本章学习如何使用 Hardhat 扁平化一个智能合约。

推特@Hita_DAO    DiscordHitaDAO

hardhat 附带一个内置任务 flatten,它可以将多个 solidity 文件的源代码合并到一个文件中。

这个功能通常用于将智能合约源代码上传到区块浏览器(如etherscan.io)进行验证,以增加项目的透明度和可信度。

我们在开发智能合约项目时,源代码通常分散在多个文件中,有时还引用了外部的第三方库。

当项目完成并部署到以太坊主网后,开发者希望将合约源代码开源,上传到区块浏览器。手动上传多个源代码文件会很繁琐,尤其是当合约引用了多个第三方库时。

为了简化这个过程,我们可以使用 hardhatflatten 任务将所有源代码文件合并为一个文件,非常便捷。

我们通过一个示例来说明,假设我们有一个标准的 ERC20 代币合约,它使用了 openzeppelin 的代码库。

合约代码如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyCoin is ERC20{
  constructor() ERC20("BinSchool Coin", "BC") {
     _mint(msg.sender, 100*10**18);
  }
}

这个合约编译前,需要安装 openzeppelin 依赖包:

npm install --save-dev @openzeppelin/contracts

然后就可以使用 flatten 任务来合并代码:

npx hardhat flatten contracts/MyCoin.sol > MyCoinFlatten.sol

其中 contracts/MyCoin.sol 是将要扁平化的源文件。

MyCoinFlatten.sol 是扁平化后的结果文件。

执行任务后,我们可以得到 MyCoinFlatten.sol 文件,其内容为:

// Sources flattened with hardhat v2.17.4 https://hardhat.org
// SPDX-License-Identifier: MIT
// File @openzeppelin/contracts/token/ERC20/IERC20.sol@v4.9.3
// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */

interface IERC20 {

  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */</span >
  event Transfer(address indexed from, address indexed to, uint256 value);

......

contract MyCoin is ERC20{
  constructor() ERC20("BinSchool Coin", "BC") {
     _mint(msg.sender, 100*10**18);
  }
}

我们就可以将 MyCoinFlatten.sol 文件,上传到区块浏览器进行源代码验证。