UNPKG

@maplelabs/hardhat-scripts

Version:

Hardhat Ethereum Scripts used at Maple Labs

157 lines (132 loc) 4.33 kB
const fs = require('fs') const chalk = require('chalk') const bre = require('hardhat') async function publishContract(contractName, directory) { const contractFilePath = `${bre.config.paths.artifacts}/contracts/` + `${contractName}.sol/${contractName}.json` const contract = await require(contractFilePath) const networkFolder = directory + '/' + bre.network.name const networkFile = `${directory}/${bre.network.name}.js` if (!fs.existsSync(networkFolder)) { fs.mkdir(networkFolder, console.log) } const props = { contract, contractName, networkFolder, directory, networkFile, } return Promise.all([ createAddressFile(props), createAbiFile(props), createByteCodeFile(props), createRawJsonFile(props), ]) } async function createRawJsonFile({ contract, contractName, networkFolder }) { if (!fs.existsSync(`${networkFolder}/json`)) { fs.mkdir(`${networkFolder}/json`, console.log) } fs.writeFileSync( `${networkFolder}/json/${contractName}.abi.json`, JSON.stringify(contract.abi), console.log, ) } async function createAddressFile({ contractName, networkFolder, networkFile }) { if (!fs.existsSync(`${networkFolder}/addresses`)) { fs.mkdir(`${networkFolder}/addresses`, console.log) } const addressFile = `${bre.config.paths.artifacts}/${contractName}.address` if (fs.existsSync(addressFile)) { const address = fs.readFileSync(addressFile).toString() fs.writeFileSync( `${networkFolder}/addresses/${contractName}.address.js`, `module.exports = "${address}";`, ) const abiIndex = require(networkFile) // if (!(`${contractName}Address` in abiIndex)) { // const newExport = // `module.exports.${contractName}Address` + // ` = require('./${bre.network.name}/address/${contractName}.address.js');\n` // fs.appendFileSync(networkFile, newExport) // } } } async function createAbiFile({ contract, contractName, networkFolder, networkFile, }) { if (!fs.existsSync(`${networkFolder}/abis`)) { fs.mkdir(`${networkFolder}/abis`, (err, data) => null) } const abi = JSON.stringify(contract.abi, null, 2) const abiFileName = `${networkFolder}/abis/${contractName}.abi.js` if (!fs.existsSync(networkFile)) { fs.writeFile(networkFile, '', console.log) } fs.writeFileSync(abiFileName, `module.exports = ${abi};`, console.log) const abiIndex = require(networkFile) if (!(`${contractName}Abi` in abiIndex)) { const newExport = `module.exports.${contractName}Abi ` + `= require('./${bre.network.name}/abis/${contractName}.abi.js');\n` fs.appendFileSync(networkFile, newExport) } } async function createByteCodeFile({ contract, contractName, networkFolder, networkFile, }) { if (!fs.existsSync(`${networkFolder}/bytecode`)) { await fs.mkdir(`${networkFolder}/bytecode`, console.log) } fs.writeFileSync( `${networkFolder}/bytecode/${contractName}.bytecode.js`, `module.exports = "${contract.bytecode}";`, ) const abiIndex = require(networkFile) if (!(`${contractName}ByteCode` in abiIndex)) { const newExport = `module.exports.${contractName}ByteCode` + ` = require('./${bre.network.name}/bytecode/${contractName}.bytecode.js');\n` fs.appendFileSync(networkFile, newExport) } } async function publish(directories) { try { for (let i = 0; i < directories.length; i++) { if (!fs.existsSync(directories[i])) { fs.mkdirSync(directories[i]) } console.log('📚 Publishing', 'to', chalk.yellow(directories[i]), '\n') const finalContractList = [] fs.readdirSync(bre.config.paths.sources).forEach((file) => { if (file.indexOf('.sol') >= 0) { const contractName = file.replace('.sol', '') // Add contract to list if publishing is successful try { if (publishContract(contractName, directories[i])) { finalContractList.push(contractName) } } catch (e) { console.log(e) } } }) fs.writeFileSync( `${directories[i]}/contracts.js`, `module.exports = ${JSON.stringify(finalContractList)};`, ) } } catch (err) { console.log(err) } } module.exports = publish