hardhat 2.19.4 → 2.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/builtin-tasks/compile.js +11 -2
- package/builtin-tasks/compile.js.map +1 -1
- package/builtin-tasks/node.js +3 -3
- package/builtin-tasks/node.js.map +1 -1
- package/internal/cli/analytics.d.ts.map +1 -1
- package/internal/cli/analytics.js +2 -1
- package/internal/cli/analytics.js.map +1 -1
- package/internal/cli/cli.js +33 -0
- package/internal/cli/cli.js.map +1 -1
- package/internal/cli/project-creation.d.ts +1 -1
- package/internal/cli/project-creation.js +4 -7
- package/internal/cli/project-creation.js.map +1 -1
- package/internal/cli/version-notifier.d.ts +2 -0
- package/internal/cli/version-notifier.d.ts.map +1 -0
- package/internal/cli/version-notifier.js +217 -0
- package/internal/cli/version-notifier.js.map +1 -0
- package/internal/constants.d.ts.map +1 -1
- package/internal/constants.js +1 -0
- package/internal/constants.js.map +1 -1
- package/internal/core/config/config-loading.d.ts.map +1 -1
- package/internal/core/config/config-loading.js +3 -3
- package/internal/core/config/config-loading.js.map +1 -1
- package/internal/core/config/config-resolution.d.ts.map +1 -1
- package/internal/core/config/config-resolution.js +18 -6
- package/internal/core/config/config-resolution.js.map +1 -1
- package/internal/core/config/config-validation.d.ts +2 -2
- package/internal/core/config/config-validation.d.ts.map +1 -1
- package/internal/core/config/config-validation.js +12 -2
- package/internal/core/config/config-validation.js.map +1 -1
- package/internal/core/config/default-config.d.ts.map +1 -1
- package/internal/core/config/default-config.js +11 -0
- package/internal/core/config/default-config.js.map +1 -1
- package/internal/core/jsonrpc/types/base-types.d.ts +1 -1
- package/internal/core/jsonrpc/types/base-types.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/base-types.js +7 -5
- package/internal/core/jsonrpc/types/base-types.js.map +1 -1
- package/internal/core/jsonrpc/types/input/callRequest.d.ts +2 -0
- package/internal/core/jsonrpc/types/input/callRequest.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/input/callRequest.js +2 -0
- package/internal/core/jsonrpc/types/input/callRequest.js.map +1 -1
- package/internal/core/jsonrpc/types/input/transactionRequest.d.ts +4 -0
- package/internal/core/jsonrpc/types/input/transactionRequest.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/input/transactionRequest.js +2 -0
- package/internal/core/jsonrpc/types/input/transactionRequest.js.map +1 -1
- package/internal/core/jsonrpc/types/output/block.d.ts +6 -0
- package/internal/core/jsonrpc/types/output/block.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/output/block.js +3 -0
- package/internal/core/jsonrpc/types/output/block.js.map +1 -1
- package/internal/core/providers/accounts.d.ts.map +1 -1
- package/internal/core/providers/accounts.js +10 -10
- package/internal/core/providers/accounts.js.map +1 -1
- package/internal/core/providers/gas-providers.d.ts.map +1 -1
- package/internal/core/providers/gas-providers.js +7 -0
- package/internal/core/providers/gas-providers.js.map +1 -1
- package/internal/core/providers/util.js +2 -2
- package/internal/core/providers/util.js.map +1 -1
- package/internal/hardhat-network/jsonrpc/client.d.ts +3 -3
- package/internal/hardhat-network/jsonrpc/client.d.ts.map +1 -1
- package/internal/hardhat-network/jsonrpc/client.js +9 -9
- package/internal/hardhat-network/jsonrpc/client.js.map +1 -1
- package/internal/hardhat-network/provider/BlockchainData.d.ts +5 -5
- package/internal/hardhat-network/provider/BlockchainData.d.ts.map +1 -1
- package/internal/hardhat-network/provider/BlockchainData.js +10 -10
- package/internal/hardhat-network/provider/BlockchainData.js.map +1 -1
- package/internal/hardhat-network/provider/HardhatBlockchain.d.ts +7 -0
- package/internal/hardhat-network/provider/HardhatBlockchain.d.ts.map +1 -1
- package/internal/hardhat-network/provider/HardhatBlockchain.js +14 -2
- package/internal/hardhat-network/provider/HardhatBlockchain.js.map +1 -1
- package/internal/hardhat-network/provider/TxPool.d.ts +2 -3
- package/internal/hardhat-network/provider/TxPool.d.ts.map +1 -1
- package/internal/hardhat-network/provider/TxPool.js +16 -16
- package/internal/hardhat-network/provider/TxPool.js.map +1 -1
- package/internal/hardhat-network/provider/ethereumjs-workarounds.js +1 -1
- package/internal/hardhat-network/provider/ethereumjs-workarounds.js.map +1 -1
- package/internal/hardhat-network/provider/filter.d.ts +5 -6
- package/internal/hardhat-network/provider/filter.d.ts.map +1 -1
- package/internal/hardhat-network/provider/filter.js +2 -2
- package/internal/hardhat-network/provider/filter.js.map +1 -1
- package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts +7 -0
- package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts.map +1 -1
- package/internal/hardhat-network/provider/fork/ForkBlockchain.js +21 -4
- package/internal/hardhat-network/provider/fork/ForkBlockchain.js.map +1 -1
- package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts +16 -9
- package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts.map +1 -1
- package/internal/hardhat-network/provider/fork/ForkStateManager.js +42 -25
- package/internal/hardhat-network/provider/fork/ForkStateManager.js.map +1 -1
- package/internal/hardhat-network/provider/fork/rpcToBlockData.d.ts.map +1 -1
- package/internal/hardhat-network/provider/fork/rpcToBlockData.js +3 -0
- package/internal/hardhat-network/provider/fork/rpcToBlockData.js.map +1 -1
- package/internal/hardhat-network/provider/fork/rpcToTxData.d.ts +2 -2
- package/internal/hardhat-network/provider/fork/rpcToTxData.d.ts.map +1 -1
- package/internal/hardhat-network/provider/modules/base.js +4 -4
- package/internal/hardhat-network/provider/modules/base.js.map +1 -1
- package/internal/hardhat-network/provider/modules/eth.d.ts.map +1 -1
- package/internal/hardhat-network/provider/modules/eth.js +16 -9
- package/internal/hardhat-network/provider/modules/eth.js.map +1 -1
- package/internal/hardhat-network/provider/modules/logger.d.ts +1 -1
- package/internal/hardhat-network/provider/modules/logger.d.ts.map +1 -1
- package/internal/hardhat-network/provider/modules/logger.js +17 -17
- package/internal/hardhat-network/provider/modules/logger.js.map +1 -1
- package/internal/hardhat-network/provider/node-types.d.ts +17 -13
- package/internal/hardhat-network/provider/node-types.d.ts.map +1 -1
- package/internal/hardhat-network/provider/node.d.ts +6 -2
- package/internal/hardhat-network/provider/node.d.ts.map +1 -1
- package/internal/hardhat-network/provider/node.js +148 -79
- package/internal/hardhat-network/provider/node.js.map +1 -1
- package/internal/hardhat-network/provider/output.d.ts +3 -0
- package/internal/hardhat-network/provider/output.d.ts.map +1 -1
- package/internal/hardhat-network/provider/output.js +23 -9
- package/internal/hardhat-network/provider/output.js.map +1 -1
- package/internal/hardhat-network/provider/return-data.d.ts +3 -4
- package/internal/hardhat-network/provider/return-data.d.ts.map +1 -1
- package/internal/hardhat-network/provider/return-data.js +4 -3
- package/internal/hardhat-network/provider/return-data.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts +8 -10
- package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js +9 -9
- package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts +8 -10
- package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js +9 -9
- package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts +9 -10
- package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js +6 -7
- package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts +5 -6
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.js +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.d.ts +4 -5
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.js +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.d.ts +7 -8
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.js +2 -2
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.d.ts +7 -8
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.js +2 -2
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.js.map +1 -1
- package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts +4 -5
- package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/makeAccount.js +1 -1
- package/internal/hardhat-network/provider/utils/makeAccount.js.map +1 -1
- package/internal/hardhat-network/provider/utils/makeCommon.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/makeCommon.js +5 -3
- package/internal/hardhat-network/provider/utils/makeCommon.js.map +1 -1
- package/internal/hardhat-network/provider/utils/makeFakeSignature.d.ts +2 -2
- package/internal/hardhat-network/provider/utils/makeFakeSignature.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/makeFakeSignature.js +15 -1
- package/internal/hardhat-network/provider/utils/makeFakeSignature.js.map +1 -1
- package/internal/hardhat-network/provider/utils/makeStateTrie.js +2 -2
- package/internal/hardhat-network/provider/utils/makeStateTrie.js.map +1 -1
- package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts +1 -3
- package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/putGenesisBlock.js +6 -2
- package/internal/hardhat-network/provider/utils/putGenesisBlock.js.map +1 -1
- package/internal/hardhat-network/provider/utils/random.d.ts +3 -3
- package/internal/hardhat-network/provider/utils/random.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/random.js +2 -2
- package/internal/hardhat-network/provider/utils/random.js.map +1 -1
- package/internal/hardhat-network/stack-traces/consoleLogger.js +42 -44
- package/internal/hardhat-network/stack-traces/consoleLogger.js.map +1 -1
- package/internal/hardhat-network/stack-traces/constants.d.ts +1 -1
- package/internal/hardhat-network/stack-traces/constants.js +1 -1
- package/internal/hardhat-network/stack-traces/contracts-identifier.js +1 -1
- package/internal/hardhat-network/stack-traces/contracts-identifier.js.map +1 -1
- package/internal/hardhat-network/stack-traces/debug.js +12 -12
- package/internal/hardhat-network/stack-traces/debug.js.map +1 -1
- package/internal/hardhat-network/stack-traces/error-inferrer.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/error-inferrer.js +5 -4
- package/internal/hardhat-network/stack-traces/error-inferrer.js.map +1 -1
- package/internal/hardhat-network/stack-traces/library-utils.d.ts +4 -4
- package/internal/hardhat-network/stack-traces/library-utils.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/library-utils.js.map +1 -1
- package/internal/hardhat-network/stack-traces/message-trace.d.ts +8 -9
- package/internal/hardhat-network/stack-traces/message-trace.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/model.d.ts +5 -5
- package/internal/hardhat-network/stack-traces/model.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/model.js +5 -5
- package/internal/hardhat-network/stack-traces/model.js.map +1 -1
- package/internal/hardhat-network/stack-traces/panic-errors.js +1 -1
- package/internal/hardhat-network/stack-traces/panic-errors.js.map +1 -1
- package/internal/hardhat-network/stack-traces/solidity-errors.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/solidity-errors.js +3 -3
- package/internal/hardhat-network/stack-traces/solidity-errors.js.map +1 -1
- package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts +2 -3
- package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/solidityTracer.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/solidityTracer.js +3 -2
- package/internal/hardhat-network/stack-traces/solidityTracer.js.map +1 -1
- package/internal/hardhat-network/stack-traces/vm-debug-tracer.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/vm-debug-tracer.js +34 -28
- package/internal/hardhat-network/stack-traces/vm-debug-tracer.js.map +1 -1
- package/internal/hardhat-network/stack-traces/vm-tracer.d.ts +1 -2
- package/internal/hardhat-network/stack-traces/vm-tracer.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/vm-tracer.js +9 -9
- package/internal/hardhat-network/stack-traces/vm-tracer.js.map +1 -1
- package/internal/solidity/compiler/downloader.d.ts.map +1 -1
- package/internal/solidity/compiler/downloader.js +4 -4
- package/internal/solidity/compiler/downloader.js.map +1 -1
- package/internal/solidity/compiler/index.d.ts +2 -1
- package/internal/solidity/compiler/index.d.ts.map +1 -1
- package/internal/solidity/compiler/index.js +25 -2
- package/internal/solidity/compiler/index.js.map +1 -1
- package/internal/solidity/compiler/solc-info.d.ts.map +1 -1
- package/internal/solidity/compiler/solc-info.js +1 -0
- package/internal/solidity/compiler/solc-info.js.map +1 -1
- package/internal/util/abi-helpers.d.ts +2 -3
- package/internal/util/abi-helpers.d.ts.map +1 -1
- package/internal/util/abi-helpers.js.map +1 -1
- package/internal/util/bigint.d.ts +1 -2
- package/internal/util/bigint.d.ts.map +1 -1
- package/internal/util/bigint.js +2 -2
- package/internal/util/bigint.js.map +1 -1
- package/internal/util/fs-utils.d.ts +1 -1
- package/internal/util/fs-utils.js +1 -1
- package/internal/util/hardforks.d.ts +2 -1
- package/internal/util/hardforks.d.ts.map +1 -1
- package/internal/util/hardforks.js +2 -0
- package/internal/util/hardforks.js.map +1 -1
- package/internal/util/keccak.d.ts +1 -2
- package/internal/util/keccak.d.ts.map +1 -1
- package/internal/util/keccak.js +1 -1
- package/internal/util/keccak.js.map +1 -1
- package/internal/util/multi-process-mutex.d.ts +12 -0
- package/internal/util/multi-process-mutex.d.ts.map +1 -0
- package/internal/util/multi-process-mutex.js +116 -0
- package/internal/util/multi-process-mutex.js.map +1 -0
- package/internal/util/report-telemetry-consent.js +3 -1
- package/internal/util/report-telemetry-consent.js.map +1 -1
- package/package.json +13 -11
- package/sample-projects/javascript/contracts/Lock.sol +1 -1
- package/sample-projects/javascript/hardhat.config.js +1 -1
- package/sample-projects/javascript-esm/contracts/Lock.sol +1 -1
- package/sample-projects/javascript-esm/hardhat.config.cjs +1 -1
- package/sample-projects/typescript/contracts/Lock.sol +1 -1
- package/sample-projects/typescript/hardhat.config.ts +1 -1
- package/sample-projects/typescript-viem/contracts/Lock.sol +1 -1
- package/sample-projects/typescript-viem/hardhat.config.ts +1 -1
- package/src/builtin-tasks/compile.ts +20 -2
- package/src/builtin-tasks/node.ts +8 -4
- package/src/internal/cli/analytics.ts +4 -1
- package/src/internal/cli/cli.ts +13 -1
- package/src/internal/cli/project-creation.ts +5 -10
- package/src/internal/cli/version-notifier.ts +268 -0
- package/src/internal/constants.ts +1 -0
- package/src/internal/core/config/config-loading.ts +2 -1
- package/src/internal/core/config/config-resolution.ts +20 -1
- package/src/internal/core/config/config-validation.ts +28 -2
- package/src/internal/core/config/default-config.ts +11 -0
- package/src/internal/core/jsonrpc/types/base-types.ts +12 -7
- package/src/internal/core/jsonrpc/types/input/callRequest.ts +3 -0
- package/src/internal/core/jsonrpc/types/input/transactionRequest.ts +5 -1
- package/src/internal/core/jsonrpc/types/output/block.ts +3 -0
- package/src/internal/core/providers/accounts.ts +24 -13
- package/src/internal/core/providers/gas-providers.ts +8 -0
- package/src/internal/core/providers/util.ts +2 -2
- package/src/internal/hardhat-network/jsonrpc/client.ts +7 -4
- package/src/internal/hardhat-network/provider/BlockchainData.ts +6 -6
- package/src/internal/hardhat-network/provider/HardhatBlockchain.ts +28 -3
- package/src/internal/hardhat-network/provider/TxPool.ts +19 -16
- package/src/internal/hardhat-network/provider/ethereumjs-workarounds.ts +4 -5
- package/src/internal/hardhat-network/provider/filter.ts +11 -8
- package/src/internal/hardhat-network/provider/fork/ForkBlockchain.ts +40 -7
- package/src/internal/hardhat-network/provider/fork/ForkStateManager.ts +79 -39
- package/src/internal/hardhat-network/provider/fork/rpcToBlockData.ts +3 -0
- package/src/internal/hardhat-network/provider/fork/rpcToTxData.ts +2 -2
- package/src/internal/hardhat-network/provider/modules/base.ts +5 -5
- package/src/internal/hardhat-network/provider/modules/eth.ts +40 -14
- package/src/internal/hardhat-network/provider/modules/logger.ts +17 -14
- package/src/internal/hardhat-network/provider/node-types.ts +19 -12
- package/src/internal/hardhat-network/provider/node.ts +210 -86
- package/src/internal/hardhat-network/provider/output.ts +35 -8
- package/src/internal/hardhat-network/provider/return-data.ts +6 -5
- package/src/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.ts +24 -25
- package/src/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.ts +24 -25
- package/src/internal/hardhat-network/provider/transactions/FakeSenderTransaction.ts +27 -16
- package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.ts +7 -8
- package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.ts +6 -5
- package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.ts +15 -8
- package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.ts +15 -8
- package/src/internal/hardhat-network/provider/types/HardhatBlockchainInterface.ts +4 -4
- package/src/internal/hardhat-network/provider/utils/makeAccount.ts +2 -2
- package/src/internal/hardhat-network/provider/utils/makeCommon.ts +9 -3
- package/src/internal/hardhat-network/provider/utils/makeFakeSignature.ts +21 -7
- package/src/internal/hardhat-network/provider/utils/makeStateTrie.ts +3 -3
- package/src/internal/hardhat-network/provider/utils/putGenesisBlock.ts +10 -5
- package/src/internal/hardhat-network/provider/utils/random.ts +5 -5
- package/src/internal/hardhat-network/stack-traces/consoleLogger.ts +13 -13
- package/src/internal/hardhat-network/stack-traces/constants.ts +1 -1
- package/src/internal/hardhat-network/stack-traces/contracts-identifier.ts +4 -4
- package/src/internal/hardhat-network/stack-traces/debug.ts +1 -1
- package/src/internal/hardhat-network/stack-traces/error-inferrer.ts +6 -5
- package/src/internal/hardhat-network/stack-traces/library-utils.ts +6 -6
- package/src/internal/hardhat-network/stack-traces/message-trace.ts +8 -8
- package/src/internal/hardhat-network/stack-traces/model.ts +5 -5
- package/src/internal/hardhat-network/stack-traces/panic-errors.ts +1 -1
- package/src/internal/hardhat-network/stack-traces/solidity-errors.ts +4 -2
- package/src/internal/hardhat-network/stack-traces/solidity-stack-trace.ts +2 -2
- package/src/internal/hardhat-network/stack-traces/solidityTracer.ts +3 -2
- package/src/internal/hardhat-network/stack-traces/vm-debug-tracer.ts +49 -38
- package/src/internal/hardhat-network/stack-traces/vm-tracer.ts +15 -13
- package/src/internal/sentry/transport.ts +1 -1
- package/src/internal/solidity/compiler/downloader.ts +5 -4
- package/src/internal/solidity/compiler/index.ts +22 -2
- package/src/internal/solidity/compiler/solc-info.ts +1 -0
- package/src/internal/util/abi-helpers.ts +2 -2
- package/src/internal/util/bigint.ts +4 -4
- package/src/internal/util/fs-utils.ts +1 -1
- package/src/internal/util/hardforks.ts +2 -0
- package/src/internal/util/keccak.ts +2 -2
- package/src/internal/util/multi-process-mutex.ts +133 -0
- package/src/internal/util/report-telemetry-consent.ts +4 -1
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import boxen from "boxen";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import fsExtra from "fs-extra";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
6
|
+
import semver from "semver";
|
|
7
|
+
|
|
8
|
+
import { getCacheDir } from "../util/global-dir";
|
|
9
|
+
import { getHardhatVersion } from "../util/packageInfo";
|
|
10
|
+
|
|
11
|
+
const GITHUB_API_URL = "https://api.github.com";
|
|
12
|
+
const GITHUB_OWNER = "NomicFoundation";
|
|
13
|
+
const GITHUB_REPO = "hardhat";
|
|
14
|
+
const V3_RELEASE_TAG = "hardhat@3.0.0";
|
|
15
|
+
const V3_RELEASE_VERSION_NOTIFIER_ASSET_NAME = "version-notifier-message.txt";
|
|
16
|
+
const V3_RELEASE_MAX_TIMES_SHOWN = 5;
|
|
17
|
+
const CURRENT_HARDHAT_MAJOR_VERSION = 2;
|
|
18
|
+
|
|
19
|
+
const boxenOptions = {
|
|
20
|
+
padding: 1,
|
|
21
|
+
borderStyle: "round",
|
|
22
|
+
borderColor: "yellow",
|
|
23
|
+
} as const;
|
|
24
|
+
|
|
25
|
+
interface VersionNotifierCache {
|
|
26
|
+
lastCheck: string | 0;
|
|
27
|
+
v3TimesShown: number;
|
|
28
|
+
v3Release?: Release;
|
|
29
|
+
v3ReleaseMessage?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
33
|
+
interface Release {
|
|
34
|
+
name: string;
|
|
35
|
+
tag_name: string;
|
|
36
|
+
draft: boolean;
|
|
37
|
+
prerelease: boolean;
|
|
38
|
+
published_at: string;
|
|
39
|
+
html_url: string;
|
|
40
|
+
assets: Array<{
|
|
41
|
+
name: string;
|
|
42
|
+
browser_download_url: string;
|
|
43
|
+
}>;
|
|
44
|
+
body: string; // release notes
|
|
45
|
+
}
|
|
46
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
47
|
+
|
|
48
|
+
export async function showNewVersionNotification() {
|
|
49
|
+
const cache = await readCache();
|
|
50
|
+
|
|
51
|
+
const lastCheckDate = new Date(cache.lastCheck);
|
|
52
|
+
const now = new Date();
|
|
53
|
+
const oneDay = 1000 * 60 * 60 * 24;
|
|
54
|
+
|
|
55
|
+
if (now.getTime() - lastCheckDate.getTime() < oneDay) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const hardhatVersion = getHardhatVersion();
|
|
60
|
+
|
|
61
|
+
const releases = await getReleases();
|
|
62
|
+
|
|
63
|
+
const sortedV2Versions = releases
|
|
64
|
+
// filter and map releases to versions
|
|
65
|
+
.flatMap((release) => {
|
|
66
|
+
const [packageName, rawPackageVersion] = release.tag_name.split("@");
|
|
67
|
+
|
|
68
|
+
const packageVersion = semver.valid(rawPackageVersion);
|
|
69
|
+
|
|
70
|
+
// filter out a release if:
|
|
71
|
+
// - it's not a hardhat-core release
|
|
72
|
+
// - it's a draft or a prerelease
|
|
73
|
+
// - the version is invalid
|
|
74
|
+
// - the major version is not the current major
|
|
75
|
+
if (
|
|
76
|
+
packageName !== GITHUB_REPO ||
|
|
77
|
+
release.draft ||
|
|
78
|
+
release.prerelease ||
|
|
79
|
+
packageVersion === null ||
|
|
80
|
+
semver.major(packageVersion) !== CURRENT_HARDHAT_MAJOR_VERSION
|
|
81
|
+
) {
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return [packageVersion];
|
|
86
|
+
})
|
|
87
|
+
// sort in descending order by version
|
|
88
|
+
.sort((releaseAVersion, releaseBVersion) => {
|
|
89
|
+
return semver.rcompare(releaseAVersion, releaseBVersion);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const latestV2Version: string | undefined = sortedV2Versions[0];
|
|
93
|
+
|
|
94
|
+
const v3Release = cache.v3Release ?? (await getV3Release());
|
|
95
|
+
|
|
96
|
+
if (latestV2Version === undefined && v3Release === undefined) {
|
|
97
|
+
// this should never happen unless the github api is down
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (
|
|
102
|
+
latestV2Version !== undefined &&
|
|
103
|
+
semver.gt(latestV2Version, hardhatVersion)
|
|
104
|
+
) {
|
|
105
|
+
let installationCommand = "npm install";
|
|
106
|
+
if (await fsExtra.pathExists("yarn.lock")) {
|
|
107
|
+
installationCommand = "yarn add";
|
|
108
|
+
} else if (await fsExtra.pathExists("pnpm-lock.yaml")) {
|
|
109
|
+
installationCommand = "pnpm install";
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
console.log(
|
|
113
|
+
boxen(
|
|
114
|
+
`New Hardhat release available! ${chalk.red(
|
|
115
|
+
hardhatVersion
|
|
116
|
+
)} -> ${chalk.green(latestV2Version)}.
|
|
117
|
+
|
|
118
|
+
Changelog: https://hardhat.org/release/${latestV2Version}
|
|
119
|
+
|
|
120
|
+
Run "${installationCommand} hardhat@latest" to update.`,
|
|
121
|
+
boxenOptions
|
|
122
|
+
)
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (
|
|
127
|
+
v3Release !== undefined &&
|
|
128
|
+
cache.v3TimesShown < V3_RELEASE_MAX_TIMES_SHOWN
|
|
129
|
+
) {
|
|
130
|
+
const releaseVersion = semver.valid(v3Release.tag_name.split("@")[1]);
|
|
131
|
+
|
|
132
|
+
if (releaseVersion !== null) {
|
|
133
|
+
cache.v3ReleaseMessage ??= await getV3ReleaseMessage(v3Release);
|
|
134
|
+
if (cache.v3ReleaseMessage !== undefined) {
|
|
135
|
+
console.log(boxen(cache.v3ReleaseMessage, boxenOptions));
|
|
136
|
+
cache.v3TimesShown++;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
await writeCache({
|
|
142
|
+
...cache,
|
|
143
|
+
lastCheck: now.toISOString(),
|
|
144
|
+
v3Release,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function readCache(): Promise<VersionNotifierCache> {
|
|
149
|
+
const cacheDir = await getCacheDir();
|
|
150
|
+
const versionNotifierCachePath = join(cacheDir, "version-notifier.json");
|
|
151
|
+
|
|
152
|
+
let cache: VersionNotifierCache = {
|
|
153
|
+
lastCheck: 0, // new Date(0) represents the unix epoch
|
|
154
|
+
v3TimesShown: 0,
|
|
155
|
+
};
|
|
156
|
+
try {
|
|
157
|
+
const fileContents = await readFile(versionNotifierCachePath, "utf-8");
|
|
158
|
+
const { lastCheck, v3TimesShown } = JSON.parse(fileContents);
|
|
159
|
+
|
|
160
|
+
cache = {
|
|
161
|
+
lastCheck: typeof lastCheck === "string" ? lastCheck : 0,
|
|
162
|
+
v3TimesShown: typeof v3TimesShown === "number" ? v3TimesShown : 0,
|
|
163
|
+
};
|
|
164
|
+
} catch (error: any) {
|
|
165
|
+
// We don't care if it fails
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return cache;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async function writeCache(cache: VersionNotifierCache) {
|
|
172
|
+
const cacheDir = await getCacheDir();
|
|
173
|
+
const versionNotifierCachePath = join(cacheDir, "version-notifier.json");
|
|
174
|
+
|
|
175
|
+
try {
|
|
176
|
+
await mkdir(cacheDir, { recursive: true });
|
|
177
|
+
await writeFile(versionNotifierCachePath, JSON.stringify(cache, null, 2));
|
|
178
|
+
} catch (error) {
|
|
179
|
+
// We don't care if it fails
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async function getReleases(): Promise<Release[]> {
|
|
184
|
+
const { request } = await import("undici");
|
|
185
|
+
let releases: Release[] = [];
|
|
186
|
+
|
|
187
|
+
try {
|
|
188
|
+
const githubResponse = await request(
|
|
189
|
+
`${GITHUB_API_URL}/repos/${GITHUB_OWNER}/${GITHUB_REPO}/releases`,
|
|
190
|
+
{
|
|
191
|
+
method: "GET",
|
|
192
|
+
headers: {
|
|
193
|
+
"User-Agent": "Hardhat",
|
|
194
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
195
|
+
},
|
|
196
|
+
query: {
|
|
197
|
+
per_page: 100,
|
|
198
|
+
},
|
|
199
|
+
}
|
|
200
|
+
);
|
|
201
|
+
releases = (await githubResponse.body.json()) as Release[];
|
|
202
|
+
} catch (error: any) {
|
|
203
|
+
// We don't care if it fails
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return releases;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
async function getV3Release(): Promise<Release | undefined> {
|
|
210
|
+
const { request } = await import("undici");
|
|
211
|
+
let v3Release: Release | undefined;
|
|
212
|
+
|
|
213
|
+
try {
|
|
214
|
+
const githubResponse = await request(
|
|
215
|
+
`${GITHUB_API_URL}/repos/${GITHUB_OWNER}/${GITHUB_REPO}/releases/tags/${V3_RELEASE_TAG}`,
|
|
216
|
+
{
|
|
217
|
+
method: "GET",
|
|
218
|
+
headers: {
|
|
219
|
+
"User-Agent": "Hardhat",
|
|
220
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
221
|
+
},
|
|
222
|
+
}
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
const jsonResponse = (await githubResponse.body.json()) as any;
|
|
226
|
+
if (jsonResponse.message === "Not Found") {
|
|
227
|
+
// eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error
|
|
228
|
+
throw new Error("Not Found");
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
v3Release = jsonResponse as Release;
|
|
232
|
+
} catch (error: any) {
|
|
233
|
+
// We don't care if it fails
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return v3Release;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
async function getV3ReleaseMessage(
|
|
240
|
+
v3Release: Release
|
|
241
|
+
): Promise<string | undefined> {
|
|
242
|
+
const { request } = await import("undici");
|
|
243
|
+
|
|
244
|
+
const versionNotifierAsset = v3Release.assets.find(
|
|
245
|
+
({ name }) => name === V3_RELEASE_VERSION_NOTIFIER_ASSET_NAME
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
if (versionNotifierAsset === undefined) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
let v3ReleaseMessage;
|
|
253
|
+
try {
|
|
254
|
+
const githubResponse = await request(
|
|
255
|
+
versionNotifierAsset.browser_download_url,
|
|
256
|
+
{
|
|
257
|
+
method: "GET",
|
|
258
|
+
maxRedirections: 10,
|
|
259
|
+
}
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
v3ReleaseMessage = await githubResponse.body.text();
|
|
263
|
+
} catch (error: any) {
|
|
264
|
+
// We don't care if it fails
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return v3ReleaseMessage;
|
|
268
|
+
}
|
|
@@ -20,7 +20,6 @@ import { getUserConfigPath } from "../project-structure";
|
|
|
20
20
|
|
|
21
21
|
import { SUPPORTED_SOLIDITY_VERSION_RANGE } from "../../hardhat-network/stack-traces/constants";
|
|
22
22
|
import { resolveConfig } from "./config-resolution";
|
|
23
|
-
import { validateConfig, validateResolvedConfig } from "./config-validation";
|
|
24
23
|
import { DEFAULT_SOLC_VERSION } from "./default-config";
|
|
25
24
|
|
|
26
25
|
const log = debug("hardhat:core:config");
|
|
@@ -68,6 +67,8 @@ export function loadConfigAndTasks(
|
|
|
68
67
|
showSolidityConfigWarnings: false,
|
|
69
68
|
}
|
|
70
69
|
): { resolvedConfig: HardhatConfig; userConfig: HardhatUserConfig } {
|
|
70
|
+
const { validateConfig, validateResolvedConfig } =
|
|
71
|
+
require("./config-validation") as typeof import("./config-validation");
|
|
71
72
|
let configPath =
|
|
72
73
|
hardhatArguments !== undefined ? hardhatArguments.config : undefined;
|
|
73
74
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { LoDashStatic } from "lodash";
|
|
2
|
+
|
|
2
3
|
import path from "path";
|
|
3
4
|
import semver from "semver";
|
|
4
5
|
|
|
@@ -62,6 +63,7 @@ export function resolveConfig(
|
|
|
62
63
|
userConfigPath: string,
|
|
63
64
|
userConfig: HardhatUserConfig
|
|
64
65
|
): HardhatConfig {
|
|
66
|
+
const cloneDeep = require("lodash/cloneDeep") as LoDashStatic["cloneDeep"];
|
|
65
67
|
userConfig = cloneDeep(userConfig);
|
|
66
68
|
|
|
67
69
|
return {
|
|
@@ -77,6 +79,7 @@ export function resolveConfig(
|
|
|
77
79
|
function resolveNetworksConfig(
|
|
78
80
|
networksConfig: NetworksUserConfig = {}
|
|
79
81
|
): NetworksConfig {
|
|
82
|
+
const cloneDeep = require("lodash/cloneDeep") as LoDashStatic["cloneDeep"];
|
|
80
83
|
const hardhatNetworkConfig = networksConfig[HARDHAT_NETWORK_NAME];
|
|
81
84
|
|
|
82
85
|
const localhostNetworkConfig =
|
|
@@ -128,6 +131,7 @@ function normalizeHexString(str: string): string {
|
|
|
128
131
|
function resolveHardhatNetworkConfig(
|
|
129
132
|
hardhatNetworkConfig: HardhatNetworkUserConfig = {}
|
|
130
133
|
): HardhatNetworkConfig {
|
|
134
|
+
const cloneDeep = require("lodash/cloneDeep") as LoDashStatic["cloneDeep"];
|
|
131
135
|
const clonedDefaultHardhatNetworkParams = cloneDeep(
|
|
132
136
|
defaultHardhatNetworkParams
|
|
133
137
|
);
|
|
@@ -234,6 +238,19 @@ function resolveHardhatNetworkConfig(
|
|
|
234
238
|
delete config.initialBaseFeePerGas;
|
|
235
239
|
}
|
|
236
240
|
|
|
241
|
+
if (
|
|
242
|
+
hardhatNetworkConfig.enableTransientStorage === true &&
|
|
243
|
+
hardhatNetworkConfig.hardfork === undefined
|
|
244
|
+
) {
|
|
245
|
+
config.hardfork = "cancun";
|
|
246
|
+
}
|
|
247
|
+
if (
|
|
248
|
+
hardhatNetworkConfig.enableTransientStorage === false &&
|
|
249
|
+
hardhatNetworkConfig.hardfork === undefined
|
|
250
|
+
) {
|
|
251
|
+
config.hardfork = "shanghai";
|
|
252
|
+
}
|
|
253
|
+
|
|
237
254
|
return config;
|
|
238
255
|
}
|
|
239
256
|
|
|
@@ -246,6 +263,7 @@ function isHdAccountsConfig(
|
|
|
246
263
|
function resolveHttpNetworkConfig(
|
|
247
264
|
networkConfig: HttpNetworkUserConfig
|
|
248
265
|
): HttpNetworkConfig {
|
|
266
|
+
const cloneDeep = require("lodash/cloneDeep") as LoDashStatic["cloneDeep"];
|
|
249
267
|
const accounts: HttpNetworkAccountsConfig =
|
|
250
268
|
networkConfig.accounts === undefined
|
|
251
269
|
? defaultHttpNetworkParams.accounts
|
|
@@ -427,6 +445,7 @@ function resolveCompiler(compiler: SolcUserConfig): SolcConfig {
|
|
|
427
445
|
}
|
|
428
446
|
|
|
429
447
|
function resolveMochaConfig(userConfig: HardhatUserConfig): Mocha.MochaOptions {
|
|
448
|
+
const cloneDeep = require("lodash/cloneDeep") as LoDashStatic["cloneDeep"];
|
|
430
449
|
return {
|
|
431
450
|
...cloneDeep(defaultMochaOptions),
|
|
432
451
|
...userConfig.mocha,
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import type { HardhatConfig as HardhatConfigT } from "../../../types";
|
|
2
|
+
import type {
|
|
3
|
+
Context,
|
|
4
|
+
ValidationError,
|
|
5
|
+
getFunctionName as getFunctionNameT,
|
|
6
|
+
} from "io-ts/lib";
|
|
7
|
+
import type { Reporter } from "io-ts/lib/Reporter";
|
|
2
8
|
|
|
3
9
|
import * as t from "io-ts";
|
|
4
|
-
import { Context, getFunctionName, ValidationError } from "io-ts/lib";
|
|
5
|
-
import { Reporter } from "io-ts/lib/Reporter";
|
|
6
10
|
|
|
7
11
|
import {
|
|
8
12
|
HARDHAT_MEMPOOL_SUPPORTED_ORDERS,
|
|
@@ -19,6 +23,9 @@ import { defaultHardhatNetworkParams } from "./default-config";
|
|
|
19
23
|
|
|
20
24
|
function stringify(v: any): string {
|
|
21
25
|
if (typeof v === "function") {
|
|
26
|
+
const { getFunctionName } = require("io-ts/lib") as {
|
|
27
|
+
getFunctionName: typeof getFunctionNameT;
|
|
28
|
+
};
|
|
22
29
|
return getFunctionName(v);
|
|
23
30
|
}
|
|
24
31
|
if (typeof v === "number" && !isFinite(v)) {
|
|
@@ -491,6 +498,25 @@ export function getValidationErrors(config: any): string[] {
|
|
|
491
498
|
}
|
|
492
499
|
});
|
|
493
500
|
}
|
|
501
|
+
|
|
502
|
+
if (hardhatNetwork.hardfork !== undefined) {
|
|
503
|
+
if (
|
|
504
|
+
!hardforkGte(hardhatNetwork.hardfork, HardforkName.CANCUN) &&
|
|
505
|
+
hardhatNetwork.enableTransientStorage === true
|
|
506
|
+
) {
|
|
507
|
+
errors.push(
|
|
508
|
+
`'enableTransientStorage' cannot be enabled if the hardfork is explicitly set to a pre-cancun value. If you want to use transient storage, use 'cancun' as the hardfork.`
|
|
509
|
+
);
|
|
510
|
+
}
|
|
511
|
+
if (
|
|
512
|
+
hardforkGte(hardhatNetwork.hardfork, HardforkName.CANCUN) &&
|
|
513
|
+
hardhatNetwork.enableTransientStorage === false
|
|
514
|
+
) {
|
|
515
|
+
errors.push(
|
|
516
|
+
`'enableTransientStorage' cannot be disabled if the hardfork is explicitly set to cancun or later. If you want to disable transient storage, use a hardfork before 'cancun'.`
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
494
520
|
}
|
|
495
521
|
|
|
496
522
|
for (const [networkName, netConfig] of Object.entries<any>(
|
|
@@ -129,6 +129,17 @@ export const defaultHardhatNetworkParams: Omit<
|
|
|
129
129
|
]),
|
|
130
130
|
},
|
|
131
131
|
],
|
|
132
|
+
[
|
|
133
|
+
11155111, // sepolia
|
|
134
|
+
{
|
|
135
|
+
hardforkHistory: new Map([
|
|
136
|
+
[HardforkName.GRAY_GLACIER, 0],
|
|
137
|
+
[HardforkName.MERGE, 1_450_409],
|
|
138
|
+
[HardforkName.SHANGHAI, 2_990_908],
|
|
139
|
+
[HardforkName.CANCUN, 5_187_023],
|
|
140
|
+
]),
|
|
141
|
+
},
|
|
142
|
+
],
|
|
132
143
|
]),
|
|
133
144
|
};
|
|
134
145
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
-
bufferToHex,
|
|
2
|
+
bytesToHex as bufferToHex,
|
|
3
3
|
isValidAddress,
|
|
4
|
-
|
|
4
|
+
toBytes,
|
|
5
5
|
} from "@nomicfoundation/ethereumjs-util";
|
|
6
6
|
import * as t from "io-ts";
|
|
7
7
|
|
|
@@ -22,14 +22,16 @@ export const rpcQuantity = new t.Type<bigint>(
|
|
|
22
22
|
export const rpcData = new t.Type<Buffer>(
|
|
23
23
|
"DATA",
|
|
24
24
|
Buffer.isBuffer,
|
|
25
|
-
(u, c) =>
|
|
25
|
+
(u, c) =>
|
|
26
|
+
isRpcDataString(u) ? t.success(Buffer.from(toBytes(u))) : t.failure(u, c),
|
|
26
27
|
t.identity
|
|
27
28
|
);
|
|
28
29
|
|
|
29
30
|
export const rpcHash = new t.Type<Buffer>(
|
|
30
31
|
"HASH",
|
|
31
32
|
(v): v is Buffer => Buffer.isBuffer(v) && v.length === HASH_LENGTH_BYTES,
|
|
32
|
-
(u, c) =>
|
|
33
|
+
(u, c) =>
|
|
34
|
+
isRpcHashString(u) ? t.success(Buffer.from(toBytes(u))) : t.failure(u, c),
|
|
33
35
|
t.identity
|
|
34
36
|
);
|
|
35
37
|
|
|
@@ -96,7 +98,10 @@ function validateStorageSlot(u: unknown, c: t.Context): t.Validation<bigint> {
|
|
|
96
98
|
export const rpcAddress = new t.Type<Buffer>(
|
|
97
99
|
"ADDRESS",
|
|
98
100
|
(v): v is Buffer => Buffer.isBuffer(v) && v.length === ADDRESS_LENGTH_BYTES,
|
|
99
|
-
(u, c) =>
|
|
101
|
+
(u, c) =>
|
|
102
|
+
isRpcAddressString(u)
|
|
103
|
+
? t.success(Buffer.from(toBytes(u)))
|
|
104
|
+
: t.failure(u, c),
|
|
100
105
|
t.identity
|
|
101
106
|
);
|
|
102
107
|
|
|
@@ -173,7 +178,7 @@ export function rpcDataToBigInt(data: string): bigint {
|
|
|
173
178
|
}
|
|
174
179
|
|
|
175
180
|
export function bufferToRpcData(
|
|
176
|
-
buffer:
|
|
181
|
+
buffer: Uint8Array,
|
|
177
182
|
padToBytes: number = 0
|
|
178
183
|
): string {
|
|
179
184
|
let s = bufferToHex(buffer);
|
|
@@ -191,7 +196,7 @@ export function rpcDataToBuffer(data: string): Buffer {
|
|
|
191
196
|
});
|
|
192
197
|
}
|
|
193
198
|
|
|
194
|
-
return
|
|
199
|
+
return Buffer.from(toBytes(data));
|
|
195
200
|
}
|
|
196
201
|
|
|
197
202
|
// Type guards
|
|
@@ -5,6 +5,7 @@ import { rpcAccessList } from "../access-list";
|
|
|
5
5
|
import {
|
|
6
6
|
rpcAddress,
|
|
7
7
|
rpcData,
|
|
8
|
+
rpcHash,
|
|
8
9
|
rpcQuantity,
|
|
9
10
|
rpcStorageSlot,
|
|
10
11
|
rpcStorageSlotHexString,
|
|
@@ -23,6 +24,8 @@ export const rpcCallRequest = t.type(
|
|
|
23
24
|
accessList: optionalOrNullable(rpcAccessList),
|
|
24
25
|
maxFeePerGas: optionalOrNullable(rpcQuantity),
|
|
25
26
|
maxPriorityFeePerGas: optionalOrNullable(rpcQuantity),
|
|
27
|
+
blobs: optionalOrNullable(t.array(rpcData)),
|
|
28
|
+
blobVersionedHashes: optionalOrNullable(t.array(rpcHash)),
|
|
26
29
|
},
|
|
27
30
|
"RpcCallRequest"
|
|
28
31
|
);
|
|
@@ -2,7 +2,7 @@ import * as t from "io-ts";
|
|
|
2
2
|
|
|
3
3
|
import { optionalOrNullable } from "../../../../util/io-ts";
|
|
4
4
|
import { rpcAccessList } from "../access-list";
|
|
5
|
-
import { rpcAddress, rpcData, rpcQuantity } from "../base-types";
|
|
5
|
+
import { rpcAddress, rpcData, rpcHash, rpcQuantity } from "../base-types";
|
|
6
6
|
|
|
7
7
|
// Type used by eth_sendTransaction
|
|
8
8
|
export const rpcTransactionRequest = t.type(
|
|
@@ -18,6 +18,8 @@ export const rpcTransactionRequest = t.type(
|
|
|
18
18
|
chainId: optionalOrNullable(rpcQuantity),
|
|
19
19
|
maxFeePerGas: optionalOrNullable(rpcQuantity),
|
|
20
20
|
maxPriorityFeePerGas: optionalOrNullable(rpcQuantity),
|
|
21
|
+
blobs: optionalOrNullable(t.array(rpcData)),
|
|
22
|
+
blobVersionedHashes: optionalOrNullable(t.array(rpcHash)),
|
|
21
23
|
},
|
|
22
24
|
"RpcTransactionRequest"
|
|
23
25
|
);
|
|
@@ -38,6 +40,8 @@ export interface RpcTransactionRequestInput {
|
|
|
38
40
|
}>;
|
|
39
41
|
maxFeePerGas?: string;
|
|
40
42
|
maxPriorityFeePerGas?: string;
|
|
43
|
+
blobs?: string[];
|
|
44
|
+
blobVersionedHashes?: string[];
|
|
41
45
|
}
|
|
42
46
|
|
|
43
47
|
export type RpcTransactionRequest = t.TypeOf<typeof rpcTransactionRequest>;
|
|
@@ -38,6 +38,9 @@ const baseBlockResponse = {
|
|
|
38
38
|
baseFeePerGas: optional(rpcQuantity),
|
|
39
39
|
withdrawals: optional(t.array(rpcWithdrawalItem)),
|
|
40
40
|
withdrawalsRoot: optional(rpcHash),
|
|
41
|
+
parentBeaconBlockRoot: optional(rpcHash),
|
|
42
|
+
blobGasUsed: optional(rpcQuantity),
|
|
43
|
+
excessBlobGas: optional(rpcQuantity),
|
|
41
44
|
};
|
|
42
45
|
|
|
43
46
|
export type RpcBlock = t.TypeOf<typeof rpcBlock>;
|
|
@@ -43,8 +43,13 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
public async request(args: RequestArguments): Promise<unknown> {
|
|
46
|
-
const {
|
|
47
|
-
|
|
46
|
+
const {
|
|
47
|
+
ecsign,
|
|
48
|
+
hashPersonalMessage,
|
|
49
|
+
toRpcSig,
|
|
50
|
+
toBytes,
|
|
51
|
+
bytesToHex: bufferToHex,
|
|
52
|
+
} = await import("@nomicfoundation/ethereumjs-util");
|
|
48
53
|
|
|
49
54
|
if (
|
|
50
55
|
args.method === "eth_accounts" ||
|
|
@@ -65,7 +70,7 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
|
|
|
65
70
|
}
|
|
66
71
|
|
|
67
72
|
const privateKey = this._getPrivateKeyForAddress(address);
|
|
68
|
-
const messageHash = hashPersonalMessage(
|
|
73
|
+
const messageHash = hashPersonalMessage(toBytes(data));
|
|
69
74
|
const signature = ecsign(messageHash, privateKey);
|
|
70
75
|
return toRpcSig(signature.v, signature.r, signature.s);
|
|
71
76
|
}
|
|
@@ -84,7 +89,7 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
|
|
|
84
89
|
}
|
|
85
90
|
|
|
86
91
|
const privateKey = this._getPrivateKeyForAddress(address);
|
|
87
|
-
const messageHash = hashPersonalMessage(
|
|
92
|
+
const messageHash = hashPersonalMessage(toBytes(data));
|
|
88
93
|
const signature = ecsign(messageHash, privateKey);
|
|
89
94
|
return toRpcSig(signature.v, signature.r, signature.s);
|
|
90
95
|
}
|
|
@@ -189,13 +194,13 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
|
|
|
189
194
|
|
|
190
195
|
private _initializePrivateKeys(localAccountsHexPrivateKeys: string[]) {
|
|
191
196
|
const {
|
|
192
|
-
bufferToHex,
|
|
193
|
-
|
|
197
|
+
bytesToHex: bufferToHex,
|
|
198
|
+
toBytes,
|
|
194
199
|
privateToAddress,
|
|
195
200
|
} = require("@nomicfoundation/ethereumjs-util");
|
|
196
201
|
|
|
197
202
|
const privateKeys: Buffer[] = localAccountsHexPrivateKeys.map((h) =>
|
|
198
|
-
|
|
203
|
+
toBytes(h)
|
|
199
204
|
);
|
|
200
205
|
|
|
201
206
|
for (const pk of privateKeys) {
|
|
@@ -205,7 +210,9 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
|
|
|
205
210
|
}
|
|
206
211
|
|
|
207
212
|
private _getPrivateKeyForAddress(address: Buffer): Buffer {
|
|
208
|
-
const {
|
|
213
|
+
const {
|
|
214
|
+
bytesToHex: bufferToHex,
|
|
215
|
+
} = require("@nomicfoundation/ethereumjs-util");
|
|
209
216
|
const pk = this._addressToPrivateKey.get(bufferToHex(address));
|
|
210
217
|
if (pk === undefined) {
|
|
211
218
|
throw new HardhatError(ERRORS.NETWORK.NOT_LOCAL_ACCOUNT, {
|
|
@@ -225,7 +232,9 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
|
|
|
225
232
|
}
|
|
226
233
|
|
|
227
234
|
private async _getNonce(address: Buffer): Promise<bigint> {
|
|
228
|
-
const { bufferToHex } = await import(
|
|
235
|
+
const { bytesToHex: bufferToHex } = await import(
|
|
236
|
+
"@nomicfoundation/ethereumjs-util"
|
|
237
|
+
);
|
|
229
238
|
|
|
230
239
|
const response = (await this._wrappedProvider.request({
|
|
231
240
|
method: "eth_getTransactionCount",
|
|
@@ -239,8 +248,8 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
|
|
|
239
248
|
transactionRequest: RpcTransactionRequest,
|
|
240
249
|
chainId: number,
|
|
241
250
|
privateKey: Buffer
|
|
242
|
-
): Promise<
|
|
243
|
-
const { AccessListEIP2930Transaction,
|
|
251
|
+
): Promise<Uint8Array> {
|
|
252
|
+
const { AccessListEIP2930Transaction, LegacyTransaction } = await import(
|
|
244
253
|
"@nomicfoundation/ethereumjs-tx"
|
|
245
254
|
);
|
|
246
255
|
|
|
@@ -282,7 +291,7 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
|
|
|
282
291
|
{ common }
|
|
283
292
|
);
|
|
284
293
|
} else {
|
|
285
|
-
transaction =
|
|
294
|
+
transaction = LegacyTransaction.fromTxData(txData, { common });
|
|
286
295
|
}
|
|
287
296
|
|
|
288
297
|
const signedTransaction = transaction.sign(privateKey);
|
|
@@ -311,7 +320,9 @@ export class HDWalletProvider extends LocalAccountsProvider {
|
|
|
311
320
|
passphrase
|
|
312
321
|
);
|
|
313
322
|
|
|
314
|
-
const {
|
|
323
|
+
const {
|
|
324
|
+
bytesToHex: bufferToHex,
|
|
325
|
+
} = require("@nomicfoundation/ethereumjs-util");
|
|
315
326
|
const privateKeysAsHex = privateKeys.map((pk) => bufferToHex(pk));
|
|
316
327
|
super(provider, privateKeysAsHex);
|
|
317
328
|
}
|
|
@@ -273,6 +273,14 @@ export class AutomaticGasPriceProvider extends ProviderWrapper {
|
|
|
273
273
|
}
|
|
274
274
|
}
|
|
275
275
|
|
|
276
|
+
// If after all of these we still have a 0 wei maxPriorityFeePerGas, we
|
|
277
|
+
// use 1 wei. This is to improve the UX of the automatic gas price
|
|
278
|
+
// on chains that are very empty (i.e local testnets). This will be very
|
|
279
|
+
// unlikely to trigger on a live chain.
|
|
280
|
+
if (maxPriorityFeePerGas === 0n) {
|
|
281
|
+
maxPriorityFeePerGas = 1n;
|
|
282
|
+
}
|
|
283
|
+
|
|
276
284
|
return {
|
|
277
285
|
// Each block increases the base fee by 1/8 at most, when full.
|
|
278
286
|
// We have the next block's base fee, so we compute a cap for the
|
|
@@ -53,7 +53,7 @@ export function normalizeHardhatNetworkAccountsConfig(
|
|
|
53
53
|
return accountsConfig;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
const {
|
|
56
|
+
const { bytesToHex } = require("@nomicfoundation/ethereumjs-util");
|
|
57
57
|
|
|
58
58
|
return derivePrivateKeys(
|
|
59
59
|
accountsConfig.mnemonic,
|
|
@@ -62,7 +62,7 @@ export function normalizeHardhatNetworkAccountsConfig(
|
|
|
62
62
|
accountsConfig.count,
|
|
63
63
|
accountsConfig.passphrase
|
|
64
64
|
).map((pk) => ({
|
|
65
|
-
privateKey:
|
|
65
|
+
privateKey: bytesToHex(pk),
|
|
66
66
|
balance: accountsConfig.accountsBalance ?? DEFAULT_HARDHAT_NETWORK_BALANCE,
|
|
67
67
|
}));
|
|
68
68
|
}
|