一:需求场景说明
基于 Hardhat,导出 ABI 文件给后端或者前端。
package.json 的 scripts 内增加 compile
"scripts": {
"compile": "npx hardhat compile && node batch/abi.ts",
"docs": "npx hardhat dodoc",
"node": "npx hardhat node",
"test": "npx hardhat test",
"coverage": "npx hardhat coverage && npx http-server ./coverage/ -o",
"gas": "REPORT_GAS=true npx hardhat test",
"abi": "npx hardhat export-abi",
"d:l": "npx hardhat run --network localhost scripts/deploy.js",
"d:fbchain": "npx hardhat run --network fbchain scripts/deploy.js",
"d:oktestchain": "npx hardhat run --network oktest scripts/deploy.js",
"remixd": "open http://remix.ethereum.org/ && remixd -s ./ --remix-ide http://remix.ethereum.org/"
},
/batch/abi.ts 文件
let fs = require("fs");
let path = require("path");
// 需要抽出的ABI文件
const allContractName = [{ name: "FlowDeposit", dir: "" }];
const filePath = path.resolve(__dirname, `../abi`);
const utility = {
start() {
utility.init();
utility.writer();
},
// 路径如果没有就创建
init() {
if (!fs.existsSync(filePath)) {
console.log("ABI路径不存在:创建ABI储存目录...");
fs.mkdirSync(filePath);
}
},
// 写入指定目录
writer() {
console.log("ABI文件:准备中...");
for (let index = 0; index < allContractName.length; index++) {
const element = allContractName[index];
// 获取ABI源文件
const dir = element.dir ? `/${element.dir}` : "";
const abiFile = require(`../artifacts/contracts${dir}/${element.name}.sol/${element.name}.json`);
fs.writeFileSync(path.resolve(filePath, `${element.name}.json`), JSON.stringify(abiFile.abi, null, 2));
}
console.log("ABI文件:已经成功写入");
},
};
utility.start();
命令
运行 npm run compile
即可在项目根目录创建 abi
文件,所有需要抽出的 ABI 文件均出现在此 abi 目录内。
二:配置生成默认 NatSpec docs
基于 @primitivefi/hardhat-dodoc 或者 hardhat-docgen 随便选择一个都可以。
下面是按照 @primitivefi/hardhat-dodoc 来实现的配置
hardhat.config.js 配置
require("@nomicfoundation/hardhat-toolbox");
require("@openzeppelin/hardhat-upgrades");
require("@primitivefi/hardhat-dodoc");
require("dotenv").config();
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: {
version: "0.8.19",
settings: {
optimizer: {
enabled: true,
runs: 200,
},
viaIR: true,
},
},
networks: {
hardhat: {
allowUnlimitedContractSize: true,
chainId: 22,
accounts: {
count: 330,
accountsBalance: "20000000000000000000000000",
},
},
okchain: {
url: process.env.RPC_URL_OK,
accounts: [process.env.PK_ACCOUNT_1],
timeout: 600000,
blockGasLimit: 0x1fffffffffffff,
throwOnTransactionFailures: true,
throwOnCallFailures: true,
allowUnlimitedContractSize: true,
},
},
// docgen: {
// path: './docs',
// clear: true,
// runOnCompile: true,
// }
dodoc: {
runOnCompile: true,
debugMode: true,
freshOutput: false,
keepFileStructure: false,
include: ["XXX.sol"],
exclude: [],
outputDir: "./docs",
},
contractSizer: {
alphaSort: true,
runOnCompile: true,
disambiguatePaths: false,
},
abiExporter: {
path: './abi',
clear: true,
flat: true,
}
};
运行命令
npx hardhat dodoc