diff --git a/.changeset/fuzzy-eyes-collect.md b/.changeset/fuzzy-eyes-collect.md new file mode 100644 index 0000000000..dc057aca7f --- /dev/null +++ b/.changeset/fuzzy-eyes-collect.md @@ -0,0 +1,5 @@ +--- +"@nomicfoundation/hardhat-verify": patch +--- + +Make the `--force` flag override the check of any existing verification, even in the presence of errors. diff --git a/.changeset/fuzzy-mangos-behave.md b/.changeset/fuzzy-mangos-behave.md new file mode 100644 index 0000000000..ea406edfdc --- /dev/null +++ b/.changeset/fuzzy-mangos-behave.md @@ -0,0 +1,5 @@ +--- +"hardhat": patch +--- + +Add `debug` logs to Hardhat Network initialization process. diff --git a/.changeset/great-crabs-hug.md b/.changeset/great-crabs-hug.md new file mode 100644 index 0000000000..3b4d56eb12 --- /dev/null +++ b/.changeset/great-crabs-hug.md @@ -0,0 +1,5 @@ +--- +"hardhat": patch +--- + +Added an `enableRip7212` optional flag to the Hardhat Network config that enables [RIP-7212 (Precompile for secp256r1 Curve Support)](https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md). diff --git a/.changeset/grumpy-dragons-shop.md b/.changeset/grumpy-dragons-shop.md new file mode 100644 index 0000000000..b9d778100c --- /dev/null +++ b/.changeset/grumpy-dragons-shop.md @@ -0,0 +1,5 @@ +--- +"hardhat": patch +--- + +Bump EDR to [v0.4.2](https://github.com/NomicFoundation/edr/releases/tag/%40nomicfoundation%2Fedr%400.4.2). diff --git a/.changeset/modern-points-cover.md b/.changeset/modern-points-cover.md new file mode 100644 index 0000000000..740a900c37 --- /dev/null +++ b/.changeset/modern-points-cover.md @@ -0,0 +1,5 @@ +--- +"hardhat": patch +--- + +Bumped EDR to [v0.5.0](https://github.com/NomicFoundation/edr/releases/tag/%40nomicfoundation%2Fedr%400.5.0). diff --git a/.changeset/rude-suits-add.md b/.changeset/rude-suits-add.md new file mode 100644 index 0000000000..40ac03a18b --- /dev/null +++ b/.changeset/rude-suits-add.md @@ -0,0 +1,5 @@ +--- +"hardhat": patch +--- + +Fix message for error HH206 diff --git a/.changeset/shiny-wasps-invite.md b/.changeset/shiny-wasps-invite.md deleted file mode 100644 index 396118e098..0000000000 --- a/.changeset/shiny-wasps-invite.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hardhat": patch ---- - -Add support for Node v22 diff --git a/.changeset/unlucky-tips-jam.md b/.changeset/unlucky-tips-jam.md deleted file mode 100644 index ac4ab73190..0000000000 --- a/.changeset/unlucky-tips-jam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hardhat": patch ---- - -Added hardfork histories for Optimim and Arbitrum chains diff --git a/docs/src/content/hardhat-network/docs/reference/index.md b/docs/src/content/hardhat-network/docs/reference/index.md index b0d2e621b0..2078eef9c2 100644 --- a/docs/src/content/hardhat-network/docs/reference/index.md +++ b/docs/src/content/hardhat-network/docs/reference/index.md @@ -122,6 +122,10 @@ The `baseFeePerGas` of the first block. Note that when forking a remote network, The address used as coinbase in new blocks. Default value: `"0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e"`. +#### `enableRip7212` + +A flag indicating whether to enable [RIP-7212 (Precompile for secp256r1 Curve Support)](https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md). Default value: `false`. + ### Mining modes You can configure the mining behavior under your Hardhat Network settings: diff --git a/docs/src/content/hardhat-runner/plugins/plugins.ts b/docs/src/content/hardhat-runner/plugins/plugins.ts index 941bf51989..ef37dc9040 100644 --- a/docs/src/content/hardhat-runner/plugins/plugins.ts +++ b/docs/src/content/hardhat-runner/plugins/plugins.ts @@ -660,7 +660,7 @@ const communityPlugins: IPlugin[] = [ authorUrl: "https://distributedlab.com/", description: "Hardhat plugin to automate the deployment and verification of contracts", - tags: ["Deployment", "Verification", "Migration"], + tags: ["Deployment", "Verification", "Migration", "Solarity"], }, { name: "hardhat-notifier", @@ -683,7 +683,7 @@ const communityPlugins: IPlugin[] = [ authorUrl: "https://distributedlab.com/", description: "Hardhat plugin to generate smart contract bindings for Golang", - tags: ["Bindings", "Go", "Testing"], + tags: ["Bindings", "Go", "Testing", "Solarity"], }, { name: "hardhat-storage-vault", @@ -729,7 +729,7 @@ const communityPlugins: IPlugin[] = [ authorUrl: "https://distributedlab.com/", description: "Hardhat plugin to generate customizable smart contracts documentation", - tags: ["Documentation", "NatSpec", "Markdown"], + tags: ["Documentation", "NatSpec", "Markdown", "Solarity"], }, { name: "hardhat-contract-clarity", @@ -843,7 +843,7 @@ const communityPlugins: IPlugin[] = [ author: "Distributed Lab", authorUrl: "https://distributedlab.com/", description: "Hardhat plugin to deeply compare smart contracts", - tags: ["Storage Layout", "Bytecode", "Diff", "Compare"], + tags: ["Storage Layout", "Bytecode", "Diff", "Compare", "Solarity"], }, { name: "hardhat-logger", @@ -974,6 +974,27 @@ const communityPlugins: IPlugin[] = [ "Hardhat plugin for verifying smart contracts deployed on the EVM chains including X Layer", tags: ["OKX Explorer", "Verification", "X Layer"], }, + { + name: "@solarity/hardhat-zkit", + author: "Distributed Lab", + authorUrl: "https://distributedlab.com/", + description: "The ultimate environment for building with Circom", + tags: ["Circom", "zk", "SnarkJS", "environment", "Solarity"], + }, + { + name: "@solarity/hardhat-habits", + author: "Distributed Lab", + authorUrl: "https://distributedlab.com/", + description: "Hardhat plugin to get interfaceid", + tags: ["ABI", "interfaceid", "Solarity"], + }, + { + name: "@yankeguo/hardhat-trezor", + author: "Yanke G.", + authorUrl: "https://yankeguo.com", + description: "Hardhat plugin for the Trezor hardware wallet", + tags: ["Trezor", "Wallet"], + }, ]; const officialPlugins: IPlugin[] = [ diff --git a/docs/src/content/ignition/docs/advanced/migrating.md b/docs/src/content/ignition/docs/advanced/migrating.md index be6a950714..7e801c9470 100644 --- a/docs/src/content/ignition/docs/advanced/migrating.md +++ b/docs/src/content/ignition/docs/advanced/migrating.md @@ -8,77 +8,77 @@ To get started, we’ll uninstall the `hardhat-deploy` plugin and install the Ha 1. Remove the `hardhat-deploy` packages from your project: -::::tabsgroup{options="npm,yarn"} + ::::tabsgroup{options="npm,yarn"} -:::tab{value="npm"} + :::tab{value="npm"} -```sh -npm uninstall hardhat-deploy hardhat-deploy-ethers -``` + ```sh + npm uninstall hardhat-deploy hardhat-deploy-ethers + ``` -::: + ::: -:::tab{value=yarn} + :::tab{value=yarn} -```sh -yarn remove hardhat-deploy hardhat-deploy-ethers -``` + ```sh + yarn remove hardhat-deploy hardhat-deploy-ethers + ``` -::: + ::: -:::: + :::: 2. Install the Hardhat Ignition package and `hardhat-network-helpers` to provide additional testing support as a replacement for `hardhat-deploy` functionality like EVM snapshots: -::::tabsgroup{options="npm,yarn"} + ::::tabsgroup{options="npm,yarn"} -:::tab{value="npm"} + :::tab{value="npm"} -```sh -npm install --save-dev @nomicfoundation/hardhat-ignition-ethers @nomicfoundation/hardhat-network-helpers -``` + ```sh + npm install --save-dev @nomicfoundation/hardhat-ignition-ethers @nomicfoundation/hardhat-network-helpers + ``` -::: + ::: -:::tab{value=yarn} + :::tab{value=yarn} -```sh -yarn add --dev @nomicfoundation/hardhat-ignition-ethers @nomicfoundation/hardhat-network-helpers -``` + ```sh + yarn add --dev @nomicfoundation/hardhat-ignition-ethers @nomicfoundation/hardhat-network-helpers + ``` -::: + ::: -:::: + :::: 3. Update the project’s `hardhat.config` file to remove `hardhat-deploy` and `hardhat-deploy-ethers` and instead import Hardhat Ignition: -::::tabsgroup{options="typescript,javascript"} + ::::tabsgroup{options="typescript,javascript"} -:::tab{value="typescript"} + :::tab{value="typescript"} -```git -- import "hardhat-deploy"; -- import "hardhat-deploy-ethers"; -+ import "@nomicfoundation/hardhat-ignition-ethers"; -``` + ```git + - import "hardhat-deploy"; + - import "hardhat-deploy-ethers"; + + import "@nomicfoundation/hardhat-ignition-ethers"; + ``` -::: + ::: -:::tab{value=javascript} + :::tab{value=javascript} -```git -- require("hardhat-deploy"); -- require("hardhat-deploy-ethers"); -+ require("@nomicfoundation/hardhat-ignition-ethers"); -``` + ```git + - require("hardhat-deploy"); + - require("hardhat-deploy-ethers"); + + require("@nomicfoundation/hardhat-ignition-ethers"); + ``` -::: + ::: -:::: + :::: ## Convert deployment scripts to Ignition Modules -`hardhat-deploy` represents contract deployments as JavaScript or TypeScript files under the `./deploy/` folder. Hardhat Ignition follows a similar pattern with deployments encapsulated as modules; these are JS/TS files stored under the `./ignition/modules directory`. Each `hardhat-deploy` deploy file will be converted or merged into a Hardhat Ignition module. +`hardhat-deploy` represents contract deployments as JavaScript or TypeScript files under the `./deploy/` folder. Hardhat Ignition follows a similar pattern with deployments encapsulated as modules; these are JS/TS files stored under the `./ignition/modules` directory. Each `hardhat-deploy` deploy file will be converted or merged into a Hardhat Ignition module. Let’s first create the required folder structure under the root of your project: @@ -97,13 +97,16 @@ contract Token { uint256 public totalSupply = 1000000; address public owner; mapping(address => uint256) balances; + constructor(address _owner) { balances[_owner] = totalSupply; owner = _owner; } + function balanceOf(address account) external view returns (uint256) { return balances[account]; } + function transfer(address to, uint256 amount) external { require(balances[msg.sender] >= amount, "Not enough tokens"); balances[msg.sender] -= amount; @@ -123,9 +126,9 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const { deployments, getNamedAccounts } = hre; const { deploy } = deployments; /* - The deploy function uses the hardhat-deploy named accounts feature - to set the deployment's `from` and `args` parameters. - */ + The deploy function uses the hardhat-deploy named accounts feature + to set the deployment's `from` and `args` parameters. + */ const { deployer, tokenOwner } = await getNamedAccounts(); await deploy("Token", { from: deployer, @@ -152,29 +155,29 @@ import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; For instance, you can deploy contracts via `m.contract()`. */ export default buildModule("TokenModule", (m) => { - /* - Instead of named accounts, you get access to the configured accounts - through the `getAccount()` method. - */ + /* + Instead of named accounts, you get access to the configured accounts + through the `getAccount()` method. + */ const deployer = m.getAccount(0); const tokenOwner = m.getAccount(1); /* - Deploy `Token` by calling `contract()` with the constructor arguments - as the second argument. The account to use for the deployment transaction - is set through `from` in the third argument, which is an options object. - */ + Deploy `Token` by calling `contract()` with the constructor arguments + as the second argument. The account to use for the deployment transaction + is set through `from` in the third argument, which is an options object. + */ const token = m.contract("Token", [tokenOwner], { from: deployer, }); /* - The call to `m.contract()` returns a future that can be used in other `m.contract()` - calls (e.g. as a constructor argument, where the future will resolve to the - deployed address), but it can also be returned from the module. Contract - futures that are returned from the module can be leveraged in Hardhat tests - and scripts, as will be shown later. - */ + The call to `m.contract()` returns a future that can be used in other `m.contract()` + calls (e.g. as a constructor argument, where the future will resolve to the + deployed address), but it can also be returned from the module. Contract + futures that are returned from the module can be leveraged in Hardhat tests + and scripts, as will be shown later. + */ return { token }; }); ``` @@ -193,29 +196,29 @@ const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); For instance, you can deploy contracts via `m.contract()`. */ module.exports = buildModule("TokenModule", (m) => { - /* - Instead of named accounts, you get access to the configured accounts - through the `getAccount()` method. - */ + /* + Instead of named accounts, you get access to the configured accounts + through the `getAccount()` method. + */ const deployer = m.getAccount(0); const tokenOwner = m.getAccount(1); /* - Deploy `Token` by calling `contract()` with the constructor arguments - as the second argument. The account to use for the deployment transaction - is set through `from` in the third argument, which is an options object. - */ + Deploy `Token` by calling `contract()` with the constructor arguments + as the second argument. The account to use for the deployment transaction + is set through `from` in the third argument, which is an options object. + */ const token = m.contract("Token", [tokenOwner], { from: deployer, }); /* - The call to `m.contract()` returns a future that can be used in other `m.contract()` - calls (e.g. as a constructor argument, where the future will resolve to the - deployed address), but it can also be returned from the module. Contract - futures that are returned from the module can be leveraged in Hardhat tests - and scripts, as will be shown later. - */ + The call to `m.contract()` returns a future that can be used in other `m.contract()` + calls (e.g. as a constructor argument, where the future will resolve to the + deployed address), but it can also be returned from the module. Contract + futures that are returned from the module can be leveraged in Hardhat tests + and scripts, as will be shown later. + */ return { token }; }); ``` diff --git a/packages/hardhat-core/CHANGELOG.md b/packages/hardhat-core/CHANGELOG.md index 70bf94f57c..8c6d015169 100644 --- a/packages/hardhat-core/CHANGELOG.md +++ b/packages/hardhat-core/CHANGELOG.md @@ -1,5 +1,14 @@ # hardhat +## 2.22.6 + +### Patch Changes + +- cdf0160: Upgrade bundled solcjs +- 3c66da2: Add support for Node v22 +- 9fadc22: Bump EDR to [v0.4.1](https://github.com/NomicFoundation/edr/releases/tag/%40nomicfoundation%2Fedr%400.4.1). +- 095faa4: Added hardfork histories for Optimim and Arbitrum chains + ## 2.22.5 ### Patch Changes diff --git a/packages/hardhat-core/package.json b/packages/hardhat-core/package.json index ec50d00a2f..92fabe7c15 100644 --- a/packages/hardhat-core/package.json +++ b/packages/hardhat-core/package.json @@ -1,6 +1,6 @@ { "name": "hardhat", - "version": "2.22.5", + "version": "2.22.6", "author": "Nomic Labs LLC", "license": "MIT", "homepage": "https://hardhat.org", @@ -102,7 +102,7 @@ "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/edr": "^0.4.0", + "@nomicfoundation/edr": "^0.5.0", "@nomicfoundation/ethereumjs-common": "4.0.4", "@nomicfoundation/ethereumjs-tx": "5.0.4", "@nomicfoundation/ethereumjs-util": "9.0.4", @@ -136,7 +136,7 @@ "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", - "solc": "0.7.3", + "solc": "0.8.26", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", "tsort": "0.0.1", diff --git a/packages/hardhat-core/scripts/console-library-generator.js b/packages/hardhat-core/scripts/console-library-generator.ts similarity index 87% rename from packages/hardhat-core/scripts/console-library-generator.js rename to packages/hardhat-core/scripts/console-library-generator.ts index 38cde9f8f9..85db1d0a36 100644 --- a/packages/hardhat-core/scripts/console-library-generator.js +++ b/packages/hardhat-core/scripts/console-library-generator.ts @@ -1,7 +1,7 @@ -const eutil = require("@nomicfoundation/ethereumjs-util"); -const fs = require("fs"); +import fs from "fs"; +import { bytesToInt } from "@nomicfoundation/ethereumjs-util"; -const { keccak256 } = require("../internal/util/keccak"); +import { keccak256 } from "../src/internal/util/keccak"; const functionPrefix = " function"; const functionBody = @@ -12,7 +12,7 @@ const functionSuffix = "));" + "\n }" + "\n" + "\n"; let logger = "// ------------------------------------\n" + "// This code was autogenerated using\n" + - "// scripts/console-library-generator.js\n" + + "// scripts/console-library-generator.ts\n" + "// ------------------------------------\n\n"; const singleTypes = [ @@ -80,14 +80,11 @@ library console { `; logger += - "\n// In order to optimize map lookup\n" + - "// we'll store 4byte signature as int\n" + - "export const ConsoleLogs = {\n"; + "\n/** Maps from a 4-byte function selector to a signature (argument types) */\n" + + "export const CONSOLE_LOG_SIGNATURES: Record = {\n"; // Add the empty log() first -const sigInt = eutil.bufferToInt( - keccak256(Buffer.from("log" + "()")).slice(0, 4) -); +const sigInt = bytesToInt(keccak256(Buffer.from("log" + "()")).slice(0, 4)); logger += " " + sigInt + ": [],\n"; for (let i = 0; i < singleTypes.length; i++) { @@ -98,7 +95,7 @@ for (let i = 0; i < singleTypes.length; i++) { const nameSuffix = typeAliasedInt.charAt(0).toUpperCase() + typeAliasedInt.slice(1); - const sigInt = eutil.bufferToInt( + const sigInt = bytesToInt( keccak256(Buffer.from("log" + "(" + type + ")")).slice(0, 4) ); logger += @@ -109,7 +106,7 @@ for (let i = 0; i < singleTypes.length; i++) { type.slice(1) + "Ty],\n"; - const sigIntAliasedInt = eutil.bufferToInt( + const sigIntAliasedInt = bytesToInt( keccak256(Buffer.from("log" + "(" + typeAliasedInt + ")")).slice(0, 4) ); if (sigIntAliasedInt !== sigInt) { @@ -137,9 +134,9 @@ for (let i = 0; i < singleTypes.length; i++) { } const maxNumberOfParameters = 4; -const numberOfPermutations = {}; -const dividers = {}; -const paramsNames = {}; +const numberOfPermutations: Record = {}; +const dividers: Record = {}; +const paramsNames: Record = {}; for (let i = 0; i < maxNumberOfParameters; i++) { dividers[i] = Math.pow(maxNumberOfParameters, i); @@ -188,12 +185,12 @@ for (let i = 0; i < maxNumberOfParameters; i++) { functionSuffix; if (sigParams.length !== 1) { - const sigInt = eutil.bufferToInt( + const sigInt = bytesToInt( keccak256(Buffer.from("log(" + sigParams.join(",") + ")")).slice(0, 4) ); logger += " " + sigInt + ": [" + constParams.join(", ") + "],\n"; - const sigIntAliasedInt = eutil.bufferToInt( + const sigIntAliasedInt = bytesToInt( keccak256( Buffer.from("log(" + sigParamsAliasedInt.join(",") + ")") ).slice(0, 4) diff --git a/packages/hardhat-core/src/internal/core/errors-list.ts b/packages/hardhat-core/src/internal/core/errors-list.ts index 45f5195087..2deacda8a7 100644 --- a/packages/hardhat-core/src/internal/core/errors-list.ts +++ b/packages/hardhat-core/src/internal/core/errors-list.ts @@ -552,7 +552,7 @@ Please use \`runSuper.isDefined\` to make sure that you can call it.`, DEFAULT_VALUE_WRONG_TYPE: { number: 206, message: - "Default value for param %paramName% of task %taskName% doesn't match the default one, try specifying it.", + "Default value for param %paramName% of task %taskName% doesn't match its expected type.", title: "Default value has incorrect type", description: `One of your tasks has a parameter whose default value doesn't match the expected type. diff --git a/packages/hardhat-core/src/internal/core/providers/construction.ts b/packages/hardhat-core/src/internal/core/providers/construction.ts index e7302ba37a..59ac2c3439 100644 --- a/packages/hardhat-core/src/internal/core/providers/construction.ts +++ b/packages/hardhat-core/src/internal/core/providers/construction.ts @@ -114,6 +114,7 @@ export async function createProvider( paths !== undefined ? getForkCacheDirPath(paths) : undefined, enableTransientStorage: hardhatNetConfig.enableTransientStorage ?? false, + enableRip7212: hardhatNetConfig.enableRip7212 ?? false, }, { enabled: hardhatNetConfig.loggingEnabled, diff --git a/packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts b/packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts index 023abf35af..939ca6b3b7 100644 --- a/packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts +++ b/packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts @@ -12,12 +12,9 @@ import type { import type { EdrContext, Provider as EdrProviderT, - ExecutionResult, RawTrace, Response, SubscriptionEvent, - TracingMessage, - TracingStep, } from "@nomicfoundation/edr"; import { Common } from "@nomicfoundation/ethereumjs-common"; import chalk from "chalk"; @@ -123,6 +120,7 @@ interface HardhatNetworkProviderConfig { forkConfig?: ForkConfig; forkCachePath?: string; enableTransientStorage: boolean; + enableRip7212: boolean; } export function getNodeConfig( @@ -152,12 +150,6 @@ export function getNodeConfig( }; } -export interface RawTraceCallbacks { - onStep?: (messageTrace: TracingStep) => Promise; - onBeforeMessage?: (messageTrace: TracingMessage) => Promise; - onAfterMessage?: (messageTrace: ExecutionResult) => Promise; -} - class EdrProviderEventAdapter extends EventEmitter {} type CallOverrideCallback = ( @@ -176,15 +168,16 @@ export class EdrProviderWrapper // temporarily added to make smock work with HH+EDR private _callOverrideCallback?: CallOverrideCallback; + /** Used for internal stack trace tests. */ + private _vmTracer?: VMTracer; + private constructor( private readonly _provider: EdrProviderT, // we add this for backwards-compatibility with plugins like solidity-coverage private readonly _node: { _vm: MinimalEthereumJsVm; }, - private readonly _eventAdapter: EdrProviderEventAdapter, private readonly _vmTraceDecoder: VmTraceDecoder, - private readonly _rawTraceCallbacks: RawTraceCallbacks, // The common configuration for EthereumJS VM is not used by EDR, but tests expect it as part of the provider. private readonly _common: Common, tracingConfig?: TracingConfig @@ -199,7 +192,6 @@ export class EdrProviderWrapper public static async create( config: HardhatNetworkProviderConfig, loggerConfig: LoggerConfig, - rawTraceCallbacks: RawTraceCallbacks, tracingConfig?: TracingConfig ): Promise { const { Provider } = requireNapiRsModule( @@ -264,6 +256,7 @@ export class EdrProviderWrapper }), cacheDir: config.forkCachePath, coinbase: Buffer.from(coinbase.slice(2), "hex"), + enableRip7212: config.enableRip7212, fork, hardfork: ethereumsjsHardforkToEdrSpecId(hardforkName), genesisAccounts: config.genesisAccounts.map((account) => { @@ -289,10 +282,7 @@ export class EdrProviderWrapper }, { enable: loggerConfig.enabled, - decodeConsoleLogInputsCallback: (inputs: Buffer[]) => { - const consoleLogger = new ConsoleLogger(); - return consoleLogger.getDecodedLogs(inputs); - }, + decodeConsoleLogInputsCallback: ConsoleLogger.getDecodedLogs, getContractAndFunctionNameCallback: ( code: Buffer, calldata?: Buffer @@ -323,9 +313,7 @@ export class EdrProviderWrapper const wrapper = new EdrProviderWrapper( provider, minimalEthereumJsNode, - eventAdapter, vmTraceDecoder, - rawTraceCallbacks, common, tracingConfig ); @@ -371,9 +359,7 @@ export class EdrProviderWrapper const needsTraces = this._node._vm.evm.events.eventNames().length > 0 || this._node._vm.events.eventNames().length > 0 || - this._rawTraceCallbacks.onStep !== undefined || - this._rawTraceCallbacks.onAfterMessage !== undefined || - this._rawTraceCallbacks.onBeforeMessage !== undefined; + this._vmTracer !== undefined; if (needsTraces) { const rawTraces = responseObject.traces; @@ -394,9 +380,8 @@ export class EdrProviderWrapper edrTracingStepToMinimalInterpreterStep(traceItem) ); } - if (this._rawTraceCallbacks.onStep !== undefined) { - await this._rawTraceCallbacks.onStep(traceItem); - } + + this._vmTracer?.addStep(traceItem); } // afterMessage event else if ("executionResult" in traceItem) { @@ -406,11 +391,8 @@ export class EdrProviderWrapper edrTracingMessageResultToMinimalEVMResult(traceItem) ); } - if (this._rawTraceCallbacks.onAfterMessage !== undefined) { - await this._rawTraceCallbacks.onAfterMessage( - traceItem.executionResult - ); - } + + this._vmTracer?.addAfterMessage(traceItem.executionResult); } // beforeMessage event else { @@ -420,9 +402,8 @@ export class EdrProviderWrapper edrTracingMessageToMinimalMessage(traceItem) ); } - if (this._rawTraceCallbacks.onBeforeMessage !== undefined) { - await this._rawTraceCallbacks.onBeforeMessage(traceItem); - } + + this._vmTracer?.addBeforeMessage(traceItem); } } @@ -484,6 +465,15 @@ export class EdrProviderWrapper } } + /** + * Sets a `VMTracer` that observes EVM throughout requests. + * + * Used for internal stack traces integration tests. + */ + public setVmTracer(vmTracer?: VMTracer) { + this._vmTracer = vmTracer; + } + // temporarily added to make smock work with HH+EDR private _setCallOverrideCallback(callback: CallOverrideCallback) { this._callOverrideCallback = callback; @@ -583,16 +573,16 @@ export class EdrProviderWrapper private async _rawTraceToSolidityStackTrace( rawTrace: RawTrace ): Promise { - const vmTracer = new VMTracer(false); + const vmTracer = new VMTracer(); const trace = rawTrace.trace(); for (const traceItem of trace) { if ("pc" in traceItem) { - await vmTracer.addStep(traceItem); + vmTracer.addStep(traceItem); } else if ("executionResult" in traceItem) { - await vmTracer.addAfterMessage(traceItem.executionResult); + vmTracer.addAfterMessage(traceItem.executionResult); } else { - await vmTracer.addBeforeMessage(traceItem); + vmTracer.addBeforeMessage(traceItem); } } @@ -631,12 +621,17 @@ export async function createHardhatNetworkProvider( loggerConfig: LoggerConfig, artifacts?: Artifacts ): Promise { - return EdrProviderWrapper.create( + log("Making tracing config"); + const tracingConfig = await makeTracingConfig(artifacts); + log("Creating EDR provider"); + const provider = EdrProviderWrapper.create( hardhatNetworkProviderConfig, loggerConfig, - {}, - await makeTracingConfig(artifacts) + tracingConfig ); + log("EDR provider created"); + + return provider; } async function makeTracingConfig( diff --git a/packages/hardhat-core/src/internal/hardhat-network/provider/vm/exit.ts b/packages/hardhat-core/src/internal/hardhat-network/provider/vm/exit.ts index dcc5e11e29..c9fcc7cbea 100644 --- a/packages/hardhat-core/src/internal/hardhat-network/provider/vm/exit.ts +++ b/packages/hardhat-core/src/internal/hardhat-network/provider/vm/exit.ts @@ -24,6 +24,7 @@ export class Exit { case SuccessReason.Stop: case SuccessReason.Return: case SuccessReason.SelfDestruct: + case SuccessReason.EofReturnContract: return new Exit(ExitCode.SUCCESS); } @@ -91,25 +92,4 @@ export class Exit { const _exhaustiveCheck: never = this.kind; } - - public getEdrExceptionalHalt(): ExceptionalHalt { - const { ExceptionalHalt } = requireNapiRsModule( - "@nomicfoundation/edr" - ) as typeof import("@nomicfoundation/edr"); - - switch (this.kind) { - case ExitCode.OUT_OF_GAS: - return ExceptionalHalt.OutOfGas; - case ExitCode.INVALID_OPCODE: - return ExceptionalHalt.OpcodeNotFound; - case ExitCode.CODESIZE_EXCEEDS_MAXIMUM: - return ExceptionalHalt.CreateContractSizeLimit; - case ExitCode.CREATE_COLLISION: - return ExceptionalHalt.CreateCollision; - - default: - // eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error - throw new Error(`Unmatched exit code: ${this.kind}`); - } - } } diff --git a/packages/hardhat-core/src/internal/hardhat-network/stack-traces/consoleLogger.ts b/packages/hardhat-core/src/internal/hardhat-network/stack-traces/consoleLogger.ts index 5732150980..5938493780 100644 --- a/packages/hardhat-core/src/internal/hardhat-network/stack-traces/consoleLogger.ts +++ b/packages/hardhat-core/src/internal/hardhat-network/stack-traces/consoleLogger.ts @@ -42,113 +42,61 @@ import { Bytes8Ty, Bytes9Ty, BytesTy, - ConsoleLogs, Int256Ty, StringTy, Uint256Ty, + CONSOLE_LOG_SIGNATURES, } from "./logger"; -import { - EvmMessageTrace, - isCallTrace, - isEvmStep, - isPrecompileTrace, - MessageTrace, -} from "./message-trace"; -const CONSOLE_ADDRESS = "0x000000000000000000636F6e736F6c652e6c6f67"; // toHex("console.log") const REGISTER_SIZE = 32; -// eslint-disable-next-line @typescript-eslint/no-empty-interface -interface ConsoleLogArray extends Array {} - -export type ConsoleLogEntry = string | ConsoleLogArray; - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export type ConsoleLogs = ConsoleLogEntry[]; +/** The decoded string representation of the arguments supplied to console.log */ +export type ConsoleLogArgs = string[]; +export type ConsoleLogs = ConsoleLogArgs[]; export class ConsoleLogger { - private readonly _consoleLogs: { - [key: number]: string[]; - } = {}; - - constructor() { - this._consoleLogs = ConsoleLogs; - } - - public getLogMessages(maybeDecodedMessageTrace: MessageTrace): string[] { - return this.getExecutionLogs(maybeDecodedMessageTrace).map( - consoleLogToString - ); - } - - public getExecutionLogs( - maybeDecodedMessageTrace: MessageTrace - ): ConsoleLogs[] { - if (isPrecompileTrace(maybeDecodedMessageTrace)) { - return []; - } - - const logs: ConsoleLogs[] = []; - this._collectExecutionLogs(maybeDecodedMessageTrace, logs); - return logs; - } - - private _collectExecutionLogs(trace: EvmMessageTrace, logs: ConsoleLogs) { - for (const messageTrace of trace.steps) { - if (isEvmStep(messageTrace) || isPrecompileTrace(messageTrace)) { - continue; - } - - if ( - isCallTrace(messageTrace) && - bufferToHex(messageTrace.address) === CONSOLE_ADDRESS.toLowerCase() - ) { - const log = this._maybeConsoleLog(Buffer.from(messageTrace.calldata)); - if (log !== undefined) { - logs.push(log); - } - - continue; - } - - this._collectExecutionLogs(messageTrace, logs); - } - } - /** * Temporary code to print console.sol messages that come from EDR */ - public getDecodedLogs(messages: Buffer[]): string[] { + public static getDecodedLogs(messages: Buffer[]): string[] { const logs: string[] = []; for (const message of messages) { - const log = this._maybeConsoleLog(message); + const log = ConsoleLogger._maybeConsoleLog(message); if (log !== undefined) { - logs.push(consoleLogToString(log)); + logs.push(ConsoleLogger.format(log)); } } return logs; } - private _maybeConsoleLog(calldata: Buffer): ConsoleLogs | undefined { - const sig = bytesToInt(calldata.slice(0, 4)); + /** + * Returns a formatted string using the first argument as a `printf`-like + * format string which can contain zero or more format specifiers. + * + * If there are more arguments passed than the number of specifiers, the + * extra arguments are concatenated to the returned string, separated by spaces. + */ + public static format(args: ConsoleLogArgs = []): string { + return util.format(...args); + } + + private static _maybeConsoleLog( + calldata: Buffer + ): ConsoleLogArgs | undefined { + const selector = bytesToInt(calldata.slice(0, 4)); const parameters = calldata.slice(4); - const types = this._consoleLogs[sig]; - if (types === undefined) { + const argTypes = CONSOLE_LOG_SIGNATURES[selector]; + if (argTypes === undefined) { return; } - const consoleLogs = this._decode(parameters, types); + const decodedArgs = ConsoleLogger._decode(parameters, argTypes); - this._replaceNumberFormatSpecifiers(consoleLogs); - - return consoleLogs; - } - - private _replaceNumberFormatSpecifiers(consoleLogs: ConsoleLogs) { /** + * The first argument is interpreted as the format string, which may need adjusting. * Replace the occurrences of %d and %i with %s. This is necessary because if the arguments passed are numbers, * they could be too large to be formatted as a Number or an Integer, so it is safer to use a String. * %d and %i are replaced only if there is an odd number of % before the d or i. @@ -160,15 +108,18 @@ export class ConsoleLogger { * (? 0 && typeof consoleLogs[0] === "string") { - consoleLogs[0] = consoleLogs[0].replace( + if (decodedArgs.length > 0) { + decodedArgs[0] = decodedArgs[0].replace( /((? { const position: number = i * 32; switch (types[i]) { @@ -282,16 +233,3 @@ export class ConsoleLogger { }); } } - -export function consoleLogToString(log: ConsoleLogs): string { - if (log === undefined) { - return ""; - } - - // special case for console.log() - if (log.length === 0) { - return ""; - } - - return util.format(log[0], ...log.slice(1)); -} diff --git a/packages/hardhat-core/src/internal/hardhat-network/stack-traces/logger.ts b/packages/hardhat-core/src/internal/hardhat-network/stack-traces/logger.ts index ad3edc0b4f..1c26f4b4eb 100644 --- a/packages/hardhat-core/src/internal/hardhat-network/stack-traces/logger.ts +++ b/packages/hardhat-core/src/internal/hardhat-network/stack-traces/logger.ts @@ -1,6 +1,6 @@ // ------------------------------------ // This code was autogenerated using -// scripts/console-library-generator.js +// scripts/console-library-generator.ts // ------------------------------------ export const Int256Ty = "Int256"; @@ -42,9 +42,8 @@ export const Bytes30Ty = "Bytes30"; export const Bytes31Ty = "Bytes31"; export const Bytes32Ty = "Bytes32"; -// In order to optimize map lookup -// we'll store 4byte signature as int -export const ConsoleLogs = { +/** Maps from a 4-byte function selector to a signature (argument types) */ +export const CONSOLE_LOG_SIGNATURES: Record = { 1368866505: [], 760966329: [Int256Ty], 1309416733: [Int256Ty], diff --git a/packages/hardhat-core/src/internal/hardhat-network/stack-traces/message-trace.ts b/packages/hardhat-core/src/internal/hardhat-network/stack-traces/message-trace.ts index 0d602407e3..ddfe86ce4d 100644 --- a/packages/hardhat-core/src/internal/hardhat-network/stack-traces/message-trace.ts +++ b/packages/hardhat-core/src/internal/hardhat-network/stack-traces/message-trace.ts @@ -34,8 +34,6 @@ export interface PrecompileMessageTrace extends BaseMessageTrace { export interface BaseEvmMessageTrace extends BaseMessageTrace { code: Uint8Array; - value: bigint; - returnData: Uint8Array; steps: MessageTraceStep[]; bytecode?: Bytecode; // The following is just an optimization: When processing this traces it's useful to know ahead of diff --git a/packages/hardhat-core/src/internal/hardhat-network/stack-traces/vm-tracer.ts b/packages/hardhat-core/src/internal/hardhat-network/stack-traces/vm-tracer.ts index c01df0cb75..520573ab34 100644 --- a/packages/hardhat-core/src/internal/hardhat-network/stack-traces/vm-tracer.ts +++ b/packages/hardhat-core/src/internal/hardhat-network/stack-traces/vm-tracer.ts @@ -26,6 +26,10 @@ import { const DUMMY_RETURN_DATA = Buffer.from([]); const DUMMY_GAS_USED = 0n; +/** + * Consumes the incoming VM trace events, until an error occurs, to keep track + * of the last top level message trace/error. + */ export class VMTracer { public tracingSteps: TracingStep[] = []; @@ -33,7 +37,7 @@ export class VMTracer { private _lastError: Error | undefined; private _maxPrecompileNumber; - constructor(private readonly _throwErrors = true) { + constructor() { // TODO: temporarily hardcoded to remove the need of using ethereumjs' common and evm here this._maxPrecompileNumber = 10; } @@ -46,15 +50,11 @@ export class VMTracer { return this._lastError; } - public clearLastError() { - this._lastError = undefined; - } - private _shouldKeepTracing() { - return this._throwErrors || this._lastError === undefined; + return this._lastError === undefined; } - public async addBeforeMessage(message: TracingMessage) { + public addBeforeMessage(message: TracingMessage) { if (!this._shouldKeepTracing()) { return; } @@ -143,15 +143,11 @@ export class VMTracer { this._messageTraces.push(trace); } catch (error) { - if (this._throwErrors) { - throw error; - } else { - this._lastError = error as Error; - } + this._lastError = error as Error; } } - public async addStep(step: TracingStep) { + public addStep(step: TracingStep) { if (!this._shouldKeepTracing()) { return; } @@ -169,15 +165,11 @@ export class VMTracer { trace.steps.push({ pc: Number(step.pc) }); } catch (error) { - if (this._throwErrors) { - throw error; - } else { - this._lastError = error as Error; - } + this._lastError = error as Error; } } - public async addAfterMessage(result: ExecutionResult, haltOverride?: Exit) { + public addAfterMessage(result: ExecutionResult) { if (!this._shouldKeepTracing()) { return; } @@ -197,8 +189,7 @@ export class VMTracer { ).address; } } else if (isHaltResult(executionResult)) { - trace.exit = - haltOverride ?? Exit.fromEdrExceptionalHalt(executionResult.reason); + trace.exit = Exit.fromEdrExceptionalHalt(executionResult.reason); trace.returnData = Buffer.from([]); } else { @@ -211,11 +202,7 @@ export class VMTracer { this._messageTraces.pop(); } } catch (error) { - if (this._throwErrors) { - throw error; - } else { - this._lastError = error as Error; - } + this._lastError = error as Error; } } } diff --git a/packages/hardhat-core/src/types/config.ts b/packages/hardhat-core/src/types/config.ts index 3f53d4b3a1..027a3a5f06 100644 --- a/packages/hardhat-core/src/types/config.ts +++ b/packages/hardhat-core/src/types/config.ts @@ -58,6 +58,7 @@ export interface HardhatNetworkUserConfig { coinbase?: string; chains?: HardhatNetworkChainsUserConfig; enableTransientStorage?: boolean; + enableRip7212?: boolean; } export type HardhatNetworkAccountsUserConfig = @@ -155,6 +156,7 @@ export interface HardhatNetworkConfig { chains: HardhatNetworkChainsConfig; allowBlocksWithSameTimestamp?: boolean; enableTransientStorage?: boolean; + enableRip7212?: boolean; } export type HardhatNetworkAccountsConfig = diff --git a/packages/hardhat-core/test/internal/hardhat-network/helpers/useProvider.ts b/packages/hardhat-core/test/internal/hardhat-network/helpers/useProvider.ts index 0326f82062..5cff6fb3c1 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/helpers/useProvider.ts +++ b/packages/hardhat-core/test/internal/hardhat-network/helpers/useProvider.ts @@ -101,6 +101,7 @@ export function useProvider({ coinbase, allowBlocksWithSameTimestamp, enableTransientStorage: false, + enableRip7212: false, }, { enabled: loggerEnabled, diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/execution.ts b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/execution.ts index 980d0c47e3..e5f04af8c2 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/execution.ts +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/execution.ts @@ -29,7 +29,7 @@ const senderAddress = bytesToHex(privateToAddress(toBuffer(senderPrivateKey))); export async function instantiateProvider( loggerConfig: LoggerConfig, tracingConfig: TracingConfig -): Promise<[EdrProviderWrapper, VMTracer]> { +): Promise { const config = { hardfork: "shanghai", chainId: 1, @@ -53,28 +53,16 @@ export async function instantiateProvider( coinbase: "0x0000000000000000000000000000000000000000", initialBaseFeePerGas: 0, enableTransientStorage: false, + enableRip7212: false, }; - const vmTracer = new VMTracer(false); - const provider = await EdrProviderWrapper.create( config, loggerConfig, - { - onStep: async (step) => { - await vmTracer.addStep(step); - }, - onAfterMessage: async (message) => { - await vmTracer.addAfterMessage(message); - }, - onBeforeMessage: async (message) => { - await vmTracer.addBeforeMessage(message); - }, - }, tracingConfig ); - return [provider, vmTracer]; + return provider; } export function encodeConstructorParams( @@ -116,9 +104,11 @@ export interface TxData { export async function traceTransaction( provider: EdrProviderWrapper, - vmTracer: VMTracer, txData: TxData ): Promise { + const vmTracer = new VMTracer(); + provider.setVmTracer(vmTracer); + try { await provider.request({ method: "eth_sendTransaction", @@ -142,6 +132,6 @@ export async function traceTransaction( } return trace; } finally { - vmTracer.clearLastError(); + provider.setVmTracer(undefined); } } diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/call-message/multiple-modifiers-require/c.sol b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/call-message/multiple-modifiers-require/c.sol index 6282f797af..a9f4bb8309 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/call-message/multiple-modifiers-require/c.sol +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/call-message/multiple-modifiers-require/c.sol @@ -7,8 +7,11 @@ contract C { _; } - function test(bool b) m1(b) m2(b) public { - revert(); + function test(bool b, bool doRevert) m1(b) m2(b) public { + // always true, used to prevent optimizations + if (doRevert) { + revert(); + } } modifier m1(bool b) { diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/call-message/multiple-modifiers-require/test.json b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/call-message/multiple-modifiers-require/test.json index 2d9b4e2762..d8abf12a2e 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/call-message/multiple-modifiers-require/test.json +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/call-message/multiple-modifiers-require/test.json @@ -6,7 +6,7 @@ }, { "to": 0, - "params": [false], + "params": [false, true], "function": "test", "stackTrace": [ { diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/create-message/multiple-modifiers-require/c.sol b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/create-message/multiple-modifiers-require/c.sol index a45d7f6b03..105a451f4e 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/create-message/multiple-modifiers-require/c.sol +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/create-message/multiple-modifiers-require/c.sol @@ -7,8 +7,11 @@ contract C { _; } - constructor(bool b) m1(b) m2(b) public { - revert(); + constructor(bool b, bool doRevert) m1(b) m2(b) public { + // always true, used to prevent optimizations + if (doRevert) { + revert(); + } } modifier m1(bool b) { diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/create-message/multiple-modifiers-require/test.json b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/create-message/multiple-modifiers-require/test.json index 36009d9509..774b5eb3cf 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/create-message/multiple-modifiers-require/test.json +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/modifiers/create-message/multiple-modifiers-require/test.json @@ -3,7 +3,7 @@ { "file": "c.sol", "contract": "C", - "params": [false], + "params": [false, true], "stackTrace": [ { "type": "CALLSTACK_ENTRY", diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/between-statements/c.sol b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/between-statements/c.sol index ce3b1307cc..fedaa38a60 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/between-statements/c.sol +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/between-statements/c.sol @@ -7,7 +7,10 @@ contract C { receive() external payable { i += 1; - revert(); + // always true, used to prevent optimizations + if (msg.value == 0) { + revert(); + } j += 2; } diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/between-statements/test.json b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/between-statements/test.json index 821a712d08..3516625820 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/between-statements/test.json +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/between-statements/test.json @@ -14,7 +14,7 @@ "contract": "C", "file": "c.sol", "function": "", - "line": 10 + "line": 12 } } ] diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/no-other-statements/c.sol b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/no-other-statements/c.sol index a80dba7887..b6f9265376 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/no-other-statements/c.sol +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/no-other-statements/c.sol @@ -5,7 +5,10 @@ contract C { receive() external payable { - revert(); + // always true, used to prevent optimizations + if (msg.value == 0) { + revert(); + } } } diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/no-other-statements/test.json b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/no-other-statements/test.json index f0122a5fa3..821a712d08 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/no-other-statements/test.json +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/no-other-statements/test.json @@ -14,7 +14,7 @@ "contract": "C", "file": "c.sol", "function": "", - "line": 8 + "line": 10 } } ] diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-after/c.sol b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-after/c.sol index 7fff363cce..c98367efae 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-after/c.sol +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-after/c.sol @@ -7,7 +7,10 @@ contract C { receive() external payable { - revert(); + // always true, used to prevent optimizations + if (msg.value == 0) { + revert(); + } i += 1; } diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-after/test.json b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-after/test.json index 821a712d08..3516625820 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-after/test.json +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-after/test.json @@ -14,7 +14,7 @@ "contract": "C", "file": "c.sol", "function": "", - "line": 10 + "line": 12 } } ] diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-before/c.sol b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-before/c.sol index 6a24f9a97d..53c4715798 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-before/c.sol +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-before/c.sol @@ -7,7 +7,10 @@ contract C { receive() external payable { i += 1; - revert(); + // always true, used to prevent optimizations + if (msg.value == 0) { + revert(); + } } } diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-before/test.json b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-before/test.json index 821a712d08..3516625820 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-before/test.json +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/0_8/revert-without-message/revert-without-message/within-receive/statement-before/test.json @@ -14,7 +14,7 @@ "contract": "C", "file": "c.sol", "function": "", - "line": 10 + "line": 12 } } ] diff --git a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test.ts b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test.ts index e7b422b17b..1ce26f6ee3 100644 --- a/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test.ts +++ b/packages/hardhat-core/test/internal/hardhat-network/stack-traces/test.ts @@ -9,7 +9,7 @@ import { EdrProviderWrapper } from "../../../../src/internal/hardhat-network/pro import { ReturnData } from "../../../../src/internal/hardhat-network/provider/return-data"; import { ConsoleLogs, - consoleLogToString, + ConsoleLogger, } from "../../../../src/internal/hardhat-network/stack-traces/consoleLogger"; import { printMessageTrace, @@ -27,7 +27,6 @@ import { } from "../../../../src/internal/hardhat-network/stack-traces/solidity-stack-trace"; import { SolidityTracer } from "../../../../src/internal/hardhat-network/stack-traces/solidityTracer"; import { VmTraceDecoder } from "../../../../src/internal/hardhat-network/stack-traces/vm-trace-decoder"; -import { VMTracer } from "../../../../src/internal/hardhat-network/stack-traces/vm-tracer"; import { BuildInfo, CompilerInput, @@ -95,7 +94,7 @@ interface DeploymentTransaction { }; stackTrace?: StackFrameDescription[]; // No stack trace === the tx MUST be successful imports?: string[]; // Imports needed for successful compilation - consoleLogs?: ConsoleLogs[]; + consoleLogs?: ConsoleLogs; gas?: number; } @@ -110,7 +109,7 @@ interface CallTransaction { // The second one is with function and parms function?: string; // Default: no data params?: Array; // Default: no param - consoleLogs?: ConsoleLogs[]; + consoleLogs?: ConsoleLogs; gas?: number; } @@ -455,7 +454,7 @@ function compareStackTraces( assert.lengthOf(trace, description.length); } -function compareConsoleLogs(logs: string[], expectedLogs?: ConsoleLogs[]) { +function compareConsoleLogs(logs: string[], expectedLogs?: ConsoleLogs) { if (expectedLogs === undefined) { return; } @@ -464,7 +463,7 @@ function compareConsoleLogs(logs: string[], expectedLogs?: ConsoleLogs[]) { for (let i = 0; i < logs.length; i++) { const actual = logs[i]; - const expected = consoleLogToString(expectedLogs[i]); + const expected = ConsoleLogger.format(expectedLogs[i]); assert.equal(actual, expected); } @@ -498,7 +497,7 @@ async function runTest( const logger = new FakeModulesLogger(); const solidityTracer = new SolidityTracer(); - const [provider, vmTracer] = await instantiateProvider( + const provider = await instantiateProvider( { enabled: false, printLineFn: logger.printLineFn(), @@ -517,7 +516,6 @@ async function runTest( txIndex, tx, provider, - vmTracer, compilerOutput, txIndexToContract ); @@ -541,7 +539,6 @@ async function runTest( txIndex, tx, provider, - vmTracer, compilerOutput, contract! ); @@ -650,7 +647,6 @@ async function runDeploymentTransactionTest( txIndex: number, tx: DeploymentTransaction, provider: EdrProviderWrapper, - vmTracer: VMTracer, compilerOutput: CompilerOutput, txIndexToContract: Map ): Promise { @@ -682,7 +678,7 @@ async function runDeploymentTransactionTest( const data = Buffer.concat([deploymentBytecode, params]); - const trace = await traceTransaction(provider, vmTracer, { + const trace = await traceTransaction(provider, { value: tx.value !== undefined ? BigInt(tx.value) : undefined, data, gas: tx.gas !== undefined ? BigInt(tx.gas) : undefined, @@ -695,7 +691,6 @@ async function runCallTransactionTest( txIndex: number, tx: CallTransaction, provider: EdrProviderWrapper, - vmTracer: VMTracer, compilerOutput: CompilerOutput, contract: DeployedContract ): Promise { @@ -716,7 +711,7 @@ async function runCallTransactionTest( data = Buffer.from([]); } - const trace = await traceTransaction(provider, vmTracer, { + const trace = await traceTransaction(provider, { to: contract.address, value: tx.value !== undefined ? BigInt(tx.value) : undefined, data, diff --git a/packages/hardhat-core/tsconfig.json b/packages/hardhat-core/tsconfig.json index 8e923e7462..d85ee1d3b7 100644 --- a/packages/hardhat-core/tsconfig.json +++ b/packages/hardhat-core/tsconfig.json @@ -5,7 +5,7 @@ "rootDirs": ["./test"], "composite": true }, - "include": ["./test/**/*.ts"], + "include": ["./test/**/*.ts", "scripts"], "exclude": [ "./test/**/hardhat.config.ts", "./node_modules", diff --git a/packages/hardhat-network-helpers/test/helpers/reset.ts b/packages/hardhat-network-helpers/test/helpers/reset.ts index 50eb50781e..c312eea953 100644 --- a/packages/hardhat-network-helpers/test/helpers/reset.ts +++ b/packages/hardhat-network-helpers/test/helpers/reset.ts @@ -24,12 +24,12 @@ describe("resetWithoutFork", function () { const mainnetBlockNumber = await hh.time.latestBlock(); - // fork goerli - await hh.reset(INFURA_URL.replace("mainnet", "goerli")); + // fork sepolia + await hh.reset(INFURA_URL.replace("mainnet", "sepolia")); - const goerliBlockNumber = await hh.time.latestBlock(); + const sepoliaBlockNumber = await hh.time.latestBlock(); - const blockNumberDelta = Math.abs(mainnetBlockNumber - goerliBlockNumber); + const blockNumberDelta = Math.abs(mainnetBlockNumber - sepoliaBlockNumber); // check that there is a significative difference between the latest // block numbers of each chain diff --git a/packages/hardhat-verify/src/internal/tasks/etherscan.ts b/packages/hardhat-verify/src/internal/tasks/etherscan.ts index e238896ebf..1154f8abf7 100644 --- a/packages/hardhat-verify/src/internal/tasks/etherscan.ts +++ b/packages/hardhat-verify/src/internal/tasks/etherscan.ts @@ -27,6 +27,7 @@ import { UnexpectedNumberOfFilesError, VerificationAPIUnexpectedMessageError, ContractAlreadyVerifiedError, + NetworkRequestError, } from "../errors"; import { Etherscan } from "../etherscan"; import { Bytecode } from "../solc/bytecode"; @@ -102,7 +103,15 @@ subtask(TASK_VERIFY_ETHERSCAN) chainConfig ); - const isVerified = await etherscan.isVerified(address); + let isVerified = false; + try { + isVerified = await etherscan.isVerified(address); + } catch (err) { + if (!force || err instanceof NetworkRequestError) { + throw err; + } + // https://github.com/blockscout/blockscout/issues/9001 + } if (!force && isVerified) { const contractURL = etherscan.getContractUrl(address); console.log(`The contract ${address} has already been verified on the block explorer. If you're trying to verify a partially verified contract, please use the --force flag. diff --git a/packages/hardhat-viem/CHANGELOG.md b/packages/hardhat-viem/CHANGELOG.md index 3cc872bc91..2f0709086b 100644 --- a/packages/hardhat-viem/CHANGELOG.md +++ b/packages/hardhat-viem/CHANGELOG.md @@ -1,5 +1,16 @@ # @nomicfoundation/hardhat-viem +## 2.0.3 + +### Patch Changes + +- a8a6038: Added `ContractTypesMap` to simplify contract type imports (thanks @beepidibop!) +- Updated dependencies [cdf0160] +- Updated dependencies [3c66da2] +- Updated dependencies [9fadc22] +- Updated dependencies [095faa4] + - hardhat@2.22.6 + ## 2.0.2 ### Patch Changes diff --git a/packages/hardhat-viem/README.md b/packages/hardhat-viem/README.md index a35c39d1f6..30e8aac08a 100644 --- a/packages/hardhat-viem/README.md +++ b/packages/hardhat-viem/README.md @@ -248,6 +248,18 @@ This allows you to deploy a contract linked to the `ExampleLib` library at the a To deploy a contract, all libraries must be linked. An error will be thrown if any libraries are missing. +#### Using `ContractTypesMap` for easier contract type imports + +To simplify importing contract types in `hardhat-viem`, you can use the `ContractTypesMap`. This map contains the contract types of all contracts in your project, indexed by their names. + +```typescript +import { ContractTypesMap } from "hardhat/types/artifacts"; + +const contract: ContractTypesMap["ContractName"]; +``` + +This reduces the need for multiple imports and makes your code cleaner and easier to manage. + ## Usage There are no additional steps you need to take for this plugin to work. diff --git a/packages/hardhat-viem/package.json b/packages/hardhat-viem/package.json index 037527daf7..a147a404d0 100644 --- a/packages/hardhat-viem/package.json +++ b/packages/hardhat-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-viem", - "version": "2.0.2", + "version": "2.0.3", "description": "Hardhat plugin for viem", "homepage": "https://github.com/nomicfoundation/hardhat/tree/main/packages/hardhat-viem", "repository": "github:nomicfoundation/hardhat", diff --git a/packages/hardhat-viem/src/internal/tasks.ts b/packages/hardhat-viem/src/internal/tasks.ts index 7e053a051b..a6bb4f2980 100644 --- a/packages/hardhat-viem/src/internal/tasks.ts +++ b/packages/hardhat-viem/src/internal/tasks.ts @@ -164,6 +164,12 @@ declare module "hardhat/types/artifacts" { .map((name) => `${name}: never;`) .join("\n ")} } + + interface ContractTypesMap { + ${Array.from(duplicateContractNames) + .map((name) => `${name}: never;`) + .join("\n ")} + } } `; } @@ -260,6 +266,7 @@ function generateArtifactsDefinition( return `${AUTOGENERATED_FILE_PREFACE} import "hardhat/types/artifacts"; +import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; ${contractTypeData .map((ctd) => `import { ${ctd.typeName} } from "./${ctd.contractName}";`) @@ -274,6 +281,21 @@ declare module "hardhat/types/artifacts" { .map((ctd) => `["${ctd.fqn}"]: ${ctd.typeName};`) .join("\n ")} } + + interface ContractTypesMap { + ${contractTypeData + .map( + (ctd) => + `["${ctd.contractName}"]: GetContractReturnType<${ctd.typeName}["abi"]>;` + ) + .join("\n ")} + ${contractTypeData + .map( + (ctd) => + `["${ctd.fqn}"]: GetContractReturnType<${ctd.typeName}["abi"]>;` + ) + .join("\n ")} + } } `; } diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/artifacts.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/artifacts.d.ts index eeda088124..c01f03bcd3 100644 --- a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/artifacts.d.ts +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/artifacts.d.ts @@ -9,4 +9,8 @@ declare module "hardhat/types/artifacts" { interface ArtifactsMap { B: never; } + + interface ContractTypesMap { + B: never; + } } diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/artifacts.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/artifacts.d.ts index 18aea5c6b7..270ec057ef 100644 --- a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/artifacts.d.ts +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/artifacts.d.ts @@ -4,6 +4,7 @@ // eslint-disable import "hardhat/types/artifacts"; +import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; import { A$Type } from "./A"; import { B$Type } from "./B"; @@ -15,4 +16,11 @@ declare module "hardhat/types/artifacts" { ["contracts/A.sol:A"]: A$Type; ["contracts/A.sol:B"]: B$Type; } + + interface ContractTypesMap { + ["A"]: GetContractReturnType; + ["B"]: GetContractReturnType; + ["contracts/A.sol:A"]: GetContractReturnType; + ["contracts/A.sol:B"]: GetContractReturnType; + } } diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/artifacts.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/artifacts.d.ts index 4994bfede7..1171b90f27 100644 --- a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/artifacts.d.ts +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/artifacts.d.ts @@ -4,6 +4,7 @@ // eslint-disable import "hardhat/types/artifacts"; +import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; import { B$Type } from "./B"; import { C$Type } from "./C"; @@ -15,4 +16,11 @@ declare module "hardhat/types/artifacts" { ["contracts/C.sol:B"]: B$Type; ["contracts/C.sol:C"]: C$Type; } + + interface ContractTypesMap { + ["B"]: GetContractReturnType; + ["C"]: GetContractReturnType; + ["contracts/C.sol:B"]: GetContractReturnType; + ["contracts/C.sol:C"]: GetContractReturnType; + } } diff --git a/packages/hardhat-vyper/CHANGELOG.md b/packages/hardhat-vyper/CHANGELOG.md index 65d28467ab..adf3b85d7c 100644 --- a/packages/hardhat-vyper/CHANGELOG.md +++ b/packages/hardhat-vyper/CHANGELOG.md @@ -1,5 +1,11 @@ # @nomiclabs/hardhat-vyper +## 3.0.7 + +### Patch Changes + +- 1f9f8e0: Support Vyper 0.4.0's new output identifiers (Thanks, @kiriyaga-txfusion!) + ## 3.0.6 ### Patch Changes diff --git a/packages/hardhat-vyper/package.json b/packages/hardhat-vyper/package.json index dddca23653..ebb6d83849 100644 --- a/packages/hardhat-vyper/package.json +++ b/packages/hardhat-vyper/package.json @@ -1,6 +1,6 @@ { "name": "@nomiclabs/hardhat-vyper", - "version": "3.0.6", + "version": "3.0.7", "description": "Hardhat plugin to develop smart contracts in Vyper", "repository": "github:nomiclabs/hardhat", "homepage": "https://github.com/nomiclabs/hardhat/tree/main/packages/hardhat-vyper", diff --git a/packages/hardhat-vyper/src/constants.ts b/packages/hardhat-vyper/src/constants.ts index a6093d25c8..f7b9dfffcc 100644 --- a/packages/hardhat-vyper/src/constants.ts +++ b/packages/hardhat-vyper/src/constants.ts @@ -3,3 +3,4 @@ export const ARTIFACT_FORMAT_VERSION = "hh-vyper-artifact-1"; export const DEBUG_NAMESPACE = "hardhat:plugin:vyper"; export const CACHE_FORMAT_VERSION = "hh-vy-cache-1"; export const VYPER_FILES_CACHE_FILENAME = "vyper-files-cache.json"; +export const OUTPUT_BREAKABLE_VYPER_VERSION = "0.4.0"; diff --git a/packages/hardhat-vyper/src/index.ts b/packages/hardhat-vyper/src/index.ts index e55c129cda..002fef7a36 100644 --- a/packages/hardhat-vyper/src/index.ts +++ b/packages/hardhat-vyper/src/index.ts @@ -23,7 +23,10 @@ import { TASK_COMPILE_VYPER_LOG_DOWNLOAD_COMPILER_END, TASK_COMPILE_VYPER_LOG_COMPILATION_RESULT, } from "./task-names"; -import { DEFAULT_VYPER_VERSION } from "./constants"; +import { + DEFAULT_VYPER_VERSION, + OUTPUT_BREAKABLE_VYPER_VERSION, +} from "./constants"; import { Compiler } from "./compiler"; import { CompilerDownloader } from "./downloader"; import { @@ -344,10 +347,24 @@ ${list}` } ); - for (const [sourceName, output] of Object.entries(contracts)) { + const { localPathToSourceName } = await import( + "hardhat/utils/source-names" + ); + + for (const [contractSourceIdentifier, output] of Object.entries( + contracts + )) { + const sourceName = semver.gte( + vyperVersion, + OUTPUT_BREAKABLE_VYPER_VERSION + ) + ? await localPathToSourceName( + config.paths.root, + contractSourceIdentifier + ) + : contractSourceIdentifier; const artifact = getArtifactFromVyperOutput(sourceName, output); await artifacts.saveArtifactAndDebugFile(artifact); - const file = files.find((f) => f.sourceName === sourceName); assertPluginInvariant( file !== undefined, diff --git a/packages/hardhat-vyper/test/fixture-projects/compilation-with-vyper-output-breakable-version/contracts/A.vy b/packages/hardhat-vyper/test/fixture-projects/compilation-with-vyper-output-breakable-version/contracts/A.vy new file mode 100644 index 0000000000..365dbc66db --- /dev/null +++ b/packages/hardhat-vyper/test/fixture-projects/compilation-with-vyper-output-breakable-version/contracts/A.vy @@ -0,0 +1,8 @@ +# pragma version ~=0.4.0 + +IMMUTABLE_1: public(immutable(String[4])) + +@deploy +@payable +def __init__(): + IMMUTABLE_1 = "A" \ No newline at end of file diff --git a/packages/hardhat-vyper/test/fixture-projects/compilation-with-vyper-output-breakable-version/contracts/B.vy b/packages/hardhat-vyper/test/fixture-projects/compilation-with-vyper-output-breakable-version/contracts/B.vy new file mode 100644 index 0000000000..835f229d0a --- /dev/null +++ b/packages/hardhat-vyper/test/fixture-projects/compilation-with-vyper-output-breakable-version/contracts/B.vy @@ -0,0 +1,8 @@ +# pragma version ~=0.4.0 + +IMMUTABLE_1: public(immutable(String[4])) + +@deploy +@payable +def __init__(): + IMMUTABLE_1 = "B" diff --git a/packages/hardhat-vyper/test/fixture-projects/compilation-with-vyper-output-breakable-version/hardhat.config.js b/packages/hardhat-vyper/test/fixture-projects/compilation-with-vyper-output-breakable-version/hardhat.config.js new file mode 100644 index 0000000000..77ced97a60 --- /dev/null +++ b/packages/hardhat-vyper/test/fixture-projects/compilation-with-vyper-output-breakable-version/hardhat.config.js @@ -0,0 +1,15 @@ +require("../../../src/index"); + +module.exports = { + vyper: { + compilers: [ + { + version: "0.4.0", + settings: { + evmVersion: "paris", + optimize: "gas", + }, + }, + ], + }, +}; diff --git a/packages/hardhat-vyper/test/tests.ts b/packages/hardhat-vyper/test/tests.ts index 82b916ab19..13116203a5 100644 --- a/packages/hardhat-vyper/test/tests.ts +++ b/packages/hardhat-vyper/test/tests.ts @@ -305,4 +305,16 @@ describe("Vyper plugin", function () { ); }); }); + + describe("compile project with different ouput identifiers returned from the vyper compiler", function () { + useFixtureProject("compilation-with-vyper-output-breakable-version"); + useEnvironment(); + + it("Should successfully compile the contracts for versions >= 0.4.0", async function () { + await this.env.run(TASK_COMPILE); + + assert.equal(this.env.artifacts.readArtifactSync("A").contractName, "A"); + assert.equal(this.env.artifacts.readArtifactSync("B").contractName, "B"); + }); + }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d9251805f8..6f19284bb4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -201,8 +201,8 @@ importers: specifier: ^4.0.0 version: 4.0.1 '@nomicfoundation/edr': - specifier: ^0.4.0 - version: 0.4.0 + specifier: ^0.5.0 + version: 0.5.0 '@nomicfoundation/ethereumjs-common': specifier: 4.0.4 version: 4.0.4 @@ -303,8 +303,8 @@ importers: specifier: ^6.3.0 version: 6.3.1 solc: - specifier: 0.7.3 - version: 0.7.3(debug@4.3.4) + specifier: 0.8.26 + version: 0.8.26(debug@4.3.4) source-map-support: specifier: ^0.5.13 version: 0.5.21 @@ -2332,36 +2332,36 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nomicfoundation/edr-darwin-arm64@0.4.0': - resolution: {integrity: sha512-7+rraFk9tCqvfemv9Ita5vTlSBAeO/S5aDKOgGRgYt0JEKZlrX161nDW6UfzMPxWl9GOLEDUzCEaYuNmXseUlg==} + '@nomicfoundation/edr-darwin-arm64@0.5.0': + resolution: {integrity: sha512-G6OX/PESdfU4ZOyJ4MDh4eevW0wt2mduuxA+thXtTcStOiQTtPuV205h4kLOR5wRB1Zz6Zy0LedTMax7TzOtGw==} engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-x64@0.4.0': - resolution: {integrity: sha512-+Hrc0mP9L6vhICJSfyGo/2taOToy1AIzVZawO3lU8Lf7oDQXfhQ4UkZnkWAs9SVu1eUwHUGGGE0qB8644piYgg==} + '@nomicfoundation/edr-darwin-x64@0.5.0': + resolution: {integrity: sha512-fI7uHfHqPtdPZjkFUTpotc/F5gGv41ws+jSZy9+2AR9RDMOAIXMEArOx9rGLBcevWu8SFnyH/l/77kG/5FXbDw==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-gnu@0.4.0': - resolution: {integrity: sha512-4HUDMchNClQrVRfVTqBeSX92hM/3khCgpZkXP52qrnJPqgbdCxosOehlQYZ65wu0b/kaaZSyvACgvCLSQ5oSzQ==} + '@nomicfoundation/edr-linux-arm64-gnu@0.5.0': + resolution: {integrity: sha512-eMC3sWPkBZILg2/YB4Xv6IR0nggCLt5hS8K8jjHeGEeUs9pf8poBF2Oy+G4lSu0YLLjexGzHypz9/P+pIuxZHw==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-musl@0.4.0': - resolution: {integrity: sha512-D4J935ZRL8xfnP3zIFlCI9jXInJ0loDUkCTLeCEbOf2uuDumWDghKNQlF1itUS+EHaR1pFVBbuwqq8hVK0dASg==} + '@nomicfoundation/edr-linux-arm64-musl@0.5.0': + resolution: {integrity: sha512-yPK0tKjYRxe5ktggFr8aBHH0DCI9uafuaD8QuzyrQAfSf/m/ebTdgthROdbYp6eRk5mJyfAQT/45fM3tnlYsWw==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-gnu@0.4.0': - resolution: {integrity: sha512-6x7HPy+uN5Cb9N77e2XMmT6+QSJ+7mRbHnhkGJ8jm4cZvWuj2Io7npOaeHQ3YHK+TiQpTnlbkjoOIpEwpY3XZA==} + '@nomicfoundation/edr-linux-x64-gnu@0.5.0': + resolution: {integrity: sha512-Hds8CRYi4DEyuErjcwUNSvNpMzmOYUihW4qYCoKgSBUVS5saX1PyPYvFYuYpeU5J8/T2iMk6yAPVLCxtKbgnKg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.4.0': - resolution: {integrity: sha512-3HFIJSXgyubOiaN4MWGXx2xhTnhwlJk0PiSYNf9+L/fjBtcRkb2nM910ZJHTvqCb6OT98cUnaKuAYdXIW2amgw==} + '@nomicfoundation/edr-linux-x64-musl@0.5.0': + resolution: {integrity: sha512-1hXMDSzdyh5ojwO3ZSRbt7t5KKYycGUlFdC3lgJRZ7gStB8xjb7RA3hZn2csn9OydS950Ne4nh+puNq91iXApw==} engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.4.0': - resolution: {integrity: sha512-CP4GsllEfXEz+lidcGYxKe5rDJ60TM5/blB5z/04ELVvw6/CK9eLcYeku7HV0jvV7VE6dADYKSdQyUkvd0El+A==} + '@nomicfoundation/edr-win32-x64-msvc@0.5.0': + resolution: {integrity: sha512-CFagD423400xXkRmACIR13FoocN48qi4ogRnuFQIvBDtEE3aMEajfFj4bycmQQDqnqChsZy/jwD4OxbX6oaNJw==} engines: {node: '>= 18'} - '@nomicfoundation/edr@0.4.0': - resolution: {integrity: sha512-T96DMSogO8TCdbKKctvxfsDljbhFOUKWc9fHJhSeUh71EEho2qR4951LKQF7t7UWEzguVYh/idQr5L/E3QeaMw==} + '@nomicfoundation/edr@0.5.0': + resolution: {integrity: sha512-nAUyjGhxntXje/1AkDX9POfH+pqUxdi4XHzIhaf/dJYs7fgAFxL3STBK1OYcA3LR7vtiylLHMz7wxjqLzlLGKg==} engines: {node: '>= 18'} '@nomicfoundation/ethereumjs-block@5.0.4': @@ -3532,13 +3532,14 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@3.0.2: - resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} - commander@6.2.1: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -6214,9 +6215,9 @@ packages: resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} hasBin: true - solc@0.7.3: - resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} - engines: {node: '>=8.0.0'} + solc@0.8.26: + resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} + engines: {node: '>=10.0.0'} hasBin: true solhint@3.6.2: @@ -8149,29 +8150,29 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@nomicfoundation/edr-darwin-arm64@0.4.0': {} + '@nomicfoundation/edr-darwin-arm64@0.5.0': {} - '@nomicfoundation/edr-darwin-x64@0.4.0': {} + '@nomicfoundation/edr-darwin-x64@0.5.0': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.4.0': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.5.0': {} - '@nomicfoundation/edr-linux-arm64-musl@0.4.0': {} + '@nomicfoundation/edr-linux-arm64-musl@0.5.0': {} - '@nomicfoundation/edr-linux-x64-gnu@0.4.0': {} + '@nomicfoundation/edr-linux-x64-gnu@0.5.0': {} - '@nomicfoundation/edr-linux-x64-musl@0.4.0': {} + '@nomicfoundation/edr-linux-x64-musl@0.5.0': {} - '@nomicfoundation/edr-win32-x64-msvc@0.4.0': {} + '@nomicfoundation/edr-win32-x64-msvc@0.5.0': {} - '@nomicfoundation/edr@0.4.0': + '@nomicfoundation/edr@0.5.0': dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.4.0 - '@nomicfoundation/edr-darwin-x64': 0.4.0 - '@nomicfoundation/edr-linux-arm64-gnu': 0.4.0 - '@nomicfoundation/edr-linux-arm64-musl': 0.4.0 - '@nomicfoundation/edr-linux-x64-gnu': 0.4.0 - '@nomicfoundation/edr-linux-x64-musl': 0.4.0 - '@nomicfoundation/edr-win32-x64-msvc': 0.4.0 + '@nomicfoundation/edr-darwin-arm64': 0.5.0 + '@nomicfoundation/edr-darwin-x64': 0.5.0 + '@nomicfoundation/edr-linux-arm64-gnu': 0.5.0 + '@nomicfoundation/edr-linux-arm64-musl': 0.5.0 + '@nomicfoundation/edr-linux-x64-gnu': 0.5.0 + '@nomicfoundation/edr-linux-x64-musl': 0.5.0 + '@nomicfoundation/edr-win32-x64-msvc': 0.5.0 '@nomicfoundation/ethereumjs-block@5.0.4': dependencies: @@ -9531,10 +9532,10 @@ snapshots: commander@2.20.3: {} - commander@3.0.2: {} - commander@6.2.1: {} + commander@8.3.0: {} + commondir@1.0.1: {} concat-map@0.0.1: {} @@ -12603,15 +12604,13 @@ snapshots: semver: 5.7.2 yargs: 4.8.1 - solc@0.7.3(debug@4.3.4): + solc@0.8.26(debug@4.3.4): dependencies: command-exists: 1.2.9 - commander: 3.0.2 + commander: 8.3.0 follow-redirects: 1.15.6(debug@4.3.4) - fs-extra: 0.30.0 js-sha3: 0.8.0 memorystream: 0.3.1 - require-from-string: 2.0.2 semver: 5.7.2 tmp: 0.0.33 transitivePeerDependencies: