JavaScript 不可用。

我们检测到浏览器禁用了 JavaScript。请启用 JavaScript 或改用支持的浏览器来继续访问

Hardhat 项目生成 ABI JSON文件

作者:Anban Chu

发表日期:2022年12月21日

所属目录:合约开发

标签:

一:需求场景说明

基于 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




以上就是本篇文章的全部内容了,希望对你有帮助。

>> 本站不提供评论服务,技术交流请在 Twitter 上找我 @anbang_account