hardhat-deploy
Version:
Hardhat plugin for replicable smart contract deployments and easy testing across multiple EVM chains, with support for proxies, diamonds, named accounts, and deployment fixtures
81 lines (72 loc) • 2.84 kB
text/typescript
import type {ConfigHooks} from 'hardhat/types/hooks';
import {getConfig} from '../config/get-config.js';
import {validateTypechainUserConfig} from '../config/validation.js';
import {SolidityBuildProfileConfig, SolidityConfig} from 'hardhat/types/config';
function addIfNotPresent(array: string[], value: string) {
if (array.indexOf(value) === -1) {
array.push(value);
}
}
function setupExtraSolcSettings(settings: {
metadata: {useLiteralContent: boolean};
outputSelection: {'*': {'': string[]; '*': string[]}};
}): void {
settings.metadata = settings.metadata || {};
settings.metadata.useLiteralContent = true;
if (settings.outputSelection === undefined) {
settings.outputSelection = {
'*': {
'*': [],
'': [],
},
};
}
if (settings.outputSelection['*'] === undefined) {
settings.outputSelection['*'] = {
'*': [],
'': [],
};
}
if (settings.outputSelection['*']['*'] === undefined) {
settings.outputSelection['*']['*'] = [];
}
if (settings.outputSelection['*'][''] === undefined) {
settings.outputSelection['*'][''] = [];
}
addIfNotPresent(settings.outputSelection['*']['*'], 'abi');
// addIfNotPresent(settings.outputSelection['*']['*'], 'evm.bytecode');
// addIfNotPresent(settings.outputSelection['*']['*'], 'evm.deployedBytecode');
addIfNotPresent(settings.outputSelection['*']['*'], 'metadata');
addIfNotPresent(settings.outputSelection['*']['*'], 'devdoc');
addIfNotPresent(settings.outputSelection['*']['*'], 'userdoc');
addIfNotPresent(settings.outputSelection['*']['*'], 'storageLayout');
// addIfNotPresent(settings.outputSelection['*']['*'], 'evm.methodIdentifiers');
addIfNotPresent(settings.outputSelection['*']['*'], 'evm.gasEstimates');
// addIfNotPresent(settings.outputSelection["*"][""], "ir");
// addIfNotPresent(settings.outputSelection["*"][""], "irOptimized");
// addIfNotPresent(settings.outputSelection["*"][""], "ast");
}
export default async (): Promise<Partial<ConfigHooks>> => {
const handlers: Partial<ConfigHooks> = {
validateUserConfig: validateTypechainUserConfig,
resolveUserConfig: async (userConfig, resolveConfigurationVariable, next) => {
const resolvedConfig = await next(userConfig, resolveConfigurationVariable);
const solidity: SolidityConfig = structuredClone(resolvedConfig.solidity);
const profiles: Record<string, SolidityBuildProfileConfig> = solidity.profiles;
for (const profileName of Object.keys(profiles)) {
const profile: SolidityBuildProfileConfig = profiles[profileName];
const compilers = profile.compilers;
for (const compiler of compilers) {
const settings = compiler.settings;
setupExtraSolcSettings(settings);
}
}
return {
...resolvedConfig,
solidity,
generateTypedArtifacts: getConfig(userConfig.generateTypedArtifacts),
};
},
};
return handlers;
};