From 971facda8087deb36e0b3effc723e753bda191b9 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 6 May 2025 11:39:39 +0100 Subject: [PATCH 1/3] merge user outputSelection with our own defaults --- .../solidity/build-system/artifacts.ts | 2 +- .../solidity/build-system/build-system.ts | 8 +-- .../solidity/build-system/compilation-job.ts | 49 ++++++++++--------- .../src/types/solidity/compilation-job.ts | 2 +- .../solidity/build-system/compilation-job.ts | 34 +++++++++++++ 5 files changed, 65 insertions(+), 30 deletions(-) diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/artifacts.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/artifacts.ts index 0ce1d91a981..1ca14ded25f 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/artifacts.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/artifacts.ts @@ -119,7 +119,7 @@ export async function getBuildInfo( solcVersion: compilationJob.solcConfig.version, solcLongVersion: compilationJob.solcLongVersion, publicSourceNameMap, - input: compilationJob.getSolcInput(), + input: await compilationJob.getSolcInput(), }; return buildInfo; diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/build-system.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/build-system.ts index 369967d2ad2..84e4c6c32fd 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/build-system.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/build-system.ts @@ -284,7 +284,7 @@ export class SolidityBuildSystemImplementation implements SolidityBuildSystem { if (options?.quiet !== true) { if (isSuccessfulBuild) { - this.#printCompilationResult(compilationJobs); + await this.#printCompilationResult(compilationJobs); } } @@ -430,7 +430,7 @@ export class SolidityBuildSystemImplementation implements SolidityBuildSystem { "The long version of the compiler should match the long version of the compilation job", ); - return compiler.compile(compilationJob.getSolcInput()); + return compiler.compile(await compilationJob.getSolcInput()); } public async remapCompilerError( @@ -789,7 +789,7 @@ export class SolidityBuildSystemImplementation implements SolidityBuildSystem { } } - #printCompilationResult(compilationJobs: CompilationJob[]) { + async #printCompilationResult(compilationJobs: CompilationJob[]) { const jobsPerVersionAndEvmVersion = new Map< string, Map @@ -797,7 +797,7 @@ export class SolidityBuildSystemImplementation implements SolidityBuildSystem { for (const job of compilationJobs) { const solcVersion = job.solcConfig.version; - const solcInput = job.getSolcInput(); + const solcInput = await job.getSolcInput(); const evmVersion = solcInput.settings.evmVersion ?? `Check solc ${solcVersion}'s doc for its default evm version`; diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts index 2006bac0e09..4525b881771 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -8,6 +8,7 @@ import type { DependencyGraph } from "../../../../types/solidity/dependency-grap import type { ResolvedFile } from "../../../../types/solidity.js"; import { createNonCryptographicHashId } from "@nomicfoundation/hardhat-utils/crypto"; +import { deepClone } from "@nomicfoundation/hardhat-utils/lang"; import { formatRemapping } from "./resolver/remappings.js"; import { getEvmVersionFromSolcVersion } from "./solc-info.js"; @@ -36,9 +37,9 @@ export class CompilationJobImplementation implements CompilationJob { this.#remappings = remappings; } - public getSolcInput(): CompilerInput { + public async getSolcInput(): Promise { if (this.#solcInput === undefined) { - this.#solcInput = this.#buildSolcInput(); + this.#solcInput = await this.#buildSolcInput(); } return this.#solcInput; @@ -52,9 +53,10 @@ export class CompilationJobImplementation implements CompilationJob { return this.#buildId; } - #getSolcInputWithoutSources(): Omit { + async #getSolcInputWithoutSources(): Promise> { if (this.#solcInputWithoutSources === undefined) { - this.#solcInputWithoutSources = this.#buildSolcInputWithoutSources(); + this.#solcInputWithoutSources = + await this.#buildSolcInputWithoutSources(); } return this.#solcInputWithoutSources; @@ -71,8 +73,8 @@ export class CompilationJobImplementation implements CompilationJob { return this.#resolvedFiles; } - #buildSolcInput(): CompilerInput { - const solcInputWithoutSources = this.#getSolcInputWithoutSources(); + async #buildSolcInput(): Promise { + const solcInputWithoutSources = await this.#getSolcInputWithoutSources(); const sources: { [sourceName: string]: { content: string } } = {}; @@ -90,7 +92,9 @@ export class CompilationJobImplementation implements CompilationJob { }; } - #buildSolcInputWithoutSources(): Omit { + async #buildSolcInputWithoutSources(): Promise< + Omit + > { const settings = this.solcConfig.settings; // Ideally we would be more selective with the output selection, so that @@ -99,22 +103,19 @@ export class CompilationJobImplementation implements CompilationJob { // from other files (e.g. new Foo()), and it won't output its bytecode if // it's not asked for. This would prevent EDR from doing any runtime // analysis. - const defaultOutputSelection: CompilerInput["settings"]["outputSelection"] = - { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - ], - "": ["ast"], - }, - }; - - // TODO: Deep merge the user output selection with the default one - const outputSelection = defaultOutputSelection; + const outputSelection = await deepClone(settings.outputSelection ?? {}); + outputSelection["*"] ??= {}; + outputSelection["*"][""] ??= []; + outputSelection["*"]["*"] ??= []; + + outputSelection["*"][""].push("ast"); + outputSelection["*"]["*"].push( + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + ); return { language: "Solidity", @@ -157,7 +158,7 @@ export class CompilationJobImplementation implements CompilationJob { const preimage = format + this.solcLongVersion + - JSON.stringify(this.#getSolcInputWithoutSources()) + + JSON.stringify(await this.#getSolcInputWithoutSources()) + JSON.stringify(sortedSources) + JSON.stringify(this.solcConfig); diff --git a/v-next/hardhat/src/types/solidity/compilation-job.ts b/v-next/hardhat/src/types/solidity/compilation-job.ts index d2d2aca951c..c1c0d523e5e 100644 --- a/v-next/hardhat/src/types/solidity/compilation-job.ts +++ b/v-next/hardhat/src/types/solidity/compilation-job.ts @@ -25,7 +25,7 @@ export interface CompilationJob { /** * Returns the solc input to be used. */ - getSolcInput(): CompilerInput; + getSolcInput(): Promise; /** * Returns the build id of the compilation job. diff --git a/v-next/hardhat/test/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/test/internal/builtin-plugins/solidity/build-system/compilation-job.ts index cf0628b1c01..f0d559880cc 100644 --- a/v-next/hardhat/test/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/test/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -300,4 +300,38 @@ describe("CompilationJobImplementation", () => { }); }); }); + + describe("getSolcInput", () => { + it("should merge the user's outputSelection with our defaults", async () => { + const newCompilationJob = new CompilationJobImplementation( + dependencyGraph, + { + ...solcConfig, + settings: { + outputSelection: { + "*": { + "*": ["storageLayout"], + }, + }, + }, + }, + solcLongVersion, + remappings, + ); + const solcInput = await newCompilationJob.getSolcInput(); + assert.deepEqual(solcInput.settings.outputSelection, { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + ], + "": ["ast"], + }, + }); + }); + }); }); From 6103a9ec187cb8b018e6244e2b7d30724f454c02 Mon Sep 17 00:00:00 2001 From: Zoey Date: Tue, 6 May 2025 06:54:51 -0400 Subject: [PATCH 2/3] Create happy-carrots-kick.md --- .changeset/happy-carrots-kick.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/happy-carrots-kick.md diff --git a/.changeset/happy-carrots-kick.md b/.changeset/happy-carrots-kick.md new file mode 100644 index 00000000000..428c3bf56c2 --- /dev/null +++ b/.changeset/happy-carrots-kick.md @@ -0,0 +1,5 @@ +--- +"hardhat": patch +--- + +Merge user's output selection with our defaults ([#6551](https://github.com/NomicFoundation/hardhat/issues/6551)) From a6c7e85b770720a0f5d2ec417730e954693375a7 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 6 May 2025 12:07:46 +0100 Subject: [PATCH 3/3] Update .changeset/happy-carrots-kick.md --- .changeset/happy-carrots-kick.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/happy-carrots-kick.md b/.changeset/happy-carrots-kick.md index 428c3bf56c2..fde5deee2a2 100644 --- a/.changeset/happy-carrots-kick.md +++ b/.changeset/happy-carrots-kick.md @@ -2,4 +2,4 @@ "hardhat": patch --- -Merge user's output selection with our defaults ([#6551](https://github.com/NomicFoundation/hardhat/issues/6551)) +Merge user's solc output selection with our defaults ([#6551](https://github.com/NomicFoundation/hardhat/issues/6551))