扁平化合约
本章学习如何使用 Hardhat
扁平化一个智能合约。
hardhat
附带一个内置任务 flatten
,它可以将多个 solidity
文件的源代码合并到一个文件中。
这个功能通常用于将智能合约源代码上传到区块浏览器(如etherscan.io
)进行验证,以增加项目的透明度和可信度。
我们在开发智能合约项目时,源代码通常分散在多个文件中,有时还引用了外部的第三方库。
当项目完成并部署到以太坊主网后,开发者希望将合约源代码开源,上传到区块浏览器。手动上传多个源代码文件会很繁琐,尤其是当合约引用了多个第三方库时。
为了简化这个过程,我们可以使用 hardhat
的 flatten
任务将所有源代码文件合并为一个文件,非常便捷。
我们通过一个示例来说明,假设我们有一个标准的 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
文件,上传到区块浏览器进行源代码验证。