non-fungible-apps/contracts/scripts/utils/deploy-store.js

85 lines
2.2 KiB
JavaScript

const { writeFile } = require('./file');
const { existsSync } = require('fs');
const path = require('path');
const getDeployFilePath = (network, contractName) => {
return path.resolve(
__dirname,
`../../deployments/${network}/${contractName}.json`
);
};
const getBuildData = async (contractName) => {
const buildArtifact = await hre.artifacts.readArtifact(contractName);
const {
id: buildId,
input: solcInput,
output: solcOutput,
} = await hre.artifacts.getBuildInfo(
`${buildArtifact.sourceName}:${buildArtifact.contractName}`
);
const contractOutput =
solcOutput.contracts[buildArtifact.sourceName][contractName];
return {
buildId,
abi: contractOutput.abi,
bytecode: buildArtifact.bytecode,
metadata: contractOutput.metadata,
storageLayout: contractOutput.storageLayout,
solcInput,
};
};
const deployStore = async (network, contractName, contract) => {
const filePath = getDeployFilePath(network, contractName);
const { buildId, solcInput, abi, bytecode, metadata, storageLayout } =
await getBuildData(contractName);
const data = {
timestamp: new Date().toLocaleString('en-US'),
address: contract.address,
transactionHash: contract.deployTransaction.hash,
args: contract.deployTransaction.args,
gasPrice: contract.deployTransaction.gasPrice.toNumber(),
abi,
bytecode,
metadata,
storageLayout,
};
try {
const solcInputsFilePath =
filePath.split('/').slice(0, -1).join('/') +
`/solcInputs/${buildId}.json`;
console.log('Writing deploy files', filePath);
await writeFile(filePath, JSON.stringify(data, null, 2));
await writeFile(solcInputsFilePath, JSON.stringify(solcInput, null, 2));
} catch (err) {
throw `Could not write file: ${err}`;
}
};
const getCurrentAddressIfSameBytecode = async (contractName) => {
const { bytecode } = await getBuildData(contractName);
if (existsSync(getDeployFilePath(hre.network.name, contractName))) {
const deployData = require(getDeployFilePath(
hre.network.name,
contractName
));
return deployData.bytecode === bytecode ? deployData.address : null;
}
return null;
};
module.exports = {
getBuildData,
deployStore,
getCurrentAddressIfSameBytecode,
};